「このユーザーに何の権限を与えればいいんだっけ?」「誰がどの権限を持ってるか把握できていない」——Oracleの権限管理は種類が多くて複雑ですが、体系的に理解すれば怖くありません。本記事で完全制覇しましょう。
目次
1. ユーザー作成・削除・変更 {#user-management}
ユーザーを作成する
-- 基本のユーザー作成
CREATE USER アプリユーザー
IDENTIFIED BY パスワード
DEFAULT TABLESPACE USERS -- デフォルトTBS
TEMPORARY TABLESPACE TEMP -- 一時TBS
QUOTA 2048M ON USERS; -- USERS TBSの使用上限(UNLIMITEDも可)
-- 作成直後は接続権限もないのでCONNECTを付与
GRANT CREATE SESSION TO アプリユーザー;ユーザーのパスワード・設定を変更する
-- パスワード変更
ALTER USER アプリユーザー IDENTIFIED BY 新しいパスワード;
-- アカウントのロック / ロック解除
ALTER USER アプリユーザー ACCOUNT LOCK;
ALTER USER アプリユーザー ACCOUNT UNLOCK;
-- パスワードの期限を無期限に設定
ALTER USER アプリユーザー PASSWORD EXPIRE; -- 次回ログイン時に変更を強制
-- TBSのクォータを変更
ALTER USER アプリユーザー QUOTA UNLIMITED ON USERS;
ALTER USER アプリユーザー QUOTA 0 ON USERS; -- テーブル作成不可にするユーザーを削除する
-- ユーザーのオブジェクトも含めて完全削除
DROP USER アプリユーザー CASCADE;
-- オブジェクトがない場合のみ(CASCADEなし)
DROP USER アプリユーザー;⚠️
CASCADEは取り消せません。本番環境では事前にオブジェクト一覧を確認してください。
2. システム権限とオブジェクト権限の違い {#privileges}
システム権限(System Privileges)
データベース全体に関わる操作を許可する権限です。
| 権限名 | できること |
|---|---|
| CREATE SESSION | DBへの接続(最低限必要) |
| CREATE TABLE | テーブル作成 |
| CREATE VIEW | ビュー作成 |
| CREATE PROCEDURE | プロシージャ・ファンクション作成 |
| CREATE SEQUENCE | シーケンス作成 |
| CREATE INDEX | インデックス作成 |
| CREATE TRIGGER | トリガー作成 |
| CREATE USER | ユーザー作成(DBA向け) |
| DROP ANY TABLE | 任意テーブルの削除(危険!) |
オブジェクト権限(Object Privileges)
特定のテーブル・ビュー・プロシージャなどへのアクセスを許可する権限です。
| 権限名 | 対象 | できること |
|---|---|---|
| SELECT | テーブル/ビュー | データの読み取り |
| INSERT | テーブル | 行の追加 |
| UPDATE | テーブル | 行の更新 |
| DELETE | テーブル | 行の削除 |
| EXECUTE | プロシージャ/ファンクション | 実行 |
| REFERENCES | テーブル | 外部キーの参照 |
| INDEX | テーブル | インデックス作成 |
3. GRANT・REVOKE の使い方 {#grant-revoke}
システム権限を付与する
-- 単一権限を付与
GRANT CREATE SESSION TO アプリユーザー;
GRANT CREATE TABLE TO アプリユーザー;
-- 複数権限を一括付与
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO アプリユーザー;
-- WITH ADMIN OPTION:付与された権限をさらに他ユーザーに付与できる
GRANT CREATE TABLE TO アプリユーザー WITH ADMIN OPTION;オブジェクト権限を付与する
-- 特定テーブルのSELECT権限を付与
GRANT SELECT ON SCOTT.EMP TO アプリユーザー;
-- INSERT・UPDATE・DELETEも付与
GRANT SELECT, INSERT, UPDATE, DELETE ON SCOTT.EMP TO アプリユーザー;
-- 全ユーザーに公開(PUBLICへの付与は慎重に)
GRANT SELECT ON SCOTT.EMP TO PUBLIC;
-- WITH GRANT OPTION:さらに他ユーザーへ付与可能にする
GRANT SELECT ON SCOTT.EMP TO アプリユーザー WITH GRANT OPTION;
-- 特定カラムだけUPDATEを許可
GRANT UPDATE(SAL, COMM) ON SCOTT.EMP TO アプリユーザー;権限を取り消す(REVOKE)
-- システム権限の取り消し
REVOKE CREATE TABLE FROM アプリユーザー;
-- オブジェクト権限の取り消し
REVOKE SELECT ON SCOTT.EMP FROM アプリユーザー;
-- WITH GRANT OPTIONで付与した場合、連鎖的に取り消される
-- (Bに付与→BがCに付与の状態でAがBからREVOKE → CからもREVOKEされる)4. ロール(ROLE)を使った権限管理 {#roles}
複数の権限をまとめてロールとして定義し、ユーザーに割り当てることができます。個別管理より圧倒的に楽です。
よく使う組み込みロール
| ロール名 | 含まれる主な権限 | 用途 |
|---|---|---|
| CONNECT | CREATE SESSION等 | 接続のみ(古いバージョン用) |
| RESOURCE | CREATE TABLE, PROCEDURE等 | 開発者向け |
| DBA | ほぼ全権限 | 管理者(本番での付与は最小限に) |
| SELECT_CATALOG_ROLE | データディクショナリのSELECT | 監視ツール用途 |
⚠️
DBAロールを安易に付与するのはセキュリティリスクです。必要な権限だけを付与してください。
カスタムロールを作成する
-- ロールを作成
CREATE ROLE アプリ読み取りROLE;
-- ロールに権限を付与
GRANT SELECT ON SCOTT.EMP TO アプリ読み取りROLE;
GRANT SELECT ON SCOTT.DEPT TO アプリ読み取りROLE;
GRANT SELECT ON SCOTT.SALGRADE TO アプリ読み取りROLE;
-- ユーザーにロールを割り当て
GRANT アプリ読み取りROLE TO アプリユーザー;
GRANT アプリ読み取りROLE TO 別のユーザー;
-- 一括変更が簡単!(ロールの権限を変えれば全員に反映)
GRANT SELECT ON SCOTT.BONUS TO アプリ読み取りROLE;ロールを確認・削除する
-- 定義済みロールの一覧
SELECT ROLE FROM DBA_ROLES ORDER BY ROLE;
-- ロールを削除(付与したユーザーからも自動削除)
DROP ROLE アプリ読み取りROLE;5. 現在の権限状況を確認するSQL {#check-privs}
自分の権限を確認する
-- 自分のシステム権限
SELECT PRIVILEGE FROM USER_SYS_PRIVS ORDER BY PRIVILEGE;
-- 自分に付与されているロール
SELECT GRANTED_ROLE, DEFAULT_ROLE FROM USER_ROLE_PRIVS ORDER BY GRANTED_ROLE;
-- 自分が持つオブジェクト権限(もらっている側)
SELECT OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM USER_TAB_PRIVS
ORDER BY OWNER, TABLE_NAME, PRIVILEGE;特定ユーザーの権限をDBAとして確認する
-- 対象ユーザーのシステム権限
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'アプリユーザー'
ORDER BY PRIVILEGE;
-- 対象ユーザーのロール
SELECT GRANTEE, GRANTED_ROLE, DEFAULT_ROLE
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = 'アプリユーザー';
-- 対象ユーザーのオブジェクト権限
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE GRANTEE = 'アプリユーザー'
ORDER BY OWNER, TABLE_NAME;ロールが持つ権限を確認する
-- ロールに含まれるシステム権限
SELECT ROLE, PRIVILEGE FROM ROLE_SYS_PRIVS
WHERE ROLE = 'アプリ読み取りROLE';
-- ロールに含まれるオブジェクト権限
SELECT ROLE, OWNER, TABLE_NAME, PRIVILEGE
FROM ROLE_TAB_PRIVS
WHERE ROLE = 'アプリ読み取りROLE';6. よくある権限設定パターン {#patterns}
パターン①:アプリケーション専用ユーザー(読み書き)
-- ユーザー作成
CREATE USER app_user IDENTIFIED BY パスワード
DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON USERS;
-- 接続+テーブル作成+プロシージャ作成
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW,
CREATE PROCEDURE, CREATE SEQUENCE TO app_user;パターン②:参照専用ユーザー(バッチ・レポート用)
CREATE USER report_user IDENTIFIED BY パスワード
DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;
-- 接続のみ + 必要なテーブルのSELECTのみ
GRANT CREATE SESSION TO report_user;
GRANT SELECT ON APP_OWNER.ORDERS TO report_user;
GRANT SELECT ON APP_OWNER.CUSTOMERS TO report_user;パターン③:監視ツール用ユーザー(DBAビュー参照)
CREATE USER monitor_user IDENTIFIED BY パスワード;
GRANT CREATE SESSION TO monitor_user;
GRANT SELECT_CATALOG_ROLE TO monitor_user;
GRANT SELECT ON V_$SESSION TO monitor_user;
GRANT SELECT ON V_$SQL TO monitor_user;
GRANT SELECT ON V_$LOCK TO monitor_user;7. 権限管理のアンチパターン {#antipatterns}
❌ アンチパターン①:DBAを安易に付与する
-- 危険!全権限を付与してしまう
GRANT DBA TO アプリユーザー;→ 最小権限の原則に違反。本番では絶対NG。
❌ アンチパターン②:PUBLICに権限を付与する
-- 全ユーザーに公開してしまう
GRANT SELECT ON 機密テーブル TO PUBLIC;→ 新規ユーザー全員が自動的に参照可能になります。
❌ アンチパターン③:WITH ADMIN OPTIONを使いすぎる
-- 付与された権限をさらに他人に付与できてしまう
GRANT CREATE TABLE TO ユーザーA WITH ADMIN OPTION;→ ユーザーAが意図しないユーザーに権限を付与するリスクがあります。
❌ アンチパターン④:権限の棚卸しをしない
定期的に不要な権限を確認・削除しないと、退職したユーザーや不要なアカウントが残り続けます。
8. まとめ:権限管理チェックリスト {#summary}
| チェック項目 | 確認コマンド |
|---|---|
| ユーザーの一覧・ステータス確認 | DBA_USERS |
| ユーザーのシステム権限確認 | DBA_SYS_PRIVS |
| ユーザーのロール確認 | DBA_ROLE_PRIVS |
| ユーザーのオブジェクト権限確認 | DBA_TAB_PRIVS |
| ロールの権限内容確認 | ROLE_SYS_PRIVS, ROLE_TAB_PRIVS |
| DBAロール保有者の確認(危険) | SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'DBA' |
| PUBLICへの付与確認(危険) | SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'PUBLIC' |
権限設計の3原則:
- 最小権限の原則 — 必要最低限の権限だけ付与する
- ロールで管理 — 個別ユーザーへの直接付与より、ロールでグルーピング
- 定期棚卸し — 不要ユーザー・権限を定期削除(四半期推奨)
関連記事:









コメント