🦣

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.

参考
https://docs.oracle.com/cd/E57425_01/121/ADMQS/GUID-CF1CD853-AF15-41EC-BC80-61918C73FDB5.htm

スキーマについて

ユーザーごとに所有しているオブジェクトの箱を「スキーマ」と呼びます。

他ユーザーのオブジェクトへのアクセス方法

. スキーマ名を明示してアクセスする

他のユーザーが所有する表やビューなどのオブジェクトを参照する場合は、
「スキーマ名.オブジェクト名」 の形式で指定します。

SELECT * FROM user2.t1;
状況 実行SQL 備考
自分のスキーマ内の表を参照 SELECT * FROM t1; スキーマ名省略可
他のユーザーの表を参照 SELECT * FROM user2.t1; スキーマ名必須 + 権限必要

システム権限とオブジェクト権限

Oracleデータベースのユーザーが操作を実行するためには、それぞれの操作に対応した権限が必要です。
oracleの権限はシステム権限とオブジェクト権限の2種類に分かれています。

項目 システム権限 オブジェクト権限
対象 データベース全体 他のユーザーが所有する特定のオブジェクトに対して、どのような操作をするか
CREATE USER, CREATE TABLE SELECT, INSERT, UPDATE, DELETE
主な目的 システム管理操作を許可 データ操作を許可

システム権限とオブジェクト権限の一覧

https://docs.oracle.com/cd/E16338_01/timesten.112/b66446/privileges.htm#BABECGGB

権限の付与について

権限をユーザーに付与するには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