【Oracle】ユーザー・権限・ロール完全ガイド|CREATE USER・GRANT・REVOKE・システム権限・オブジェクト権限・ロール管理まで解説

Oracle の権限管理は システム権限(データベース操作全般)とオブジェクト権限(特定のテーブルやプロシージャへのアクセス)の2種類で構成されます。権限は直接ユーザーに付与することもできますが、ロール(役割)にまとめてから付与するのが管理しやすく推奨されています。

この記事でわかること

  • CREATE USER でユーザーを作成する方法
  • システム権限とオブジェクト権限の違いと GRANT / REVOKE の使い方
  • 代表的なシステム権限(CREATE SESSION・CREATE TABLE・DBA など)の意味
  • CREATE ROLE でカスタムロールを作成して権限を一括管理する方法
  • WITH ADMIN OPTION と WITH GRANT OPTION の違い
  • DBA_SYS_PRIVS・DBA_TAB_PRIVS・DBA_ROLE_PRIVS で権限を確認する方法
スポンサーリンク

ユーザーの作成(CREATE USER)

ユーザーの作成・変更・削除
-- 基本的なユーザー作成
CREATE USER app_user IDENTIFIED BY "SecurePass123#"
DEFAULT TABLESPACE app_data      -- デフォルト表領域(オブジェクトが作成される表領域)
TEMPORARY TABLESPACE temp        -- 一時表領域(ソート・ハッシュ結合のワーク領域)
QUOTA 500M ON app_data           -- app_data 表領域の使用上限
QUOTA UNLIMITED ON app_index;    -- app_index 表領域は無制限

-- パスワードを変更する
ALTER USER app_user IDENTIFIED BY "NewPass456#";

-- アカウントをロック / アンロックする
ALTER USER app_user ACCOUNT LOCK;     -- アカウントをロック(ORA-28000 が発生するようになる)
ALTER USER app_user ACCOUNT UNLOCK;   -- アンロックする

-- パスワードを期限切れにする(次回ログイン時にパスワード変更を強制する)
ALTER USER app_user PASSWORD EXPIRE;

-- デフォルト表領域・一時表領域・クォータを変更する
ALTER USER app_user DEFAULT TABLESPACE new_data;
ALTER USER app_user QUOTA 2G ON app_data;
ALTER USER app_user QUOTA 0 ON app_data;   -- 0 にするとオブジェクト作成不可(既存は残る)

-- ユーザーを削除する
DROP USER app_user;                   -- オブジェクトがある場合はエラー
DROP USER app_user CASCADE;           -- ユーザーと全オブジェクトを削除(注意: 不可逆)

-- ユーザーの情報を確認する
SELECT username, account_status, default_tablespace, temporary_tablespace,
       profile, created, lock_date, expiry_date
FROM DBA_USERS
WHERE username = 'APP_USER';

システム権限の付与と取り消し

システム権限はデータベース全体の操作に対する権限です。CREATE SESSION(ログイン権限)すら付与されていないユーザーは接続できないため、最低限これだけは付与する必要があります。

よく使うシステム権限の GRANT と REVOKE
-- 基本的なシステム権限の付与
GRANT CREATE SESSION TO app_user;           -- ログイン(接続)する権限
GRANT CREATE TABLE TO app_user;             -- テーブルを作成する権限(自スキーマ)
GRANT CREATE VIEW TO app_user;              -- ビューを作成する権限
GRANT CREATE PROCEDURE TO app_user;         -- プロシージャ・関数・パッケージを作成する権限
GRANT CREATE SEQUENCE TO app_user;          -- シーケンスを作成する権限
GRANT CREATE TRIGGER TO app_user;           -- トリガーを作成する権限
GRANT CREATE INDEX TO app_user;             -- インデックスを作成する権限(自スキーマ)
GRANT CREATE ANY TABLE TO app_user;         -- 任意スキーマにテーブルを作成する権限
GRANT DROP ANY TABLE TO app_user;           -- 任意スキーマのテーブルを削除する権限

-- 複数ユーザーにまとめて付与する
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO app_user, report_user;

-- WITH ADMIN OPTION: 付与された権限をさらに他のユーザーに付与できる
GRANT CREATE TABLE TO admin_user WITH ADMIN OPTION;

-- システム権限の取り消し(WITH ADMIN OPTION 経由で付与した権限は連鎖的に取り消されない)
REVOKE CREATE TABLE FROM app_user;
REVOKE CREATE SESSION FROM app_user;

-- 代表的なシステム権限一覧
-- DBA              : データベース管理者権限(ほぼすべての操作が可能)
-- CONNECT          : CREATE SESSION のみを含むロール(古い慣習)
-- RESOURCE         : CREATE TABLE/VIEW/PROCEDURE/SEQUENCE など + UNLIMITED TABLESPACE
-- CREATE SESSION   : データベースへの接続
-- SYSDBA / SYSOPER : OS 認証レベルの最高権限(AS SYSDBA で接続する場合に必要)

オブジェクト権限の付与と取り消し

オブジェクト権限は特定のテーブル・ビュー・プロシージャなどに対するアクセス権限です。スキーマ間でデータを共有する際に使います。

オブジェクト権限の GRANT と REVOKE
-- テーブルへのアクセス権限を付与する
GRANT SELECT ON hr.employees TO report_user;            -- SELECT 権限
GRANT SELECT, INSERT, UPDATE ON hr.orders TO app_user;  -- 複数権限
GRANT DELETE ON hr.temp_log TO app_user;
GRANT ALL ON hr.employees TO hr_admin;                  -- すべてのオブジェクト権限

-- 特定の列のみに権限を付与する(列レベル権限: SELECT / INSERT / UPDATE のみ対応)
GRANT SELECT (employee_id, last_name, department_id) ON hr.employees TO report_user;
GRANT UPDATE (salary) ON hr.employees TO payroll_user;  -- salary 列のみ UPDATE 可能

-- ビューへの権限付与(テーブルと同じ)
GRANT SELECT ON hr.emp_summary_v TO report_user;

-- プロシージャ・関数・パッケージへの権限付与
GRANT EXECUTE ON hr.calculate_bonus TO app_user;
GRANT EXECUTE ON hr.salary_pkg TO app_user;

-- PUBLIC への権限付与(全ユーザーが使えるようになる)
GRANT SELECT ON hr.departments TO PUBLIC;  -- すべてのユーザーが参照可能になる

-- WITH GRANT OPTION: 付与された権限をさらに他のユーザーに付与できる
-- (REVOKE 時は連鎖的に取り消される: WITH ADMIN OPTION とここが違う)
GRANT SELECT ON hr.employees TO app_admin WITH GRANT OPTION;

-- オブジェクト権限の取り消し
REVOKE SELECT ON hr.employees FROM report_user;
REVOKE EXECUTE ON hr.calculate_bonus FROM app_user;
REVOKE SELECT ON hr.departments FROM PUBLIC;

-- シノニムを作成してスキーマ名なしでアクセスできるようにする
CREATE SYNONYM employees FOR hr.employees;        -- プライベートシノニム(自スキーマのみ)
CREATE PUBLIC SYNONYM employees FOR hr.employees; -- パブリックシノニム(全ユーザー)

ロールの作成と管理

権限を直接ユーザーに付与すると、ユーザーが増えるほど管理が複雑になります。ロールに権限をまとめてからユーザーに付与すると、権限の追加・変更・削除が一箇所で完結します。

ロールの作成・権限付与・ユーザーへの割り当て
-- カスタムロールを作成する
CREATE ROLE app_read_role;         -- パスワードなしのロール
CREATE ROLE app_write_role;
CREATE ROLE secure_role IDENTIFIED BY role_pass;  -- パスワード付きロール(使用時に SET ROLE が必要)

-- ロールに権限を付与する(システム権限・オブジェクト権限どちらも付与できる)
GRANT CREATE SESSION TO app_read_role;
GRANT SELECT ON hr.employees TO app_read_role;
GRANT SELECT ON hr.departments TO app_read_role;
GRANT SELECT ON hr.jobs TO app_read_role;

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO app_write_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO app_write_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.orders TO app_write_role;

-- ロールを別のロールに付与する(ロールの階層化)
GRANT app_read_role TO app_write_role;  -- app_write_role は app_read_role の権限も含む

-- ユーザーにロールを付与する
GRANT app_read_role TO report_user;
GRANT app_write_role TO app_user;
GRANT app_read_role TO app_user;   -- 複数ロールを付与できる

-- ロールを取り消す
REVOKE app_read_role FROM report_user;

-- ロールを削除する(ロールを付与されたユーザーの権限も自動的に失われる)
DROP ROLE app_read_role;

-- デフォルトロール: ログイン時に自動で有効になるロールを設定する
ALTER USER app_user DEFAULT ROLE app_read_role;        -- 特定ロールのみ有効
ALTER USER app_user DEFAULT ROLE ALL;                  -- 付与済みのすべてのロール(デフォルト)
ALTER USER app_user DEFAULT ROLE ALL EXCEPT secure_role; -- secure_role 以外を有効にする
ALTER USER app_user DEFAULT ROLE NONE;                 -- ログイン時にロールを有効にしない

-- セッション内でロールを有効・無効にする
SET ROLE app_write_role;                   -- 指定ロールのみ有効にする
SET ROLE secure_role IDENTIFIED BY role_pass;  -- パスワード付きロール
SET ROLE ALL;                              -- 付与済みロールをすべて有効にする
SET ROLE NONE;                             -- すべてのロールを無効にする

付与済み権限の確認クエリ

DBA_SYS_PRIVS・DBA_TAB_PRIVS・DBA_ROLE_PRIVS で権限を確認する
-- ユーザーに付与されているシステム権限を確認する
SELECT grantee, privilege, admin_option
FROM DBA_SYS_PRIVS
WHERE grantee = 'APP_USER'
ORDER BY privilege;

-- ユーザーに付与されているオブジェクト権限を確認する
SELECT grantee, owner, table_name, privilege, grantable
FROM DBA_TAB_PRIVS
WHERE grantee = 'APP_USER'
ORDER BY owner, table_name, privilege;

-- ユーザーに付与されているロールを確認する
SELECT grantee, granted_role, admin_option, default_role
FROM DBA_ROLE_PRIVS
WHERE grantee = 'APP_USER';

-- ロールに付与されているシステム権限を確認する
SELECT grantee, privilege, admin_option
FROM DBA_SYS_PRIVS
WHERE grantee = 'APP_READ_ROLE';

-- ロールに付与されているオブジェクト権限を確認する
SELECT grantee, owner, table_name, privilege
FROM DBA_TAB_PRIVS
WHERE grantee = 'APP_READ_ROLE';

-- 自分自身(現在のセッション)の有効な権限を確認する
SELECT * FROM SESSION_PRIVS;          -- 現在有効なシステム権限(ロール経由含む)
SELECT * FROM USER_SYS_PRIVS;         -- 自分に直接付与されたシステム権限
SELECT * FROM USER_ROLE_PRIVS;        -- 自分に付与されたロール
SELECT * FROM USER_TAB_PRIVS_RECD;   -- 自分が受け取ったオブジェクト権限

-- 特定テーブルへのアクセス権限を一覧する(誰が SELECT できるか確認)
SELECT grantee, privilege, grantable
FROM DBA_TAB_PRIVS
WHERE owner = 'HR' AND table_name = 'EMPLOYEES'
ORDER BY grantee, privilege;

まとめ

  • CREATE USER:DEFAULT TABLESPACE・TEMPORARY TABLESPACE・QUOTA を必ず指定する。CREATE SESSION を付与しないと接続できない
  • システム権限 vs オブジェクト権限:システム権限はDB全体の操作(CREATE TABLE など)、オブジェクト権限は特定オブジェクトへのアクセス(SELECT・EXECUTE など)。管理は混同しないように整理する
  • WITH ADMIN OPTION と WITH GRANT OPTION の違い:ADMIN OPTION(システム権限)は REVOKE しても連鎖的に取り消されない。GRANT OPTION(オブジェクト権限)は連鎖的に取り消される
  • ロールの活用:権限をロールにまとめてからユーザーに付与する。ユーザーの役割(読み取り専用・書き込み・管理者)に対応したロールを設計すると管理が楽になる
  • 権限確認:DBA_SYS_PRIVS(システム権限)・DBA_TAB_PRIVS(オブジェクト権限)・DBA_ROLE_PRIVS(ロール)で付与済み権限を確認する。SESSION_PRIVS で現在のセッションで有効な権限を確認できる

権限不足のエラー(ORA-01031)の対処については Oracle ORA-01031 完全ガイドを参照してください。VPD(Virtual Private Database)を使った行レベルのセキュリティ制御は Oracle VPD 完全ガイドも参照してください。