※本記事は 2022/02/26 時点のものです
はじめに
Oracle Database を使用するにあたり、
「ユーザ名やパスワードは間違っていないはずなのに Oracle Database にログインできない」
という事を時々聞きます。
今回は「ユーザ名を小文字で作成してしまって Oracle Database にログインできない」
というパターンの内容について詳細に書いています。
Oracle Database の命名規則
まずは Oracle Database のオブジェクト(ユーザも含む)の命名規則を確認してみます。
マニュアルには下記のように書かれています。
※下記は 21c のマニュアルですが、19c のマニュアルにも同じことが書かれています。
データベース・オブジェクトのネーミング規則
https://docs.oracle.com/cd/F39414_01/sqlrf/Database-Object-Names-and-Qualifiers.html#GUID-75337742-67FD-4EC0-985F-741C93D918DA
すべてのデータベース・オブジェクトには、名前があります。SQL文では、引用識別子または非引用識別子を使用して、オブジェクトの名前を表します。
・引用符付きの識別子は、先頭と末尾に二重引用符(“)を付けます。引用符付きの識別子を使用してスキーマ・オブジェクトを命名した場合は、そのオブジェクトを参照するときに必ず二重引用符を使用する必要があります。
・引用符なしの識別子は記号で囲みません。
「引用識別子または非引用識別子」が何なのか分かりにくいのですが、
英語では「quoted identifier または nonquoted identifier」と書かれています。
単純に考えると「 ” で囲まれているもの」と「 ” で囲まれていないもの」…ですかね。
続いて下記も記載されています。
7.非引用識別子には、データベース文字セットの英数字、アンダースコア(_)、ドル記号($)およびシャープ記号(#)のみ含めることができます。データベース・リンクの名前には、ピリオド(.)とアットマーク(@)を含めることもできます。非引用識別子では、$と#はできるだけ使用しないでください。
引用識別子には、すべての文字、句読点および空白を使用できます。ただし、二重引用符またはnull文字(\0)は、引用符付きまたは引用符なしのどちらの識別子にも使用できません。
よって、使用可能な文字は次の通りです。
引用識別子(“で囲んだもの):二重引用符またはnull文字(\0)を除くすべての文字
非引用識別子(“で囲んでいないもの):データベース文字セットの英数字、_、$、#
更に、下記も記載されています。
9.引用符なしの識別子では大文字と小文字が区別されません。引用符のない識別子は大文字として解析されます。引用符付きの識別子では大文字と小文字が区別されます。
非引用識別子(“で囲んでいないもの)は大文字として解析される、がポイントですね。
検証
実際にsqlplusコマンドからユーザの作成を行ってみます。
※検証環境は以前のブログで書いた Windows の XE 21c を使っています。
下記のように、ユーザを4つ作成してみます。パスワードは適当です。
SQL> CREATE USER TEST1 IDENTIFIED BY 00000000;
ユーザーが作成されました。
SQL> CREATE USER "TEST2" IDENTIFIED BY 00000000;
ユーザーが作成されました。
SQL> CREATE USER test3 IDENTIFIED BY 00000000;
ユーザーが作成されました。
SQL> CREATE USER "test4" IDENTIFIED BY 00000000;
ユーザーが作成されました。
SQL>
作成したユーザを確認してみます。
SQL> SELECT USERNAME FROM DBA_USERS ORDER BY USERNAME;
USERNAME
--------------------------------------------------------------------------------
ANONYMOUS
APPQOSSYS
~~中略~~
SYSRAC
SYSTEM
TEST1
TEST2
TEST3
WMSYS
XDB
XS$NULL
test4
41行が選択されました。
SQL>
結果から、
1、2、3番目は TEST1、TEST2、TEST3 と大文字で登録されており、
4番目の test4 のみが小文字で登録されています。
試しに TEST3 と test4 で大文字/小文字、ダブルクォート(“)無し/有りで接続確認してみると次のようになります。
※接続にあたっては”CREATE SESSION”権限を与えていますので
SQL> connect TEST3/00000000@localhost:1521/xepdb1
接続されました。
SQL> connect "TEST3"/00000000@localhost:1521/xepdb1
接続されました。
SQL> connect test3/00000000@localhost:1521/xepdb1
接続されました。
SQL> connect "test3"/00000000@localhost:1521/xepdb1
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
警告: Oracleにはもう接続されていません。
SQL>
SQL> connect TEST4/00000000@localhost:1521/xepdb1
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
SQL> connect "TEST4"/00000000@localhost:1521/xepdb1
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
SQL> connect test4/00000000@localhost:1521/xepdb1
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
SQL> connect "test4"/00000000@localhost:1521/xepdb1
接続されました。
SQL>
上記のように、
大文字で登録された TEST3 は “test3″でのログインのみ失敗しますが、
小文字で登録された test4 は “test4″のみ成功して他は全て失敗する、という事になります。
よって、登録された名前が小文字の場合は接続時にダブルクォート(“)で囲むことが必要になる…というところです。
検証 (SQL Developer)
時々聞くのが、SQL Developerでユーザを作成したパターンです。
ここでは test5 というユーザを作成してみます。
SQL Developerでユーザを作成するときに小文字を入力していると、内部的には
CREATE USER “test5” IDENTIFIED BY “00000000”;
のように小文字で作成される形になっているようです。
そのため、ユーザ作成後にsqlplus等で接続する際には
ユーザ名をダブルクォート(“)で囲む必要があります。
SQL> connect TEST5/00000000@localhost:1521/xepdb1
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
SQL> connect "test5"/00000000@localhost:1521/xepdb1
接続されました。
SQL>
また、SQL Developerで接続するときもダブルクォート(“)で囲む必要があります。
作成するときはダブルクォート(“)を付けていなかったのに接続するときはダブルクォート(“)が必要となるようです…要注意ですね。
さいごに
Oracle Database を使用していて、わりと
「ユーザ名やパスワードは間違っていないはずなのに Oracle Database へログインできない」
という話を聞くので、今回の記事を書いてみました。
今回はユーザ名について書きましたが、
パスワードに関してもログインに悩むことがあるので別途書こうと思っています。
DBへの接続ができず、悩んでいる人が少しでも減ることを願っておりますー。