Oracle Database における権限管理の体系整理
はじめに
Oracle Master SQL Silver の学習を進める中で、
管理ユーザーや権限まわりの違い(SYS / SYSTEM / スキーマなど)が少しわかりにくかったので、
自分なりに整理してまとめました。
特に「SYSユーザーとSYSTEMユーザーの違い」や「WITH ADMIN OPTION / GRANT OPTION」など、
試験でも実務でも混同しやすい部分を中心に解説します。
SYS ユーザーとSYSTEMユーザーの違い
SYS ユーザー
DBを作成した瞬間に自動生成される。
データベースの最高管理者である。→何でもできるユーザである。
sqlplus sys/●●●●●●●●●● as sysdba
データ・ディクショナリ(テーブル構造、ユーザー、インデックスなど)を含むオブジェクトを全て所有。
SQL> SELECT GRANTEE, GRANTED_ROLE
FROM DBA_ROLE_PRIVS
W 2 3 WHERE GRANTEE = 'SYS'
ORDER BY 2;
4
GRANTEE
--------------------------------------------------------------------------------
GRANTED_ROLE
--------------------------------------------------------------------------------
SYS
ACCHK_READ
SYS
ADM_PARALLEL_EXECUTE_TASK
SYS
APPLICATION_TRACE_VIEWER
GRANTEE
--------------------------------------------------------------------------------
GRANTED_ROLE
--------------------------------------------------------------------------------
SYS
AQ_ADMINISTRATOR_ROLE
SYS
AQ_USER_ROLE
SYS
AUDIT_ADMIN
GRANTEE
--------------------------------------------------------------------------------
GRANTED_ROLE
--------------------------------------------------------------------------------
SYS
AUDIT_VIEWER
```省略
SYS
XS_NAMESPACE_ADMIN
SYS
XS_SESSION_ADMIN
75 rows selected.
SYSTEM ユーザー
一般的なSQLやスクリプトの実行、ユーザー作成、ロールの付与などの日常管理作業に使用可能。
SQL> select grantee, privilege from dba_sys_privs where grantee='SYSTEM';
GRANTE PRIVILEGE
------ ----------------------------------------
SYSTEM DEQUEUE ANY QUEUE
SYSTEM ENQUEUE ANY QUEUE
SYSTEM MANAGE ANY QUEUE
SYSTEM GLOBAL QUERY REWRITE
SYSTEM CREATE MATERIALIZED VIEW
SYSTEM SELECT ANY TABLE
SYSTEM CREATE TABLE
SYSTEM UNLIMITED TABLESPACE
8 rows selected.
参考
スキーマについて
ユーザーごとに所有しているオブジェクトの箱を「スキーマ」と呼びます。
他ユーザーのオブジェクトへのアクセス方法
. スキーマ名を明示してアクセスする
他のユーザーが所有する表やビューなどのオブジェクトを参照する場合は、
「スキーマ名.オブジェクト名」 の形式で指定します。
SELECT * FROM user2.t1;
状況 | 実行SQL | 備考 |
---|---|---|
自分のスキーマ内の表を参照 | SELECT * FROM t1; |
スキーマ名省略可 |
他のユーザーの表を参照 | SELECT * FROM user2.t1; |
スキーマ名必須 + 権限必要 |
システム権限とオブジェクト権限
Oracleデータベースのユーザーが操作を実行するためには、それぞれの操作に対応した権限が必要です。
oracleの権限はシステム権限とオブジェクト権限の2種類に分かれています。
項目 | システム権限 | オブジェクト権限 |
---|---|---|
対象 | データベース全体 | 他のユーザーが所有する特定のオブジェクトに対して、どのような操作をするか |
例 | CREATE USER, CREATE TABLE | SELECT, INSERT, UPDATE, DELETE |
主な目的 | システム管理操作を許可 | データ操作を許可 |
システム権限とオブジェクト権限の一覧
権限の付与について
権限をユーザーに付与するにはGRANT文を使用します。
システム権限を付与する
GRANT システム権限 [, システム権限, …]
TO ユーザー名 [, ユーザー名, …]
[WITH ADMIN OPTION];
部分 | 意味 |
---|---|
GRANT | 権限を付与するキーワード |
システム権限 | 付与したいシステム権限(例:CREATE SESSION , CREATE TABLE など) |
TO ユーザー名 | 権限を与える相手(ユーザー名またはロール名) |
WITH ADMIN OPTION | そのユーザーが、さらに他のユーザーに同じ権限を再付与できるようにするオプション(任意) |
オブジェクト権限を付与する
GRANT 権限 [, 権限, …]
ON オブジェクト名
TO ユーザー名 [, ユーザー名, …]
[WITH GRANT OPTION];
部分 | 意味 |
---|---|
GRANT | 権限を付与するキーワード |
権限 | 付与したいオブジェクト権限(SELECT , INSERT , UPDATE , DELETE など) |
ON オブジェクト名 | 権限を与える対象(例:テーブル名・ビュー名など) |
TO ユーザー名 | 権限を与えるユーザーまたはロール |
WITH GRANT OPTION | そのユーザーが、他のユーザーにも同じ権限を再付与できるようにするオプション(任意) |
ユーザーが付与またはユーザに付与されたオブジェクト権限はUSER_TAB_PRIVSデータ・ディクショナリ・ビューで確認できます。
SQL> SELECT grantor, owner, table_name, privilege, grantable
FROM user_tab_privs;
2
GRANTOR
--------------------------------------------------------------------------------
OWNER
--------------------------------------------------------------------------------
TABLE_NAME
--------------------------------------------------------------------------------
PRIVILEGE GRA
---------------------------------------- ---
PINGT
PINGT
DEPARTMENTS
SELECT YES
OWNER | TABLE_NAME | PRIVILEGE |
---|---|---|
PINGT | DEPARTMENTS | SELECT |
※システム権限の場合
SELECT * FROM USER_SYS_PRIVS;
USERNAME PRIVILEGE ADMIN_OPTION
---------- ------------------- -------------
TEST CREATE SESSION NO
TEST SELECT ANY TABLE YES
列名 | 意味 |
---|---|
USERNAME |
権限を持っているユーザー名 |
PRIVILEGE |
システム権限名(例:CREATE SESSION, SELECT ANY TABLE など) |
ADMIN_OPTION |
WITH ADMIN OPTION が付与されているか(YES/NO) |
権限の取消について
システム権限の取り消し
REVOKE 権限名 [, 権限名, …] FROM ユーザー名 [, ユーザー名, …];
例:システム権限を取り消す
たとえば、pingt に付与した CREATE TABLE 権限を取り消すなら:
REVOKE CREATE TABLE FROM pingt;
オブジェクト権限の取り消し
REVOKE 権限名 [, 権限名, …] ON オブジェクト名 FROM ユーザー名 [, ユーザー名, …];
例:オブジェクト権限を取り消す
pingt が test に対して
departments テーブルに与えているSELECT権限
を取り消すには:
REVOKE SELECT ON departments FROM test;
WITH ADMIN OPTION で再付与された権限は独立して残る
システム権限を WITH ADMIN OPTION 付きで付与した場合、
権限を与えられたユーザー(1人目)が他のユーザーに同じ権限を再付与することができます。
このとき、もし1人目のユーザーからシステム権限を取り消しても、
1人目が他のユーザーに再付与したシステム権限は取り消されません。
つまり、WITH ADMIN OPTION で再付与された権限は独立して存在するため、
連鎖的に削除されることはありません。
■SYSTEMユーザー
SQL> GRANT SELECT ANY TABLE TO test WITH ADMIN OPTION;
権限付与が成功しました。
■TESTユーザー
SQL> show user
ユーザーは"TEST"です。
SQL> SELECT privilege, admin_option FROM user_sys_privs;
PRIVILEGE ADM
--------------------- ---
SELECT ANY TABLE YES
CREATE SESSION NO
SQL> GRANT SELECT ANY TABLE TO test2 WITH ADMIN OPTION;
権限付与が成功しました。
■SYSTEMユーザー
SQL> REVOKE SELECT ANY TABLE FROM test;
取消しが成功しました。
■TESTユーザー
SQL> SELECT privilege, admin_option FROM user_sys_privs;
PRIVILEGE ADM
--------------------- ---
CREATE SESSION NO
-- ← SELECT ANY TABLE権限は削除された
■TEST2ユーザー
SQL> SELECT privilege, admin_option FROM user_sys_privs;
PRIVILEGE ADM
--------------------- ---
CREATE SESSION NO
SELECT ANY TABLE YES
-- ← TESTユーザーから付与された権限は削除されない
WITH GRANT OPTION:再付与された権限も連鎖的に削除される
オブジェクト権限を WITH GRANT OPTION 付きで付与した場合、
上位ユーザーの権限を取り消すと、
そのユーザーから再付与された下位ユーザーの権限も自動的に取り消される。
■PINGTユーザー
SQL> GRANT SELECT ON departments TO test WITH GRANT OPTION;
権限付与が成功しました。
■TESTユーザー
SQL> show user
ユーザーは"TEST"です。
SQL> SELECT grantor, owner, table_name, privilege, grantable FROM user_tab_privs;
GRANTOR OWNER TABLE_NAME PRIVILEGE GRA
-------- ------- ------------ ---------- ---
PINGT PINGT DEPARTMENTS SELECT YES
SQL> GRANT SELECT ON pingt.departments TO test2 WITH GRANT OPTION;
権限付与が成功しました。
■TEST2ユーザー
SQL> show user
ユーザーは"TEST2"です。
SQL> SELECT grantor, owner, table_name, privilege, grantable FROM user_tab_privs;
GRANTOR OWNER TABLE_NAME PRIVILEGE GRA
-------- ------- ------------ ---------- ---
TEST PINGT DEPARTMENTS SELECT YES
■PINGTユーザー
SQL> REVOKE SELECT ON departments FROM test;
取消しが成功しました。
■TESTユーザー
SQL> SELECT grantor, owner, table_name, privilege, grantable FROM user_tab_privs;
-- TESTユーザーから付与されたSELECT権限は削除された
(結果なし)
■TEST2ユーザー
SQL> SELECT grantor, owner, table_name, privilege, grantable FROM user_tab_privs;
-- TESTユーザーから付与されたSELECT権限も同時に削除された
(結果なし)
Discussion