Contents
問題
ローカルユーザーに権限付与を実行すると「ユーザーがいません」というエラーが出力されます。
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.