Oracleデータベースでユーザーに付与されている権限を確認するSQLを解説します。
Oracleにはシステム権限、ロール、オブジェクト権限の3種類の権限があります。この記事では、それぞれの確認用SQLと実行結果の見方、自分自身の権限を確認する方法、DBA権限がない場合の確認方法まで解説します。
Oracleの権限の種類
まず、Oracleの権限体系を整理します。
| 種類 | 内容 | 例 |
|---|---|---|
| システム権限 | データベース全体に対する操作権限 | CREATE TABLE, CREATE SESSION |
| ロール | 複数の権限をまとめたもの | CONNECT, RESOURCE, DBA |
| オブジェクト権限 | 特定のテーブル・ビュー等への操作権限 | SELECT on EMPLOYEES |
システム権限を確認する(DBA_SYS_PRIVS)
ユーザーに直接付与されているシステム権限を確認するには、DBA_SYS_PRIVS を使います。
SELECT grantee, privilege, admin_option FROM dba_sys_privs WHERE grantee = 'SCOTT' ORDER BY privilege;
実行結果の例:
| GRANTEE | PRIVILEGE | ADMIN_OPTION |
|---|---|---|
| SCOTT | CREATE SESSION | NO |
| SCOTT | CREATE TABLE | NO |
| SCOTT | UNLIMITED TABLESPACE | NO |
各カラムの意味
| カラム | 意味 |
|---|---|
GRANTEE |
権限が付与されているユーザー名 |
PRIVILEGE |
付与されているシステム権限の名前 |
ADMIN_OPTION |
YES = 他のユーザーにもこの権限を付与できる |
ロール(付与されたロール)を確認する(DBA_ROLE_PRIVS)
ユーザーに付与されているロールを確認するには、DBA_ROLE_PRIVS を使います。
SELECT grantee, granted_role, admin_option, default_role FROM dba_role_privs WHERE grantee = 'SCOTT' ORDER BY granted_role;
実行結果の例:
| GRANTEE | GRANTED_ROLE | ADMIN_OPTION | DEFAULT_ROLE |
|---|---|---|---|
| SCOTT | CONNECT | NO | YES |
| SCOTT | RESOURCE | NO | YES |
DEFAULT_ROLE が YES のロールは、ログイン時に自動で有効になります。
ロールに含まれるシステム権限を確認する
ロールの中にどのシステム権限が含まれているかを確認するには、ROLE_SYS_PRIVS を使います。
-- CONNECT ロールに含まれるシステム権限 SELECT role, privilege FROM role_sys_privs WHERE role = 'CONNECT';
実行結果の例:
| ROLE | PRIVILEGE |
|---|---|
| CONNECT | CREATE SESSION |
ロールに含まれるオブジェクト権限を確認する
-- ロールに含まれるオブジェクト権限 SELECT role, owner, table_name, privilege FROM role_tab_privs WHERE role = 'ロール名';
オブジェクト権限を確認する(DBA_TAB_PRIVS)
特定のテーブルやビューなどのオブジェクトに対する権限を確認するには、DBA_TAB_PRIVS を使います。
SELECT grantee, owner, table_name, privilege, grantable FROM dba_tab_privs WHERE grantee = 'SCOTT' ORDER BY owner, table_name;
実行結果の例:
| GRANTEE | OWNER | TABLE_NAME | PRIVILEGE | GRANTABLE |
|---|---|---|---|---|
| SCOTT | HR | EMPLOYEES | SELECT | NO |
| SCOTT | HR | EMPLOYEES | INSERT | NO |
| SCOTT | HR | DEPARTMENTS | SELECT | YES |
GRANTABLE が YES の場合、そのユーザーは他のユーザーにも同じ権限を付与できます(GRANT OPTION 付き)。
カラム単位の権限を確認する
特定のカラムだけに UPDATE 権限が付与されている場合は、DBA_COL_PRIVS で確認します。
SELECT grantee, owner, table_name, column_name, privilege FROM dba_col_privs WHERE grantee = 'SCOTT';
自分自身の権限を確認する(DBA権限不要)
DBA_ 系のビューは DBA 権限がないと参照できません。一般ユーザーが自分自身の権限を確認するには、USER_ 系のビューを使います。
-- 自分のシステム権限 SELECT privilege, admin_option FROM user_sys_privs; -- 自分に付与されたロール SELECT granted_role, admin_option, default_role FROM user_role_privs; -- 自分のオブジェクト権限 SELECT owner, table_name, privilege, grantable FROM user_tab_privs;
DBA_ / ALL_ / USER_ ビューの違い
| プレフィックス | 参照範囲 | 必要な権限 |
|---|---|---|
DBA_ |
データベース全体(全ユーザー) | DBA権限 or SELECT ANY DICTIONARY |
ALL_ |
自分がアクセスできるオブジェクト | 不要 |
USER_ |
自分自身のオブジェクトのみ | 不要 |
現在のセッションで有効な権限を確認する(SESSION_PRIVS)
ログイン中のセッションで実際に使える権限を確認するには、SESSION_PRIVS を使います。
SELECT privilege FROM session_privs ORDER BY privilege;
SESSION_PRIVS には、直接付与されたシステム権限に加えて、有効なロールに含まれる権限もすべて展開されて表示されます。「このユーザーは今この操作ができるか?」を確認したいときに最も便利なビューです。
現在有効なロールを確認する
SELECT role FROM session_roles;
特定の権限を持つユーザーを一覧する
「この権限を持っているのは誰か?」を調べたいケースです。
特定のシステム権限を持つユーザー
-- CREATE TABLE 権限を持つユーザー SELECT grantee, privilege FROM dba_sys_privs WHERE privilege = 'CREATE TABLE' ORDER BY grantee;
特定のテーブルへの権限を持つユーザー
-- HR.EMPLOYEES テーブルへの権限を持つユーザー SELECT grantee, privilege, grantable FROM dba_tab_privs WHERE owner = 'HR' AND table_name = 'EMPLOYEES' ORDER BY grantee;
DBA ロールを持つユーザー
-- DBA ロールが付与されているユーザー SELECT grantee FROM dba_role_privs WHERE granted_role = 'DBA';
ユーザーの全権限をまとめて確認するSQL
システム権限・ロール・オブジェクト権限をまとめて確認するSQLです。
-- 1. システム権限 SELECT 'SYSTEM_PRIV' AS type, privilege AS name, admin_option FROM dba_sys_privs WHERE grantee = 'SCOTT' UNION ALL -- 2. ロール SELECT 'ROLE', granted_role, admin_option FROM dba_role_privs WHERE grantee = 'SCOTT' UNION ALL -- 3. オブジェクト権限 SELECT 'OBJECT_PRIV', privilege || ' ON ' || owner || '.' || table_name, grantable FROM dba_tab_privs WHERE grantee = 'SCOTT' ORDER BY 1, 2;
実行結果の例:
| TYPE | NAME | ADMIN_OPTION |
|---|---|---|
| OBJECT_PRIV | INSERT ON HR.EMPLOYEES | NO |
| OBJECT_PRIV | SELECT ON HR.DEPARTMENTS | YES |
| OBJECT_PRIV | SELECT ON HR.EMPLOYEES | NO |
| ROLE | CONNECT | NO |
| ROLE | RESOURCE | NO |
| SYSTEM_PRIV | CREATE SESSION | NO |
| SYSTEM_PRIV | CREATE TABLE | NO |
1つのSQLで全体像を把握できるため、権限の棚卸しや監査に便利です。
まとめ
| 確認したい内容 | ビュー |
|---|---|
| システム権限 | DBA_SYS_PRIVS(自分: USER_SYS_PRIVS) |
| 付与されたロール | DBA_ROLE_PRIVS(自分: USER_ROLE_PRIVS) |
| ロール内の権限 | ROLE_SYS_PRIVS / ROLE_TAB_PRIVS |
| オブジェクト権限 | DBA_TAB_PRIVS(自分: USER_TAB_PRIVS) |
| カラム権限 | DBA_COL_PRIVS |
| セッションの有効な権限 | SESSION_PRIVS |
| セッションの有効なロール | SESSION_ROLES |
ポイント:
DBA_ビューはDBA権限が必要。一般ユーザーはUSER_ビューを使う- ロール経由の権限は
DBA_SYS_PRIVSには表示されない。SESSION_PRIVSで確認する ADMIN_OPTION = YESは他のユーザーにも権限を付与できることを意味する- 全権限を一覧するには UNION ALL で3つのビューを結合する

