##はじめに##
「Oracleの基本」という書籍で勉強した時に、書籍の手順通りに進めても、
新しく作成したuserで接続できなかったので、その時の調べたことを記載します。
12c以降での仕様です。
##行う事##
・学習用に新しくユーザーを作成する。
・作成したユーザーで接続する。
##エラー内容##
・ユーザー作成しようとした場合
行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です
・作成したユーザーで接続しようとした場合
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
##原因##
・インスタンスには1つのCDBと、その下にPDBと呼ばれる子DB(複数作成可)がある。
CDB(コンテナ・データベース)、PDB(プラガブル・データベース)
・ローカルユーザーはPDBに作成する必要がある。
・PDBは必ず、リスナー経由で接続する必要がある。
##解決方法##
####ユーザー作成####
新しくユーザーを作成しようと
CREATE USER test IDENTIFIED BY Pass123;
を実行しました。すると..
行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です
と表示されました。
これは、新しいユーザーをCDBに作成しようとしたからです。
現在接続しているデータベースを確認します。
SQL> show con_name
CON_NAME
-----------------------
CDB$ROOT
CDBに接続している事がわかります。
次に、PDBの名前と現在のOPEN_MODEを確認します。
SQL> select name,open_mode from v$pdbs;
NAME OPEN_MODE
-----------------------------------
PDB$SEED READ ONLY
ORCLPDB MOUNTED
pdbが「MOUNTED」で起動していないので、起動します。
SQL> alter pluggable database orclpdb open;
プラガブル・データベースが変更されました。
確認すると...
SQL> select name,open_mode from v$pdbs;
NAME OPEN_MODE
-----------------------------------
PDB$SEED READ ONLY
ORCLPDB READ WRITE
起動できていることが確認できました。
次は、PDBに接続しなおします。
alter session set container=orclpdb;
セッションが変更されました。
もう一度、現在接続しているデータベースを確認します。
SQL> show con_name
CON_NAME
-----------------------
ORCLPDB
PDBに接続できています。
この状態でユーザーを作成すると...
SQL> CREATE USER test IDENTIFIED BY Pass123;
ユーザーが作成されました。
無事ユーザーを作成することができました。
####作成したユーザーで接続####
書籍通り、作成したユーザーに権限を付与します。
SQL> grant create session to test;
権限付与が成功しました。
SQL> grant resource to test;
権限付与が成功しました。
SQL> grant unlimited tablespace to test;
権限付与が成功しました。
その後、接続しようとすると...
SQL> connect test/Pass123
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
拒否されてしまいます。
これは、PDBは必ず、リスナー経由で接続する必要があるからです。
@をつけれ接続してみます。
SQL> connect test/Pass123@orclpdb
ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
接続できませんでした。
調べたところ、tnsnames.oraを編集して、定義する必要があるみたいです。
tnsnames.oraを開きます。(Oracleホーム下のnetwork\adminにありました)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
の下に今回使うPDBの定義を追加して以下のようにします。
上記のものをコピーして、サービス名と接続文字列のみ変更しました。
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ORCLPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclpdb)
)
)
そして、もう一度接続してみます。
SQL> connect test/Pass123@orclpdb
接続されました。
無事に接続することができました。
##おわりに##
解決のためには、CDBとPDBという概念の理解をする事が必要でした。
PDBやCDBというキーワードを入れて検索しないと簡単に記事にたどりつけなかったので、
同じようにエラーにつまづいた人の参考になれば幸いです。
##参考記事##
https://www.dbsheetclient.jp/blog/?p=1566
https://www.projectgroup.info/documents/Oracle/ORA-120005.html
https://kenko-keep.com/pdb-ora-01017/
https://www.shift-the-oracle.com/oracle-net/tnsnames.html