Oracleのロールにはデフォルトロールと非デフォルトロールがあり、デフォルトロールは通常使用できますが、非デフォルトロールは明示的に有効化しない限りは使用できません。

SQL> CREATE ROLE test_role1;

ロールが作成されました。

SQL> GRANT create session TO test_role1;

権限付与が成功しました。

SQL> CREATE ROLE test_role2;

ロールが作成されました。

SQL> GRANT select ON hr.regions TO test_role2;

権限付与が成功しました。


create session権限を持つ、test_role1ロール
オブジェクト権限を持つ、test_role2ロール
この2つのロールを作成しました。

SQL> GRANT test_role1 TO suzuki;

権限付与が成功しました。

SQL> GRANT test_role2 TO suzuki;

権限付与が成功しました。


作成した2つのロールをsuzukiユーザーに付与しました。
この状態では、test_role1、test_role2ともに利用できます。

SQL> ALTER USER suzuki DEFAULT ROLE test_role1;

ユーザーが変更されました。


ただし、デフォルトロールを明示的に指定すると、残りのロールは非デフォルトロールになり、利用できなくなります。

SQL> CONNECT suzuki/oracle

接続されました。

SQL> SELECT * FROM hr.regions;

SELECT * FROM hr.regions
                 *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


オブジェクト権限である、test_role2が有効でないことを確認しています。

SQL> SET ROLE test_role2;

ロールが設定されました。

非デフォルトロールを有効化するにはSET ROLE~を指定します。

SQL> SELECT * FROM hr.regions;

 REGION_ID REGION_NAME
---------- ---------------------------------------------------------------------------
         1 EURO
         2 AsiaB
         3 Asia
         4 Middle East and Africa


非デフォルトロールが有効化され、参照できなかった表が参照できるようになりました。