第14章
ロール
ロール = 複数の権限(例:SELECT ANY TABLE、UPDATE 権限など)を ひとまとめにして名前をつけたもの。
ユーザーに直接権限を1個ずつ付ける代わりに、ロールを付与すればまとめて権限を渡せる。
誰がロールを作成・付与できるか
ロールの作成や付与・取消は、データベース管理者(DBA)または CREATE ROLE システム権限 を持つユーザーが行える。
ロールは「スキーマ・オブジェクト」ではない
通常、表やビューなどは「スキーマ・オブジェクト」で、作成者のスキーマに属する(例:SCOTT.TABLE1)。
しかしロールはそうではなく、システム全体で共有されるオブジェクト。
ユーザーと同じく、データベース全体で一意の名前を持つ。
だから作成者に依存しない。
同じ名前のロールは作れない理由
ロールはデータベース全体で一意の名前が必要。
例えば ROLE1 というロールがすでに存在するなら、他のユーザーが ROLE1 を作ろうとしてもエラーになる。
これはテーブルのように「同じ名前でもスキーマが違えばOK」というわけではない。
GRANT CREATE USER TO pingt;
GRANT SELECT ON dba_users TO pingt;
GRANT CREATE USER TO pingt;
意味
ユーザー pingt に CREATE USER システム権限 を付与します。
これにより pingt は、新しいユーザーアカウントを作成できるようになります。
GRANT SELECT ON dba_users TO pingt;
意味
ユーザー pingt に、dba_users ビューを SELECT(参照)する権限 を与えます。
REVOKE CREATE TABLE FROM PUBLIC;
システム権限を取消す場合は、REVOKE文を使用。
システム権限を付与する場合は、GRANT文を使用。
GRANT システム権限 TO {ユーザー名 | PUBLIC} [WITH ADMIN OPTION];
※PUBLICは全てのユーザーです。
※WITH ADMIN OPTION句を指定すると、システム権限を付与されたユーザーが他のユーザーに対してシステム権限を付与できるようになる。
ロールの概要
- ロールとは、複数のシステム権限やオブジェクト権限をひとまとめにして名前を付けたもの。
- ユーザーに権限を1つずつ付与する代わりに、ロールを付与することで効率的に管理できる。
- ロールの内容(権限追加・削除)を変更すると、そのロールを持つすべてのユーザーに即時反映される。
- ロールには、システム権限、オブジェクト権限、他のロールを含められる。
- ロールを付与されたユーザーは、そのロールに含まれる全ての権限を利用できる。
PUBLIC に付与した権限は、「全ユーザーに一括で付与した」のと同じ意味です。
Oracle では、PUBLIC への付与は 個別のユーザーごとに切り離せません。
つまり、PUBLIC から権限を取り消さない限り、どのユーザーにもその権限が届いてしまいます。
オブジェクト権限に関する説明
- オブジェクトの種類によって付与できる権限が異なる
- WITH GRANT OPTION句で、付与された権限を他のユーザーに付与できる
- オブジェクトの所有者はオブジェクト権限が付与されていなくてもオブジェクトを参照できる
USER_SYS_PRIVS
ユーザーに付与されているシステム権限を確認できるデータ・ディクショナリ・ビュー
CREATE USER ユーザー名 IDENTIFIED BY パスワード;
1. PINGTユーザーとして実行
GRANT SELECT ON departments TO test WITH GRANT OPTION;
2. TESTユーザーとして実行
GRANT SELECT ON pingt.departments TO test2 WITH GRANT OPTION;
3. PINGTユーザーとして実行
REVOKE SELECT ON departments FROM test;
GRANT SELECT ON departments TO test WITH GRANT OPTION;
意味
- PINGT は表 departments の所有者。
- TEST に departments 表の SELECT権限 を与える。
- さらに WITH GRANT OPTION を付けているので、TEST はこの権限を 他のユーザーに再付与できるようになる。
GRANT SELECT ON pingt.departments TO test2 WITH GRANT OPTION;
- TEST は「付与された権限」を他人に与えることができる(1でWITH GRANT OPTIONを付けてもらったから)。
- ここで TEST2 にも departments 表の SELECT 権限を与える。
- さらに WITH GRANT OPTION を付けているので、理論上は TEST2 もまた他のユーザーに付与できる。
REVOKE SELECT ON departments FROM test;
意味
元の所有者(PINGT)が、TEST に与えた権限を取り消す。
このとき 「TESTが他人に再付与した権限」もすべて連鎖的に消える。
なぜ TEST2 の権限も消えるのか?
- TEST2 が持っていた権限の出どころは「TEST 経由」。
つまり TEST2 は 「TESTが権限を持っている限り」しか有効でない。 - 元の所有者である PINGT が TEST から権限をREVOKEした瞬間、TESTの持っていた権限は消え、その下流の TEST2 も自動的に権限を失う。
この仕組みを 「カスケードリボーク (Cascading Revoke)」 と呼びます。
1. SYSTEMユーザーとして実行
GRANT SELECT ANY TABLE TO test WITH ADMIN OPTION;
2. TESTユーザーとして実行
GRANT SELECT ANY TABLE TO test2 WITH ADMIN OPTION;
3. SYSTEMユーザーとして実行
REVOKE SELECT ANY TABLE FROM test;
GRANT SELECT ANY TABLE TO test WITH ADMIN OPTION;
意味
- TEST にシステム権限 SELECT ANY TABLE(どのスキーマの表でもSELECTできる強い権限)を与える。
- さらに WITH ADMIN OPTION なので、TEST はこの権限を他のユーザーに再付与したり取り消したりできる。
GRANT SELECT ANY TABLE TO test2 WITH ADMIN OPTION;
TEST が持っている権限(WITH ADMIN OPTION付き)を TEST2 に再付与する。
この時点で TEST2 も SELECT ANY TABLE を持ち、さらに他人に再配布できる状態になる。
REVOKE SELECT ANY TABLE FROM test;
SYSTEM が TEST に与えた権限を取り消す。
ここで重要な違い
- オブジェクト権限 (例: SELECT ON pingt.departments)
→ REVOKE すると 下流に再付与された権限もカスケード的に消える(カスケードリボーク)。 - システム権限 (例: SELECT ANY TABLE)
→ REVOKE しても、TEST がすでに他のユーザーに付与した権限は残る。
なぜかというと、
- オブジェクト権限は「所有者 → 付与 → 再付与」という“鎖”のような関係で追跡される。
- 一方、システム権限は「データベース全体で一意の権限」であり、付与した履歴は独立して保持されるため、再付与分はカスケード削除されない。
ロールの付与
ユーザーにロールを付与したり、ロールに権限や他のロールを付与するにはGRANT文を使用します。
- ユーザーにロールを付与
GRANT ロール名 TO {ユーザー名 | PUBLIC} [WITH ADMIN OPTION];
※PUBLICは全てのユーザーです。
※WITH ADMIN OPTION句を指定すると、ロールを付与されたユーザーが他のユーザーに対してロールを付与、取消しできるようになります。
- ロールにシステム権限を付与
GRANT システム権限 TO ロール名 [WITH ADMIN OPTION];
- ロールにオブジェクト権限を付与
GRANT {オブジェクト権限 | ALL} ON オブジェクト名 TO ロール名;
- ロールに他のロールを付与(ロールAをロールBに付与)
GRANT ロールA TO ロールB [WITH ADMIN OPTION];
なお、1つのGRANT文でシステム権限とロールを同時に付与できます。オブジェクト権限とロールは同時に付与できません。
GRANT ロール名, システム権限 TO {ユーザー名 | PUBLIC | 他のロール名} [WITH ADMIN OPTION];
ロールの取消し
複数のロールや個別の権限によって同じ権限が付与されていても、権限を取消す際には、明示的に指定したものしか取消せません。例えば、下の図のPINGTユーザーからCREATE SESSION権限を取消すと、個別に付与されているCREATE SESSION権限は取消せますが、ロールBに含まれているCREATE SESSION権限はそのまま残ります。
ロールの取消しはREVOKE文を使用します。
- ユーザーや他のロールからロールを取消し
REVOKE ロール FROM {ユーザー名 | PUBLIC | 他のロール名};
既存のロール
データベースを作成すると、いくつかのロールが自動的に作成されます。
自動的に作成される主なロールは次のとおりです。
- CONNECT:データベースに接続するためのシステム権限であるCREATE SESSION権限が含まれるロール
- RESOURCE:CREATE TABLE権限やCREATE CLUSTER権限など、オブジェクトを作成するシステム権限を含む開発者向けロール
- DBA:ユーザーの作成や権限の付与などほとんどの管理機能を実行できる管理者向けロール。デフォルトでSYSユーザーとSYSTEMユーザーに付与されている
- SELECT_CATALOG_ROLE:データ・ディクショナリ・ビューに対するSELECT権限が付与される


