いつでも初心

自分が初学時に困った技術ネタを中心に。

GRANT ~ WITH GRANT OPTIONの実験

【環境】
 ・Oracle Database 19c Enterprise Edition Release 19.0.0.0.0


GRANT文はユーザー(またはロール)に権限を付与することができますが、
WITH GRANT OPTIONを付け外しした際にどのような動きをするのか、
ちょっと試してみました。
なお基本説明は極力省きますので、記述が足りない部分は公式ドキュメントや
他の方のブログなどで確認してください。

ユーザー等の準備

ユーザー内容
datauserテーブルとデータを持ったユーザー
gruser_xcreate sessionのみ付与されたユーザー
gruser_ycreate 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