セッション単位でロールを有効化・無効化する方法

この記事ではセッション単位でロールを有効化・無効化する方法について解説します。

 セッション単位でロールを有効化・無効化する方法

特定のユーザに対して権限を付与したい場合にロールを使用する場合が多いと思います。

その中で普段は権限は付与したくないのだが、特定のスクリプトを実行する場合のみに権限を付与したいという場面があるかもしれません。

その場合はSET ROLEコマンドを使用してセッション単位でロールを有効化、無効化することができます。


 設定例

ユーザ「roletest」に対して普段はロール「role1」を付与しておき、セッション単位でロール「role2」を有効化する設定を行います。

まずはユーザに対してロールを付与します。

SQL> grant role1 to roletest;
Grant succeeded.
SQL> grant role2 to roletest;
Grant succeeded.

付与したロールを確認します。

SQL> SELECT GRANTEE, GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE 
FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'ROLETEST';
GRANTEE  GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
-------- ------------ ------------ ------------
ROLETEST ROLE2	      NO	   YES
ROLETEST ROLE1	      NO	   YES

ROLE1、ROLE2が付与されました。

この中で「DEFAULT_ROLE」の値がYESの場合はデフォルトでこのロールを保持します。

NOの場合はSET ROLEコマンドを使用することによってロールの保持が有効となります。

今回の例では「role2」は普段はオフにしておきたいので、「role1」のみをデフォルトロールに設定します。

SQL> alter user roletest default role role1;
User altered. SQL> SELECT GRANTEE, GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'ROLETEST'; GRANTEE  GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE -------- ------------ ------------ ------------ ROLETEST ROLE2       NO    NO ROLETEST ROLE1       NO    YES

これによって通常時は「role1」のみが「roletest」ユーザに対して付与されます。

「roletest」ユーザで接続し、現在のセッションのロールを確認します。

SQL> select * from session_roles;
ROLE
-----
ROLE1

次にセッション単位で「role2」を有効化します。

SET ROLEコマンドを使用して「role2」を有効化します。

SQL> set role role2;
Role set.
SQL> select * from session_roles;
ROLE
-----
ROLE2

「role2」が有効化されました。

この際にデフォルトロールである「role1」は無効化されるので注意が必要です。

「role1」も有効化したままにしたい場合は「role1」もあわせて有効化する必要があります。

SQL> set role role1, role2;
Role set.
SQL> select * from session_roles;
ROLE
-----
ROLE1
ROLE2
再接続するとデフォルトロールである「role1」が付与された状態に戻ります。