GRANT ~ WITH GRANT OPTIONの実験
【環境】
・Oracle Database 19c Enterprise Edition Release 19.0.0.0.0
GRANT文はユーザー(またはロール)に権限を付与することができますが、
WITH GRANT OPTIONを付け外しした際にどのような動きをするのか、
ちょっと試してみました。
なお基本説明は極力省きますので、記述が足りない部分は公式ドキュメントや
他の方のブログなどで確認してください。
ユーザー等の準備
ユーザー | 内容 |
---|---|
datauser | テーブルとデータを持ったユーザー |
gruser_x | create sessionのみ付与されたユーザー |
gruser_y | create sessionのみ付与されたユーザー |
SQL> sho user ユーザーは"SYS"です。 SQL> CREATE USER datauser IDENTIFIED BY tiger; ユーザーが作成されました。 SQL> GRANT create session TO datauser; 権限付与が成功しました。 SQL> CREATE TABLE datauser.tbl0(no number(1)); 表が作成されました。 SQL> ALTER USER datauser QUOTA 1m ON users; ユーザーが変更されました。 SQL> INSERT ALL 2 INTO datauser.tbl0(no) VALUES (1) 3 INTO datauser.tbl0(no) VALUES (2) 4 INTO datauser.tbl0(no) VALUES (3) 5 SELECT * FROM dual; 3行が作成されました。 SQL> COMMIT; コミットが完了しました。 SQL> CREATE USER gruser_x IDENTIFIED BY tiger; ユーザーが作成されました。 SQL> CREATE USER gruser_y IDENTIFIED BY tiger; ユーザーが作成されました。 SQL> GRANT create session TO gruser_x; 権限付与が成功しました。 SQL> GRANT create session TO gruser_y; 権限付与が成功しました。
オブジェクト権限の付与
オブジェクト権限は「select」、対象は「datauserのtbl0」とします。
WITH GRANT OPTION付きのGRANTを試してみましょう。
SQL> sho user ユーザーは"SYS"です。 SQL> GRANT select ON datauser.tbl0 TO gruser_x WITH GRANT OPTION; 権限付与が成功しました。
gruser_xにselect権限が付与されたため、gruser_xは
datauserのtbl0を参照できます。
加えてWITH GRANT OPTION 付きであるため、gruser_xはgruser_yに対して
datauserのtbl0のselect権限を付与することができます。
SQL> CONN gruser_x/tiger@pdb1 接続されました。 SQL> SELECT * FROM datauser.tbl0; NO ---------- 1 2 3 SQL> GRANT select ON datauser.tbl0 TO gruser_y; 権限付与が成功しました。 SQL> CONN gruser_y/tiger@pdb1 接続されました。 SQL> SELECT * FROM datauser.tbl0; NO ---------- 1 2 3
ちなみにWITH GRANT OPTIONがないと、他ユーザーへ付与できません。
SQL> CONN gruser_x/tiger@pdb1 接続されました。 SQL> GRANT select ON datauser.tbl0 TO gruser_y; GRANT select ON datauser.tbl0 TO gruser_y * 行1でエラーが発生しました。: ORA-01031: 権限が不足しています
オブジェクト権限の剥奪
gruser_xは他ユーザーへ権限を付与できたわけですが、
もし付与権限を剥奪されたら、gruser_yに付与した権限はどうなるのでしょう?
SQL> sho user ユーザーは"SYS"です。 SQL> REVOKE select ON datauser.tbl0 FROM gruser_x; 取消しが成功しました。
SQL> CONN gruser_y/tiger@pdb1 接続されました。 SQL> SELECT * FROM datauser.tbl0; SELECT * FROM datauser.tbl0 * 行1でエラーが発生しました。: ORA-00942: 表またはビューが存在しません。
gruser_xの権限が剥奪されたことにより、
gruser_yもtbl0が参照できなくなりました。
【関連記事】
tmts.hatenablog.jp