Oracleデータベースでは、表領域(Tablespace)そのものにアクセス制御機能は存在しません。しかし、ユーザー作成時のデフォルト表領域指定・QUOTA設定・ロール管理を組み合わせることで、表領域単位の分離運用を実現できます。
本記事では、表領域アクセス制御の仕組みを体系的に解説し、設計・実装・確認までの具体的な手順をすべてカバーします。
表領域アクセス制御の基本概念
Oracleの表領域アクセス制御は、3つのレイヤーで構成されます。
| レイヤー |
設定内容 |
主な用途 |
| DEFAULT TABLESPACE |
ユーザーのデフォルト格納先 |
オブジェクト作成先の誘導 |
| QUOTA |
表領域ごとの使用量上限 |
作成可能な領域の制限 |
| ROLE / PRIVILEGE |
システム権限・オブジェクト権限 |
操作自体の許可・禁止 |
ポイント: QUOTAが0の表領域にはオブジェクトを作成できません。この仕組みを利用して表領域を実質的に制限します。
ユーザー作成とデフォルト表領域の設定
ユーザー作成時にDEFAULT TABLESPACEとTEMPORARY TABLESPACEを明示的に指定します。
SQL — ユーザー作成とデフォルト表領域の設定
-- 販売部門ユーザーの作成
CREATE USER user_sales
IDENTIFIED BY "P@ssw0rd2024"
DEFAULT TABLESPACE ts_sales -- オブジェクト格納先
TEMPORARY TABLESPACE temp -- ソート領域
QUOTA 500M ON ts_sales; -- デフォルト表領域に500MBを許可
-- 接続・リソース権限の付与
GRANT CREATE SESSION TO user_sales;
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO user_sales;
注意: RESOURCEロールにはUNLIMITED TABLESPACE権限が含まれる場合があります(Oracle 11g以前)。QUOTAによる制限が無効になるため、RESOURCEの代わりに個別権限を付与することを推奨します。
QUOTAによる表領域アクセス制限
QUOTAを設定することで、特定の表領域へのオブジェクト作成を制限できます。
SQL — QUOTA の設定・変更・確認
-- 特定表領域に使用量を許可(MB / GB / UNLIMITED 指定可)
ALTER USER user_sales QUOTA 100M ON ts_sales;
ALTER USER user_sales QUOTA UNLIMITED ON ts_sales;
-- 別の表領域へのアクセスを禁止(QUOTA 0 = 作成不可)
ALTER USER user_sales QUOTA 0 ON ts_hr;
ALTER USER user_sales QUOTA 0 ON ts_finance;
-- QUOTAの確認
SELECT username, tablespace_name,
ROUND(bytes / 1024 / 1024, 2) AS used_mb,
CASE max_bytes WHEN -1 THEN 'UNLIMITED'
ELSE TO_CHAR(ROUND(max_bytes / 1024 / 1024, 2)) || 'MB' END AS max_quota
FROM dba_ts_quotas
WHERE username = 'USER_SALES'
ORDER BY tablespace_name;
QUOTA設定の早見表
| 設定値 |
意味 |
dba_ts_quotasのmax_bytes |
| QUOTA 0 ON ts_x |
作成不可(禁止) |
0 |
| QUOTA 100M ON ts_x |
100MBまで作成可能 |
104857600 |
| QUOTA UNLIMITED ON ts_x |
無制限に作成可能 |
-1 |
| (未設定) |
作成不可(デフォルト) |
レコードなし |
ロールを使った権限の一元管理
ユーザー数が増えた場合は、ロール(ROLE)で権限セットを束ねると管理が効率化します。
SQL — 部門別ロールの作成と付与
-- 1. ロールの作成
CREATE ROLE sales_role;
CREATE ROLE hr_role;
CREATE ROLE readonly_role;
-- 2. ロールへ権限を付与
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO sales_role;
GRANT CREATE TABLE, CREATE VIEW TO hr_role;
GRANT CREATE SESSION TO readonly_role;
-- 3. ロールをユーザーに付与
GRANT sales_role TO user_sales, user_sales2;
GRANT hr_role TO user_hr;
GRANT readonly_role TO user_report;
-- ロールの削除(ユーザーへの付与も自動で外れる)
DROP ROLE sales_role;
権限の確認クエリ
設定した権限やロールが正しく反映されているか確認するためのクエリです。
ユーザーに付与されたシステム権限を確認
SQL — DBA_SYS_PRIVS でシステム権限を確認
SELECT grantee, privilege, admin_option
FROM dba_sys_privs
WHERE grantee = 'USER_SALES'
ORDER BY privilege;
ユーザーに付与されたロールを確認
SQL — DBA_ROLE_PRIVS でロール割り当てを確認
SELECT grantee, granted_role, admin_option, default_role
FROM dba_role_privs
WHERE grantee = 'USER_SALES';
ロールが持つ権限を確認
SQL — ROLE_SYS_PRIVS でロールの権限を確認
SELECT role, privilege, admin_option
FROM role_sys_privs
WHERE role = 'SALES_ROLE'
ORDER BY privilege;
ユーザーの有効権限を一覧化(ロール経由を含む)
SQL — SESSION_PRIVS(自セッション)/ DBA_ROLE_PRIVS(DBAで確認)
-- 自セッションで有効なシステム権限(ロール経由含む)
SELECT privilege FROM session_privs ORDER BY privilege;
-- DBAがユーザーの全権限ツリーを確認(再帰的に辿る)
SELECT granted_role
FROM dba_role_privs
WHERE grantee = 'USER_SALES'
UNION ALL
SELECT privilege
FROM dba_sys_privs
WHERE grantee = 'USER_SALES';
権限の取り消し方法
SQL — REVOKE による権限の取り消し
-- システム権限の取り消し
REVOKE CREATE TABLE FROM user_sales;
-- ロールの取り消し
REVOKE sales_role FROM user_sales;
-- オブジェクト権限の取り消し
REVOKE SELECT ON hr.employees FROM user_sales;
-- QUOTAを0にして表領域への書き込みを禁止
ALTER USER user_sales QUOTA 0 ON ts_sales;
UNLIMITED TABLESPACE 権限の落とし穴
UNLIMITED TABLESPACEはシステム権限であり、この権限が付与されたユーザーはQUOTAの設定に関わらず全表領域に書き込み可能になります。
SQL — UNLIMITED TABLESPACE の確認と取り消し
-- UNLIMITED TABLESPACE を持つユーザーを確認
SELECT grantee, privilege
FROM dba_sys_privs
WHERE privilege = 'UNLIMITED TABLESPACE'
AND grantee NOT IN ('SYS', 'SYSTEM')
ORDER BY grantee;
-- 取り消す(RESOURCEロール経由の場合はロールごと取り消し)
REVOKE UNLIMITED TABLESPACE FROM user_sales;
REVOKE RESOURCE FROM user_sales; -- RESOURCEが原因の場合
注意: Oracle 12c以降ではRESOURCEロールにUNLIMITED TABLESPACEは含まれなくなりましたが、旧バージョンからの移行環境では注意が必要です。
表領域の使用状況モニタリング
アクセス制御設定後は、ユーザーごとの使用状況を定期的に確認します。
SQL — ユーザー別・表領域別の使用状況
-- ユーザーの表領域別使用量とクォータ
SELECT
q.username,
q.tablespace_name,
ROUND(q.bytes / 1024 / 1024, 2) AS used_mb,
CASE q.max_bytes WHEN -1 THEN 'UNLIMITED'
ELSE TO_CHAR(ROUND(q.max_bytes / 1024 / 1024, 2))
END AS quota_mb,
CASE q.max_bytes
WHEN -1 THEN 'N/A'
WHEN 0 THEN '禁止'
ELSE TO_CHAR(ROUND(q.bytes * 100 / q.max_bytes, 1)) || '%'
END AS usage_rate
FROM dba_ts_quotas q
ORDER BY q.username, q.tablespace_name;
SQL — クォータ上限90%超えのユーザーを抽出
SELECT username, tablespace_name,
ROUND(bytes / 1024 / 1024, 2) AS used_mb,
ROUND(max_bytes / 1024 / 1024, 2) AS quota_mb,
ROUND(bytes * 100 / max_bytes, 1) AS pct
FROM dba_ts_quotas
WHERE max_bytes > 0
AND bytes * 100 / max_bytes >= 90
ORDER BY pct DESC;
監査(AUDIT)との組み合わせ
アクセス制御だけでなく、操作の監査ログを取ることで、不正アクセスの検知や証跡管理が可能になります。
SQL — 基本的な監査設定
-- DDL操作(テーブル作成・削除)を監査
AUDIT CREATE TABLE, DROP TABLE BY user_sales;
-- ログイン成功・失敗を監査
AUDIT SESSION BY user_sales;
-- 監査ログの確認
SELECT db_user, action_name, obj_name, timestamp
FROM dba_audit_trail
WHERE db_user = 'USER_SALES'
ORDER BY timestamp DESC;
設計パターン:部門別運用の実例
販売・人事・経理の3部門を分離する際の設計例です。
SQL — 部門別アクセス制御の完全実装例
-- ① 表領域の作成(DBとして別途実施)
-- CREATE TABLESPACE ts_sales ... / ts_hr ... / ts_finance ...
-- ② ロールの定義
CREATE ROLE r_sales_rw; -- 販売: 読み書き
CREATE ROLE r_report_ro; -- 報告: 読み取り専用
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO r_sales_rw;
GRANT CREATE SESSION TO r_report_ro;
-- ③ ユーザーの作成
CREATE USER user_sales IDENTIFIED BY "SalesPw#1"
DEFAULT TABLESPACE ts_sales TEMPORARY TABLESPACE temp
QUOTA 200M ON ts_sales;
CREATE USER user_report IDENTIFIED BY "RptPw#1"
DEFAULT TABLESPACE ts_sales TEMPORARY TABLESPACE temp
QUOTA 0 ON ts_sales; -- 読み取り専用なので書き込み不可
-- ④ ロールの付与
GRANT r_sales_rw TO user_sales;
GRANT r_report_ro TO user_report;
-- ⑤ 他部門表領域への書き込みを明示的に禁止
ALTER USER user_sales QUOTA 0 ON ts_hr;
ALTER USER user_sales QUOTA 0 ON ts_finance;
まとめ
| 手段 |
目的 |
主なコマンド |
| DEFAULT TABLESPACE |
デフォルト格納先の指定 |
CREATE/ALTER USER |
| QUOTA |
表領域への書き込み量制限 |
ALTER USER … QUOTA |
| ROLE |
権限セットの一元管理 |
CREATE ROLE / GRANT |
| REVOKE |
権限の取り消し |
REVOKE … FROM |
| AUDIT |
操作ログの記録 |
AUDIT … BY user |
よくある質問(FAQ)
Q. QUOTA 0 にしたが、既存のオブジェクトはどうなるか?
A. 既存オブジェクトは削除されません。ただし、新しいオブジェクトの作成・既存オブジェクトへの行追加(領域拡張を伴うINSERT)はエラーになります。
Q. QUOTA を設定しても UNLIMITED TABLESPACE 権限があれば制限されないか?
A. その通りです。UNLIMITED TABLESPACEはQUOTAより優先されます。DBA_SYS_PRIVSでこの権限の有無を必ず確認し、不要であればREVOKEしてください。
Q. 表領域を別ユーザーに見せたくない場合はどうすればいいか?
A. Oracleは表領域名自体を隠す機能を持ちません。ただし、対象の表領域にQUOTAを与えず、かつCREATE ANY TABLEなどのシステム権限を付与しなければ、実質的に使用できない状態にできます。