COL: CSS:



権限とロール

DB ユーザ・アカウント権限とロール

権限とロール

Oracle Database での権限は,以下の 2 種類ある。

システム権限
データベースへの特定操作の許可する権限
オブジェクト権限
特定のオブジェクト操作の許可する権限

権限は複数のユーザに割り当てることが可能で,複数の権限を同一ユーザに割り当てることもできる。

複数のユーザに対し複数の権限を個々に付与すると,権限を変更しなくてはならない場合に管理が大変になる。そこで “ロール” と呼ばれる,権限をグループ化したセットを利用して管理することが好ましい。

/* ex1: ロールを使ったユーザへの権限付与 */

┌ ロール a ┐
|          |───→ ユーザ α
| 権限 001 |
| 権限 002 |───→ ユーザ β
| 権限 003 |
|          |───→ ユーザ γ
└─────┘

権限 "001" ~ "003" のセット (ロール "a") をユーザ "α" ~ "γ" へ付与
* 上記例にて,ユーザ "α" ~ "γ" に付与された権限 "002" のみ削除したい場合,
  ロール a から権限 "002" を削除すれば良く,個々のユーザから権限を削除する手間がない。

システム権限

ユーザを作成したりテーブルを作成したり,データベースに対する特定の操作を実行可能にするための権限。

システム権限を付与する構文は以下の通り。

/* ex1: システム権限の付与 */

GRANT 権限名
   TO {  user          ← ユーザ 'user' に対して付与
       | PUBLIC        ← 全ユーザに対して付与
       | role }        ← ロール 'role' に対して付与
[WITH ADMIN OPTION]
    └← 権限付与されたユーザが,その権限を他のユーザへ付与可能にするオプション
         * SYS / SYSTEM スキーマのシステム権限には WITH ADMIN OPTION が付与されている

権限名に “ANY” が付いているものは,データベースに存在する他のスキーマに対しても権限を利用できる。

ex2: CREATE TABLE / CREATE ANY TABLE システム権限
システム権限名詳細
CREATE TABLE付与された自身のスキーマ内にテーブルを作成することのできる権限
CREATE ANY TABLE付与された自身のスキーマを含む,他のスキーマ内にもテーブルを作成することができる権限

オブジェクト権限

他のスキーマ内に存在するオブジェクトにアクセスするためには,そのオブジェクトにアクセスするための権限を要する。

自身のスキーマ内のオブジェクトに対しては,オブジェクト権限なしで全てのオブジェクトにアクセスできる。他のスキーマ内に存在するオブジェクトにアクセスするためには,以下のどちらかの権限が必要になる。

  • “ANY” が付いたシステム権限
  • 他のユーザから付与されたオブジェクト権限

オブジェクト権限を付与する構文は以下の通り。

/* ex1: システム権限の付与 */

GRANT {  権限名
       | ALL }           ← 対象オブジェクトへ,全権限付与
   ON オブジェクト名     ← 対象のオブジェクト
   TO { user
       | PUBLIC
       | role }
[WITH GRANT OPTION]
    └← 権限付与されたユーザが,その権限を他のユーザへ付与可能にするオプション

INSERT / UPDATE / REFERENCES オブジェクト権限では,対象オブジェクトの特定の列に限定した権限を付与することもできる。

/* ex2: 特定の列に限定したオブジェクト権限付与 */

GRANT select, update(id)   ← update は id 列のみ操作する権限を付与する
   ON custom               ← アクセス権限を与えるオブジェクト "custom"
   TO mike;                ← スキーマ "mike" に付与する

ロール

ロールは,システム権限 / オブジェクト権限 / 他のロールを含めることができる。ロールに別のロールを内包させることで,権限を階層化して管理できる利点がある。

/* ex1: ロールの構成例 */

┌ ロール a ──────────────────┐
|                      ┌ ロール b ─────┐|
|     システム権限 aa  |    システム権限 aaa||
|     システム権限 bb  |オブジェクト権限 bbb||
| オブジェクト権限 cc  |オブジェクト権限 ccc||
|                      └──────────┘|
└───────────────────────┘
       └← ロール "a" 内部に,別のロール "b" を内包できる

ユーザ・セッション確立後に付与されたシステム権限とオブジェクト権限は,使用中のセッションに反映されない。しかしロールを付与した場合は,そのロールに含まれる権限 / ロールを即座に反映できる。

/* ex1: ロール作成の構文 */

     CREATE ROLE ロール名
[IDENTIFIED {  BY  パスワード        ┐
             | EXTERNALLY            ┼← パスワードを設定できる
             | GLOBALLY AS 外部名    ┘
            }];
/* ex2: ロールへの権限付与 */

GRANT create table    ← "create table" システム権限
   TO foo;            ← ロール "foo" に付与

デフォルト・ロールを設定しておくと,ログイン時に自動でそのロールのみ有効となる。また SET ROLE 文で一時的な有効化 / 無効化が可能※ デフォルト・ロールを設定したユーザに付与されている他のロールは,全て無効設定になる。必要なときだけ SET ROLE 文で明示的に有効化して利用できるようになる

/* ex3: デフォルト・ロール設定の構文 */

  ALTER USER mike     ← ユーザ "mike" の設定変更
DEFAULT ROLE foo;     ← ロール "foo" をデフォルトに設定
/* ex4: ロールの有効化 */

     SET ROLE bar         ← ロール "bar" を有効化する
IDENTIFIED BY orarole;    ← パスワードが設定されている場合,パスワード入力