【Oracle】表領域にユーザーを割り当てる方法|DEFAULT TABLESPACE・QUOTA・一時表領域・確認 SQL まで解説

【Oracle】表領域にユーザーを割り当てる方法|DEFAULT TABLESPACE・QUOTA・一時表領域・確認 SQL まで解説 Oracle

Oracle でユーザーがテーブルやインデックスを作成する際、オブジェクトはデフォルト表領域(DEFAULT TABLESPACE)に格納されます。適切に表領域を割り当てることで、ストレージの分離、QUOTA(使用量制限)の管理、運用の効率化が実現できます。

本記事では、ユーザーへの表領域の割り当て、QUOTA の設定変更方法確認 SQLORA-01950 の対処まで解説します。

この記事でわかること
・CREATE USER 時に DEFAULT TABLESPACE / TEMPORARY TABLESPACE を指定する方法
・ALTER USER で表領域を変更する方法
・QUOTA で表領域の使用量を制限する方法
・ユーザーの表領域設定を確認する SQL
・DB 全体のデフォルト表領域を変更する方法
・ORA-01950(表領域に対する権限がない)の原因と対処
スポンサーリンク

CREATE USER 時に表領域を指定する

SQL(ユーザー作成時に表領域を指定)
-- デフォルト表領域と一時表領域を指定
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 がエラーになる
ユーザーを作成しただけでは、デフォルト表領域への書き込み権限(QUOTA)がありません。CREATE TABLE 時に ORA-01950: no privileges on tablespace が発生します。QUOTA を明示的に設定するか、GRANT UNLIMITED TABLESPACE TO user で全表領域への書き込みを許可してください。

ALTER USER で表領域を変更する

SQL(デフォルト表領域の変更)
-- デフォルト表領域を変更
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;
-- ※ 既存オブジェクトは残るが、新規作成や拡張ができなくなる
DEFAULT TABLESPACE の変更は既存オブジェクトに影響しない
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(システム権限)
SQL(複数表領域への QUOTA 設定)
-- デフォルト表領域 + インデックス用表領域に個別に QUOTA
ALTER USER app_user QUOTA 1G ON app_data;
ALTER USER app_user QUOTA 500M ON app_index;

-- SYSTEM 表領域には QUOTA を設定しないのが原則
-- (SYSTEM にユーザーオブジェクトを作成すべきではない)
SQL(GRANT UNLIMITED TABLESPACE: 全表領域に無制限)
-- 全表領域に無制限 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;
UNLIMITED TABLESPACE はDBAロール/RESOURCE ロールに含まれる
GRANT DBA TO userGRANT RESOURCE TO user を実行すると、UNLIMITED TABLESPACE 権限が暗黙的に付与されます。RESOURCE ロールを REVOKE しても UNLIMITED TABLESPACE は残るため、個別に REVOKE が必要です。

ユーザーの表領域設定を確認する SQL

SQL(デフォルト表領域の確認)
-- ユーザーごとのデフォルト表領域と一時表領域
SELECT username, default_tablespace, temporary_tablespace, account_status
FROM dba_users
WHERE username NOT IN ('SYS','SYSTEM','ANONYMOUS','XDB')
ORDER BY username;
SQL(QUOTA の確認)
-- ユーザーごとの 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;
SQL(特定ユーザーの全情報をまとめて確認)
-- ユーザー 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 全体のデフォルト表領域が適用されます。

SQL(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 を付与
SQL(ORA-01950 の診断と対処)
-- (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 を実行して確認

既存オブジェクトを別の表領域に移動する

SQL(テーブル / インデックスの移動)
-- テーブルを別の表領域に移動
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;
/
ALTER TABLE MOVE 後はインデックスの再構築が必須
テーブルを MOVE すると ROWID が変わるため、テーブル上の全インデックスが UNUSABLE になります。MOVE 後に必ず ALTER INDEX … REBUILD を実行してください。ONLINE オプションを付ければ DML をブロックせずに再構築できます。

実務パターン集

パターン(1): アプリケーション用ユーザーの作成(表領域分離)

SQL
-- 表領域の作成
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

SQL
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): 既存ユーザーの表領域移行

SQL
-- (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 を一覧で確認

SQL
-- 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;

よくある質問

QDEFAULT TABLESPACE を省略するとどうなりますか?
ADB 全体のデフォルト表領域(通常 USERS)が適用されます。SELECT property_value FROM database_properties WHERE property_name='DEFAULT_PERMANENT_TABLESPACE' で確認できます。SYSTEM 表領域に作成される可能性もあるため、常に明示的に指定することを推奨します。
QQUOTA UNLIMITED と GRANT UNLIMITED TABLESPACE の違いは?
AQUOTA UNLIMITED ON ts_name特定の表領域に対する無制限の書き込み権限です。GRANT UNLIMITED TABLESPACE全表領域に対するシステム権限です。本番環境では個別の表領域に QUOTA を設定する方が安全です。
QQUOTA を変更すると既存データはどうなりますか?
A既存のテーブルやデータは影響を受けません。QUOTA を 0 にしても既存オブジェクトは残ります。ただし新規の INSERT や CREATE TABLE はエラーになります。QUOTA を超過している場合、テーブルの EXTEND(自動拡張)が失敗します。
QALTER TABLE MOVE で表領域を変更したのにインデックスが使えなくなりました
AALTER TABLE MOVE 後は ROWID が変わるため、全インデックスが UNUSABLE になります。MOVE 後に ALTER INDEX idx_name REBUILD で再構築してください。REBUILD ONLINE オプションを使えば DML を止めずに再構築可能です。
QSYSTEM 表領域をデフォルトにしてはいけないのはなぜですか?
ASYSTEM 表領域は Oracle のデータディクショナリ(内部管理テーブル)を格納する領域です。ユーザーオブジェクトで SYSTEM 表領域が満杯になるとDB 全体が停止するリスクがあります。ユーザーオブジェクト用には必ず別の表領域を使用してください。
QRESOURCE ロールを REVOKE したら CREATE TABLE がエラーになりました
ARESOURCE ロールには UNLIMITED TABLESPACE 権限が含まれています。REVOKE RESOURCE してもUNLIMITED TABLESPACE は残りますが、再度 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)完全ガイド」も併せて参照してください。