【Oracle】ユーザ権限を確認する方法

【Oracle】ユーザ権限を確認する方法 Oracle

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_ROLEYES のロールは、ログイン時に自動で有効になります。

ロールに含まれるシステム権限を確認する

ロールの中にどのシステム権限が含まれているかを確認するには、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

GRANTABLEYES の場合、そのユーザーは他のユーザーにも同じ権限を付与できます(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つのビューを結合する

あわせて読みたい