Oracleの権限付与でハマった話(PDBとCDB)

問題

ローカルユーザーに権限付与を実行すると「ユーザーがいません」というエラーが出力されます。

SYSTEMユーザーでログインしているので権限付与が出来ない訳が無いのですが、思いもよらないところに落とし穴がありました。

SQL> GRANT CREATE SEQUENCE TO usr1;
GRANT CREATE SEQUENCE TO usr1
                         *
ERROR at line 1:
ORA-01917: user or role 'USR1' does not exist

権限付与が出来なかった原因

権限付与が出来なかった原因は、PDBとCDBというOracle独自のマルチテナント構造が原因でした。

CDBが基盤となるDBとなり、その上にPDBと呼ばれるDBが存在するという奇妙な構造となっています。(Dockerのようにコンテナの上にイメージを作成するような感じです)

マルチテナント構造

今回、SYSTEMユーザーはCDBに接続しており、権限付与されるUSR1ユーザーはPDBに接続していました。

CDB上にいるSYSTEMユーザーからPDB上にいるUSR1ユーザーに権限が付与は出来ないため、SYSTEMユーザーをPDBに接続する必要があります。

SYSTEMユーザーの接続先をPDBに切り替えることで権限付与の実行が可能になりました!

解決法

以下手順で解決できます。

①権限付与側のユーザーの接続先の確認

--SYSTEMユーザーの接続先確認
SQL> show con_name 

CON_NAME
------------------------------
CDB$ROOT

 

②権限付与される側のユーザーの接続先の確認

--USR1の接続先確認
SQL> show con_name   

CON_NAME
------------------------------
ORCLPDB1

 

③権限付与側のユーザーの接続先DB切り替え

--USR1が接続しているDBに切り替え
SQL> alter session set container = orclPDB1;

Session altered.

 

④GRANT文の発行

--SYSTEMユーザー権限付与
SQL> GRANT CREATE SEQUENCE TO usr1;

Grant succeeded.

SQL> commit;

Commit complete.

 

 

Twitterでフォローしよう

読んでみーな
おすすめの記事