Oracle でユーザーがテーブルやインデックスを作成する際、オブジェクトはデフォルト表領域(DEFAULT TABLESPACE)に格納されます。適切に表領域を割り当てることで、ストレージの分離、QUOTA(使用量制限)の管理、運用の効率化が実現できます。
本記事では、ユーザーへの表領域の割り当て、QUOTA の設定、変更方法、確認 SQL、ORA-01950 の対処まで解説します。
・CREATE USER 時に DEFAULT TABLESPACE / TEMPORARY TABLESPACE を指定する方法
・ALTER USER で表領域を変更する方法
・QUOTA で表領域の使用量を制限する方法
・ユーザーの表領域設定を確認する SQL
・DB 全体のデフォルト表領域を変更する方法
・ORA-01950(表領域に対する権限がない)の原因と対処
CREATE USER 時に表領域を指定する
-- デフォルト表領域と一時表領域を指定
CREATE USER app_user IDENTIFIED BY password
DEFAULT TABLESPACE app_data -- オブジェクトの格納先
TEMPORARY TABLESPACE temp -- ソート等の一時領域
QUOTA 500M ON app_data; -- app_data に 500MB まで使用可能
-- QUOTA UNLIMITED: 表領域のサイズ上限まで無制限に使用
CREATE USER dev_user IDENTIFIED BY password
DEFAULT TABLESPACE dev_data
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON dev_data;
-- 最小限の権限を付与
GRANT CREATE SESSION, CREATE TABLE TO app_user;
| パラメータ | 省略時のデフォルト | 説明 |
|---|---|---|
| DEFAULT TABLESPACE | DB のデフォルト表領域(通常 USERS) | テーブル / インデックス等の格納先 |
| TEMPORARY TABLESPACE | DB のデフォルト一時表領域(通常 TEMP) | ソート / ハッシュ結合等の一時領域 |
| QUOTA | 0(使用不可) | 表領域に書き込めるサイズの上限 |
ユーザーを作成しただけでは、デフォルト表領域への書き込み権限(QUOTA)がありません。CREATE TABLE 時に
ORA-01950: no privileges on tablespace が発生します。QUOTA を明示的に設定するか、GRANT UNLIMITED TABLESPACE TO user で全表領域への書き込みを許可してください。ALTER USER で表領域を変更する
-- デフォルト表領域を変更 ALTER USER app_user DEFAULT TABLESPACE new_app_data; -- 一時表領域を変更 ALTER USER app_user TEMPORARY TABLESPACE temp2; -- QUOTA を変更 ALTER USER app_user QUOTA 1G ON new_app_data; ALTER USER app_user QUOTA UNLIMITED ON new_app_data; -- QUOTA を取り消し(0 に設定: 新規書き込み不可) ALTER USER app_user QUOTA 0 ON old_data; -- ※ 既存オブジェクトは残るが、新規作成や拡張ができなくなる
ALTER USER で DEFAULT TABLESPACE を変更しても、既に作成済みのテーブルやインデックスは移動しません。変更後に新規作成するオブジェクトの格納先が変わるだけです。既存オブジェクトを移動するには
ALTER TABLE ... MOVE TABLESPACE new_ts を使います。QUOTA(使用量制限)の詳細
| QUOTA 設定 | 動作 |
|---|---|
| QUOTA 500M ON ts_name | ts_name に 500MB まで書き込み可能 |
| QUOTA 2G ON ts_name | ts_name に 2GB まで書き込み可能 |
| QUOTA UNLIMITED ON ts_name | ts_name の容量上限まで無制限に使用可能 |
| QUOTA 0 ON ts_name | ts_name への新規書き込み不可(既存オブジェクトは残る) |
| GRANT UNLIMITED TABLESPACE | 全表領域に UNLIMITED QUOTA(システム権限) |
-- デフォルト表領域 + インデックス用表領域に個別に QUOTA ALTER USER app_user QUOTA 1G ON app_data; ALTER USER app_user QUOTA 500M ON app_index; -- SYSTEM 表領域には QUOTA を設定しないのが原則 -- (SYSTEM にユーザーオブジェクトを作成すべきではない)
-- 全表領域に無制限 QUOTA(開発環境向け) GRANT UNLIMITED TABLESPACE TO dev_user; -- 取り消し REVOKE UNLIMITED TABLESPACE FROM dev_user; -- 注意: REVOKE すると個別の QUOTA 設定も 0 にリセットされる -- → REVOKE 後に必要な表領域の QUOTA を再設定する ALTER USER dev_user QUOTA 1G ON dev_data;
GRANT DBA TO user や GRANT RESOURCE TO user を実行すると、UNLIMITED TABLESPACE 権限が暗黙的に付与されます。RESOURCE ロールを REVOKE しても UNLIMITED TABLESPACE は残るため、個別に REVOKE が必要です。ユーザーの表領域設定を確認する SQL
-- ユーザーごとのデフォルト表領域と一時表領域
SELECT username, default_tablespace, temporary_tablespace, account_status
FROM dba_users
WHERE username NOT IN ('SYS','SYSTEM','ANONYMOUS','XDB')
ORDER BY username;
-- ユーザーごとの QUOTA 設定と使用量
SELECT username, tablespace_name,
CASE WHEN max_bytes = -1 THEN 'UNLIMITED'
ELSE TO_CHAR(ROUND(max_bytes/1024/1024)) || ' MB'
END AS quota,
ROUND(bytes/1024/1024, 1) AS used_mb
FROM dba_ts_quotas
ORDER BY username, tablespace_name;
-- UNLIMITED TABLESPACE 権限の確認
SELECT grantee, privilege FROM dba_sys_privs
WHERE privilege = 'UNLIMITED TABLESPACE'
ORDER BY grantee;
-- ユーザー APP_USER の表領域関連情報
SELECT 'DEFAULT_TS' AS info, default_tablespace AS value FROM dba_users WHERE username = 'APP_USER'
UNION ALL
SELECT 'TEMP_TS', temporary_tablespace FROM dba_users WHERE username = 'APP_USER'
UNION ALL
SELECT 'QUOTA: ' || tablespace_name,
CASE WHEN max_bytes = -1 THEN 'UNLIMITED'
ELSE ROUND(max_bytes/1024/1024) || 'MB (used: ' || ROUND(bytes/1024/1024,1) || 'MB)'
END
FROM dba_ts_quotas WHERE username = 'APP_USER';
DB 全体のデフォルト表領域を変更する
CREATE USER 時に DEFAULT TABLESPACE を省略したユーザーにはDB 全体のデフォルト表領域が適用されます。
-- 現在の DB デフォルト表領域を確認
SELECT property_name, property_value
FROM database_properties
WHERE property_name IN ('DEFAULT_PERMANENT_TABLESPACE', 'DEFAULT_TEMP_TABLESPACE');
-- DB デフォルト表領域を変更(今後作成するユーザーに影響)
ALTER DATABASE DEFAULT TABLESPACE app_data;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
-- 既存ユーザーのデフォルト表領域は変わらない(新規ユーザーのみ)
ORA-01950: 表領域に対する権限がない
ORA-01950: no privileges on tablespace 'USERS'
| 原因 | 対処法 |
|---|---|
| QUOTA が設定されていない(0) | ALTER USER user QUOTA 500M ON tablespace_name |
| QUOTA が不足(使い切った) | ALTER USER user QUOTA UNLIMITED ON tablespace_name |
| UNLIMITED TABLESPACE が REVOKE された | GRANT UNLIMITED TABLESPACE TO user(または個別 QUOTA) |
| デフォルト表領域とは別の表領域に CREATE TABLE した | CREATE TABLE 時に TABLESPACE 句を指定、またはその表領域にも QUOTA を付与 |
-- (1) ユーザーの QUOTA を確認 SELECT tablespace_name, max_bytes, bytes FROM dba_ts_quotas WHERE username = 'APP_USER'; -- max_bytes = 0 なら QUOTA なし → ORA-01950 の原因 -- (2) QUOTA を付与 ALTER USER app_user QUOTA UNLIMITED ON users; -- (3) 再度 CREATE TABLE を実行して確認
既存オブジェクトを別の表領域に移動する
-- テーブルを別の表領域に移動
ALTER TABLE employees MOVE TABLESPACE new_data;
-- インデックスの再構築(MOVE 後は UNUSABLE になるため必須)
ALTER INDEX idx_emp_dept REBUILD TABLESPACE new_index;
-- テーブルの全インデックスを一括再構築
BEGIN
FOR rec IN (
SELECT index_name FROM user_indexes WHERE table_name = 'EMPLOYEES'
) LOOP
EXECUTE IMMEDIATE 'ALTER INDEX ' || rec.index_name || ' REBUILD';
END LOOP;
END;
/
テーブルを MOVE すると ROWID が変わるため、テーブル上の全インデックスが UNUSABLE になります。MOVE 後に必ず ALTER INDEX … REBUILD を実行してください。ONLINE オプションを付ければ DML をブロックせずに再構築できます。
実務パターン集
パターン(1): アプリケーション用ユーザーの作成(表領域分離)
-- 表領域の作成
CREATE TABLESPACE app_data DATAFILE '/oracle/oradata/app_data01.dbf' SIZE 2G AUTOEXTEND ON;
CREATE TABLESPACE app_index DATAFILE '/oracle/oradata/app_idx01.dbf' SIZE 1G AUTOEXTEND ON;
-- ユーザー作成
CREATE USER app_user IDENTIFIED BY secure_pass
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON app_data
QUOTA UNLIMITED ON app_index;
GRANT CREATE SESSION, CREATE TABLE, CREATE INDEX TO app_user;
パターン(2): 開発者にデフォルト表領域 + 制限付き QUOTA
CREATE USER dev_tanaka IDENTIFIED BY dev_pass
DEFAULT TABLESPACE dev_data
TEMPORARY TABLESPACE temp
QUOTA 500M ON dev_data;
-- 500MB を超えると CREATE TABLE / INSERT でエラー
-- → 開発者がディスクを使い過ぎるのを防止
パターン(3): 既存ユーザーの表領域移行
-- (1) 新しい表領域を作成 CREATE TABLESPACE new_data DATAFILE '/oracle/new_data01.dbf' SIZE 5G AUTOEXTEND ON; -- (2) ユーザーのデフォルト表領域を変更 ALTER USER app_user DEFAULT TABLESPACE new_data; ALTER USER app_user QUOTA UNLIMITED ON new_data; -- (3) 既存テーブルを移動 ALTER TABLE app_user.orders MOVE TABLESPACE new_data; -- テーブルごとに MOVE + インデックス REBUILD が必要
パターン(4): 全ユーザーの QUOTA を一覧で確認
-- QUOTA 設定の全一覧(UNLIMITED / 具体的なサイズ / 使用量)
SELECT u.username, u.default_tablespace,
NVL(q.tablespace_name, '(no quota)') AS quota_ts,
CASE WHEN q.max_bytes = -1 THEN 'UNLIMITED'
WHEN q.max_bytes IS NULL THEN '-'
ELSE ROUND(q.max_bytes/1024/1024) || 'MB'
END AS quota,
ROUND(NVL(q.bytes,0)/1024/1024, 1) AS used_mb
FROM dba_users u
LEFT JOIN dba_ts_quotas q ON u.username = q.username
WHERE u.username NOT IN ('SYS','SYSTEM','ANONYMOUS','XDB','DBSNMP','AUDSYS')
ORDER BY u.username, q.tablespace_name;
よくある質問
SELECT property_value FROM database_properties WHERE property_name='DEFAULT_PERMANENT_TABLESPACE' で確認できます。SYSTEM 表領域に作成される可能性もあるため、常に明示的に指定することを推奨します。QUOTA UNLIMITED ON ts_name は特定の表領域に対する無制限の書き込み権限です。GRANT UNLIMITED TABLESPACE は全表領域に対するシステム権限です。本番環境では個別の表領域に QUOTA を設定する方が安全です。ALTER INDEX idx_name REBUILD で再構築してください。REBUILD ONLINE オプションを使えば DML を止めずに再構築可能です。REVOKE UNLIMITED TABLESPACE すると QUOTA が 0 にリセットされます。個別に QUOTA を再設定してください。まとめ
表領域へのユーザー割り当ての要点をまとめます。
| やりたいこと | SQL |
|---|---|
| ユーザー作成時に表領域を指定 | CREATE USER … DEFAULT TABLESPACE ts TEMPORARY TABLESPACE temp QUOTA 500M ON ts |
| デフォルト表領域を変更 | ALTER USER user DEFAULT TABLESPACE new_ts |
| QUOTA を設定 | ALTER USER user QUOTA 1G ON ts_name |
| 全表領域に無制限 | GRANT UNLIMITED TABLESPACE TO user |
| QUOTA を取り消し | ALTER USER user QUOTA 0 ON ts_name |
| デフォルト表領域の確認 | SELECT default_tablespace FROM dba_users WHERE username = ‘USER’ |
| QUOTA の確認 | SELECT tablespace_name, max_bytes, bytes FROM dba_ts_quotas WHERE username = … |
| 既存テーブルを別表領域に移動 | ALTER TABLE t MOVE TABLESPACE new_ts + ALTER INDEX idx REBUILD |
ユーザーの作成と権限付与は「ユーザー作成と権限付与の完全ガイド」、表領域の管理全般は「表領域(Tablespace)完全ガイド」も併せて参照してください。

