このサイトにはプロモーションが含まれます

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

やんやん

プログラマーとしてLEMP環境に主に生息しており、DevOps 的な立ち回りをしながらご飯を食べている当ブログの管理人のやんやんと申します。
最近はTmux使うのを辞めました。

 

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

権限付与が出来なかった原因は、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でフォローしよう

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