【完全ガイド】ORA-01950: no privileges on tablespace の原因と解決方法|QUOTA・DEFAULT TABLESPACE・RESOURCE ロール 徹底解説

【完全ガイド】ORA-01950: no privileges on tablespace の原因と解決方法|QUOTA・DEFAULT TABLESPACE・RESOURCE ロール 徹底解説

Oracle 開発者・DBA がアプリケーション導入時によく遭遇する典型的エラー:

SQL> CREATE TABLE emp (id NUMBER, name VARCHAR2(100));
CREATE TABLE emp (id NUMBER, name VARCHAR2(100))
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'

**「テーブルスペースに権限なし」**というシンプルなメッセージ。Oracle のスペース管理における重要な制約です:

  • ユーザーには QUOTA(領域割当)が必要
  • QUOTA 未付与ではセグメント作成不可
  • ORA-01031 (insufficient privileges) とは別の概念
  • オブジェクトごとの権限とは別レベルの話

このエラーの本質は、Oracle の2段階権限モデル:

1. システム権限: CREATE TABLE 等(何ができるか)
2. QUOTA:      テーブルスペース領域の使用許可(どこに置けるか)

両方が必要。CREATE TABLE 権限があっても、QUOTA なしでは領域確保できない

現場で最も典型的なパターン:

  • アプリユーザー作成後QUOTA 未付与
  • DEFAULT TABLESPACE を変更したが QUOTA なし
  • RESOURCE ロール12c での動作変更
  • QUOTA を使い切った(データ増加)
  • CTAS で領域確保失敗
  • INSERT で新規エクステント必要
  • CREATE INDEX で領域確保
  • Data Pump インポート で対象テーブルスペース権限不足
  • IBM FileNetSterling OMS などの導入時
  • Rails マイグレーションで新テーブル作成

多くの日本語記事が「QUOTA を付与せよ」で終わりますが、実務では:

  • 姉妹エラーORA-01031, ORA-01536)との厳密な違い
  • QUOTA UNLIMITED vs UNLIMITED TABLESPACE 権限の使い分け
  • Oracle 12c での RESOURCE ロール変更UNLIMITED TABLESPACE 削除)
  • DBA_TS_QUOTAS ビューの活用
  • SYSTEM テーブルスペースの禁忌
  • 業務アプリ(FileNet、Sterling OMS 等)のQUOTA 要件
  • セキュリティ監査UNLIMITED TABLESPACE の監査懸念)
  • CDC / GoldenGate 環境での対応
  • Rails / Django マイグレーションでの発生

さらに、Oracle 12c 以降の重要な変更を理解する必要があります:

Oracle 11g 以前:
CREATE USER + GRANT RESOURCE → 自動的に UNLIMITED TABLESPACE

Oracle 12c 以降:
CREATE USER + GRANT RESOURCE → UNLIMITED TABLESPACE 含まれず
→ 従来のスクリプトが動かなくなる
→ ORA-01950 頻発

多くのレガシーアプリ導入手順書がこの変更を反映していないため、DBA が手動で QUOTA 設定を追加する必要があります。

本記事では、ORA-01950: no privileges on tablespace完全な原因と解決方法を、リファレンスとして実用的に整理します。10大発生パターン、姉妹エラーとの比較、5つの解決策、12c 以降の変更、Rails/Java/Python 対応、実践シナリオ、FAQまで完全網羅。この1本で ORA-01950 を根本から解決できるようになります。


目次

結論:QUOTA を付与

時間がない方向けに、最速の対処を先に示します。

エラーメッセージの読み方

ORA-01950: no privileges on tablespace 'TABLESPACE_NAME'
                                        ↑
                              QUOTA 未付与のテーブルスペース

= ユーザーはそのテーブルスペースに領域確保できない

最速の診断

-- ① 現在の QUOTA 状態
SELECT username, tablespace_name, 
       bytes/1024/1024 AS used_mb,
       max_bytes/1024/1024 AS max_mb
FROM dba_ts_quotas
WHERE username = 'YOUR_USER';

-- ② DEFAULT TABLESPACE
SELECT username, default_tablespace, temporary_tablespace
FROM dba_users
WHERE username = 'YOUR_USER';

-- ③ UNLIMITED TABLESPACE 権限
SELECT * FROM dba_sys_privs 
WHERE grantee = 'YOUR_USER' 
  AND privilege = 'UNLIMITED TABLESPACE';

5つの解決策

#手法使う場面
QUOTA UNLIMITED開発、通常
QUOTA 数値指定監査・制限重視
UNLIMITED TABLESPACE 権限全体権限
DEFAULT TABLESPACE 変更適切な TS へ
専用テーブルスペース作成アプリ用

姉妹エラー3種の比較

エラー意味
ORA-01950QUOTA 未付与(領域確保不可)
ORA-01031システム権限不足(操作自体不可)
ORA-01536QUOTA 超過(付与済みだが使い切り)

権限管理3兄弟、状況により使い分け。

詳細は以下で解説します。


Oracle のスペース管理モデル

2 段階の権限

システム権限 (CREATE TABLE 等):

GRANT CREATE TABLE TO app_user;
-- 何ができるか(操作の権限)

QUOTA (テーブルスペース領域割当):

ALTER USER app_user QUOTA UNLIMITED ON USERS;
-- どこに置けるか(領域の権限)

両方必要、片方だけでは動かない。

QUOTA の種類

-- 無制限
ALTER USER u QUOTA UNLIMITED ON tbs;

-- 具体的な数値
ALTER USER u QUOTA 5G ON tbs;
ALTER USER u QUOTA 500M ON tbs;

-- 全 QUOTA 剥奪
ALTER USER u QUOTA 0 ON tbs;

UNLIMITED TABLESPACE 権限

全テーブルスペースで無制限(強力):

GRANT UNLIMITED TABLESPACE TO u;
-- 個別 QUOTA 不要になる
-- ただし監査上懸念あり

Oracle 12c での重要な変更

RESOURCE ロールの変更

Oracle 11g 以前:

GRANT RESOURCE TO u;
-- 自動的に UNLIMITED TABLESPACE 含まれる
-- → 領域無制限

Oracle 12c 以降:

GRANT RESOURCE TO u;
-- UNLIMITED TABLESPACE 削除!
-- → 追加で明示的な QUOTA 必要
-- → 従来スクリプトで ORA-01950 頻発

12c 対応スクリプト

-- 12c 以降の推奨
CREATE USER app_user IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO app_user;
ALTER USER app_user QUOTA UNLIMITED ON USERS;   -- ← 必須追加

この行を追加しないと、レガシースクリプトが失敗。


【原因①】QUOTA 未付与(最頻出)

症状

-- ユーザー作成、QUOTA 未設定
CREATE USER dbaclass IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO dbaclass;

-- 12c+ では UNLIMITED TABLESPACE なし
CONNECT dbaclass/password;

CREATE TABLE emp AS SELECT * FROM user_objects;
-- ORA-01950: no privileges on tablespace 'USERS'

診断

SELECT username, tablespace_name, max_bytes
FROM dba_ts_quotas
WHERE username = 'DBACLASS';
-- no rows selected → QUOTA 未付与

解決

A. QUOTA 数値指定:

ALTER USER dbaclass QUOTA 5G ON USERS;

B. QUOTA UNLIMITED:

ALTER USER dbaclass QUOTA UNLIMITED ON USERS;

C. UNLIMITED TABLESPACE 権限:

GRANT UNLIMITED TABLESPACE TO dbaclass;

権限系は ORA-01031: insufficient privileges の記事、ORA-01749: may not GRANT/REVOKE to self の記事も参照してください。


【原因②】QUOTA を使い切った

症状

-- QUOTA 1G 設定
ALTER USER app QUOTA 1G ON USERS;

-- 大量データ挿入で1GB 到達
INSERT INTO large_table SELECT * FROM source_table;
-- ORA-01950: no privileges on tablespace 'USERS'
-- 実は ORA-01536: space quota exceeded の可能性

診断

SELECT username, tablespace_name,
       bytes/1024/1024 AS used_mb,
       max_bytes/1024/1024 AS max_mb
FROM dba_ts_quotas
WHERE username = 'APP';
-- used_mb が max_mb に近い/超えている

解決

QUOTA 拡張:

ALTER USER app QUOTA 10G ON USERS;

-- または無制限
ALTER USER app QUOTA UNLIMITED ON USERS;

【原因③】DEFAULT TABLESPACE 変更

シナリオ

-- 変更前: USERS (QUOTA あり)
-- 変更後: APP_DATA (QUOTA なし)

ALTER USER app DEFAULT TABLESPACE APP_DATA;

CREATE TABLE new_tbl (id NUMBER);
-- ORA-01950 (APP_DATA に QUOTA なし)

解決

新 DEFAULT TABLESPACE に QUOTA:

ALTER USER app QUOTA UNLIMITED ON APP_DATA;

【原因④】CTAS で領域確保失敗

症状

CREATE TABLE backup_tbl AS SELECT * FROM source_tbl;
-- 大量データ → QUOTA 不足 → ORA-01950

解決

-- 事前に QUOTA 拡張
ALTER USER app QUOTA UNLIMITED ON USERS;

-- または別テーブルスペース指定
CREATE TABLE backup_tbl TABLESPACE app_backup 
AS SELECT * FROM source_tbl;

【原因⑤】INSERT で新規エクステント

症状

-- テーブルは既存、INSERT で拡張時
INSERT INTO big_table SELECT * FROM source;
-- 新エクステント確保時 QUOTA 不足 → ORA-01950

解決

QUOTA 事前拡張、監視スクリプトで予告。


【原因⑥】CREATE INDEX で領域確保

症状

CREATE INDEX idx_emp_name ON emp(name);
-- インデックス格納先 QUOTA 不足 → ORA-01950

解決

インデックス用テーブルスペース QUOTA 設定:

ALTER USER app QUOTA UNLIMITED ON app_index;

-- インデックス作成時に指定
CREATE INDEX idx_emp_name ON emp(name) TABLESPACE app_index;

【原因⑦】Data Pump インポート

シナリオ

# インポート時
impdp app/pw dumpfile=data.dmp

インポートユーザーが対象テーブルスペースに QUOTA なし:

ORA-01950: no privileges on tablespace 'APP_DATA'

解決

-- インポート前に QUOTA 設定
ALTER USER app QUOTA UNLIMITED ON APP_DATA;

-- または REMAP_TABLESPACE で別 TS へ
impdp app/pw dumpfile=data.dmp REMAP_TABLESPACE=source_ts:target_ts

Data Pump の詳細は Oracle Data Pump 使い方の記事も参照してください。


【原因⑧】IBM FileNet / Sterling OMS 導入

シナリオ

IBM FileNet Content Engine:

GCD (Global Configuration Data) 導入時
Oracle ユーザーの DEFAULT TABLESPACE が SYSTEM
→ SYSTEM テーブルスペースには QUOTA なし
→ ORA-01950: no privileges on tablespace 'SYSTEM'

解決

A. 専用テーブルスペース作成(推奨):

CREATE TABLESPACE p8_gcd DATAFILE '/u01/oradata/p8_gcd.dbf' SIZE 500M
  AUTOEXTEND ON NEXT 100M MAXSIZE 10G;

ALTER USER p8_user DEFAULT TABLESPACE p8_gcd;
ALTER USER p8_user QUOTA UNLIMITED ON p8_gcd;

B. SYSTEM 使用は絶対避ける(Oracle 推奨に反する)。

Sterling OMS の場合

必要な権限セット:

  • 各種 CREATE 権限
  • ALTER SESSION
  • QUOTA on tablespace_name ← 忘れがち

【原因⑨】Rails / Django マイグレーション

シナリオ

# Rails マイグレーション
class CreateUsers < ActiveRecord::Migration[8.0]
  def change
    create_table :users do |t|
      t.string :name
    end
  end
end

# 実行
$ rails db:migrate
-- ORA-01950: no privileges on tablespace 'USERS'

解決

A. DBA 側で事前 QUOTA 設定:

ALTER USER rails_user QUOTA UNLIMITED ON USERS;

B. マイグレーション先頭で権限確認スクリプト:

class SetupPermissions < ActiveRecord::Migration[8.0]
  def up
    quota = execute("SELECT max_bytes FROM dba_ts_quotas 
                     WHERE username = USER").first
    if quota.nil? || quota == 0
      raise "QUOTA not set. DBA action required."
    end
  end
end

Rails 8 系の詳細は Rails 8 アップグレードガイドの記事、rails db:migrate 使い方の記事、pending migration エラーの記事も参照してください。


【原因⑩】RESOURCE ロール 12c 変更未認識

症状

11g で動くスクリプトを 12c+ で実行:

CREATE USER new_app IDENTIFIED BY pw;
GRANT CONNECT, RESOURCE TO new_app;
-- 11g では UNLIMITED TABLESPACE 自動付与
-- 12c+ では付与されない

CONNECT new_app/pw
CREATE TABLE t (id NUMBER);
-- ORA-01950

解決

12c+ 対応スクリプト:

CREATE USER new_app IDENTIFIED BY pw;
GRANT CONNECT, RESOURCE TO new_app;
ALTER USER new_app QUOTA UNLIMITED ON USERS;   -- ← 必須追加

診断ツール完全リファレンス

DBA_TS_QUOTAS

-- ユーザーの QUOTA 状態
SELECT username, tablespace_name,
       bytes/1024/1024 AS used_mb,
       max_bytes/1024/1024 AS max_mb,
       CASE 
         WHEN max_bytes = -1 THEN 'UNLIMITED'
         ELSE ROUND(bytes * 100 / max_bytes) || '%'
       END AS pct
FROM dba_ts_quotas
WHERE username = 'YOUR_USER';

DBA_USERS

SELECT username, default_tablespace, temporary_tablespace,
       account_status, created
FROM dba_users
WHERE username = 'YOUR_USER';

DBA_SYS_PRIVS

-- UNLIMITED TABLESPACE 権限
SELECT * FROM dba_sys_privs 
WHERE grantee = 'YOUR_USER'
  AND privilege LIKE '%TABLESPACE%';

使用状況全体

SELECT ts.tablespace_name,
       ROUND(ts.total_bytes/1024/1024/1024, 2) AS total_gb,
       ROUND(used.used_bytes/1024/1024/1024, 2) AS used_gb,
       ROUND(used.used_bytes * 100 / ts.total_bytes) AS pct
FROM (SELECT tablespace_name, SUM(bytes) AS total_bytes
      FROM dba_data_files GROUP BY tablespace_name) ts
JOIN (SELECT tablespace_name, SUM(bytes) AS used_bytes
      FROM dba_segments GROUP BY tablespace_name) used
  ON ts.tablespace_name = used.tablespace_name;

5つの解決策 完全リファレンス

解決策① QUOTA UNLIMITED

ALTER USER app_user QUOTA UNLIMITED ON USERS;
-- 該当テーブルスペースで無制限

解決策② QUOTA 数値指定

-- サイズ指定
ALTER USER app_user QUOTA 5G ON USERS;
ALTER USER app_user QUOTA 500M ON APP_DATA;

-- 監査対応で推奨(無制限より制御しやすい)

解決策③ UNLIMITED TABLESPACE 権限

GRANT UNLIMITED TABLESPACE TO app_user;
-- 全テーブルスペースで無制限
-- ⚠️ SYSTEM/SYSAUX にも書き込み可能に
-- 監査懸念あり

解決策④ DEFAULT TABLESPACE 変更

-- 適切なテーブルスペースへ
ALTER USER app_user DEFAULT TABLESPACE app_data;
ALTER USER app_user QUOTA UNLIMITED ON app_data;

-- SYSTEM は絶対避ける

解決策⑤ 専用テーブルスペース作成

-- アプリ用テーブルスペース
CREATE TABLESPACE app_data 
  DATAFILE '/u01/oradata/app_data.dbf' SIZE 500M
  AUTOEXTEND ON NEXT 100M MAXSIZE 10G;

-- ユーザーに割当
ALTER USER app_user DEFAULT TABLESPACE app_data;
ALTER USER app_user QUOTA UNLIMITED ON app_data;

Oracle テーブルスペース関連は Oracle テーブル一覧 取得の記事も参照してください。


Rails / Java / Python 対応

Rails ActiveRecord

マイグレーション時のエラーハンドリング:

class CreateUsers < ActiveRecord::Migration[8.0]
  def change
    create_table :users do |t|
      t.string :name
    end
  end
rescue ActiveRecord::StatementInvalid => e
  if e.message.include?("ORA-01950")
    Rails.logger.fatal "QUOTA not set. Contact DBA."
    raise "Database QUOTA insufficient"
  end
end

Java (JDBC)

try {
    stmt.execute("CREATE TABLE emp (...)");
} catch (SQLException e) {
    if (e.getErrorCode() == 1950) {
        logger.error("Tablespace QUOTA missing: " + e.getMessage());
        alertingService.warn("DBA action needed");
    }
}

Python (oracledb)

import oracledb

try:
    cursor.execute("CREATE TABLE emp (...)")
except oracledb.DatabaseError as e:
    error_obj, = e.args
    if error_obj.code == 1950:
        print(f"QUOTA missing: {error_obj.message}")

実践シナリオ

シナリオ1:新規アプリユーザー作成の標準手順

-- 1. 専用テーブルスペース
CREATE TABLESPACE myapp_data 
  DATAFILE '/u01/oradata/myapp_data.dbf' SIZE 500M
  AUTOEXTEND ON NEXT 100M MAXSIZE 20G;

CREATE TABLESPACE myapp_index 
  DATAFILE '/u01/oradata/myapp_index.dbf' SIZE 500M
  AUTOEXTEND ON NEXT 100M MAXSIZE 10G;

-- 2. ユーザー作成
CREATE USER myapp IDENTIFIED BY strong_password
  DEFAULT TABLESPACE myapp_data
  TEMPORARY TABLESPACE temp;

-- 3. 権限付与
GRANT CONNECT, RESOURCE TO myapp;
GRANT CREATE SESSION, CREATE TABLE, CREATE INDEX TO myapp;

-- 4. QUOTA 設定
ALTER USER myapp QUOTA UNLIMITED ON myapp_data;
ALTER USER myapp QUOTA UNLIMITED ON myapp_index;

シナリオ2:QUOTA 監視

-- 80% 到達時アラート
SELECT username, tablespace_name,
       ROUND(bytes * 100 / max_bytes) AS pct
FROM dba_ts_quotas
WHERE max_bytes > 0
  AND bytes * 100 / max_bytes > 80;

シナリオ3:Rails での事前確認

# lib/tasks/db_check.rake
namespace :db do
  task :check_quota => :environment do
    result = ActiveRecord::Base.connection.select_all(<<-SQL)
      SELECT tablespace_name, bytes, max_bytes
      FROM dba_ts_quotas
      WHERE username = USER
    SQL
    
    if result.empty?
      puts "WARNING: No QUOTA set for current user"
    end
  end
end

# 実行
# $ rails db:check_quota

Rails 8 系の詳細は Rails 8 アップグレードガイドの記事も参照してください。

シナリオ4:IBM FileNet 導入時の準備

-- FileNet 用テーブルスペース
CREATE TABLESPACE p8_gcd DATAFILE '/u01/oradata/p8_gcd.dbf' 
  SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 5G;

CREATE TABLESPACE p8_os DATAFILE '/u01/oradata/p8_os.dbf' 
  SIZE 1G AUTOEXTEND ON NEXT 500M MAXSIZE 50G;

-- ユーザー
CREATE USER p8_user IDENTIFIED BY password
  DEFAULT TABLESPACE p8_gcd
  TEMPORARY TABLESPACE temp;

GRANT CONNECT, RESOURCE TO p8_user;
ALTER USER p8_user QUOTA UNLIMITED ON p8_gcd;
ALTER USER p8_user QUOTA UNLIMITED ON p8_os;

シナリオ5:Data Pump インポート前準備

-- インポート先テーブルスペースが違う場合
CREATE TABLESPACE prod_data DATAFILE ... SIZE 10G;
ALTER USER app_user QUOTA UNLIMITED ON prod_data;

-- インポート実行
impdp app_user/pw dumpfile=data.dmp \
  REMAP_TABLESPACE=old_ts:prod_data

シナリオ6:バッチ QUOTA 設定スクリプト

-- 複数ユーザーの QUOTA 一括設定
DECLARE
  v_ts VARCHAR2(30) := 'USERS';
BEGIN
  FOR r IN (SELECT username FROM dba_users 
            WHERE username LIKE 'APP_%') LOOP
    EXECUTE IMMEDIATE 
      'ALTER USER ' || r.username || ' QUOTA UNLIMITED ON ' || v_ts;
  END LOOP;
END;
/

シナリオ7:Docker Oracle でのテスト

docker exec -it oracle-xe sqlplus system/oracle <<EOF
CREATE USER testu IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO testu;
CONNECT testu/password
CREATE TABLE t (id NUMBER);
-- ORA-01950

CONNECT system/oracle
ALTER USER testu QUOTA UNLIMITED ON USERS;

CONNECT testu/password
CREATE TABLE t (id NUMBER);
-- OK
EOF

Docker 関連は docker daemon 接続エラーの記事、Docker no space left on device の記事も参照してください。

シナリオ8:QUOTA 増加の必要性判定

-- 現在の使用状況
SELECT username, tablespace_name,
       ROUND(bytes/1024/1024/1024, 2) AS used_gb,
       ROUND(max_bytes/1024/1024/1024, 2) AS max_gb,
       ROUND(bytes * 100 / max_bytes) AS pct
FROM dba_ts_quotas
WHERE username = 'APP'
ORDER BY pct DESC;

-- 90% 超過なら拡張検討

シナリオ9:CI/CD デプロイでの確認

- name: Check QUOTA
  run: |
    sqlplus -s $DB_USER/$DB_PW <<EOF
    WHENEVER SQLERROR EXIT SQL.SQLCODE
    DECLARE
      v_max NUMBER;
    BEGIN
      SELECT NVL(MAX(max_bytes), 0) INTO v_max
      FROM dba_ts_quotas
      WHERE username = USER;
      IF v_max = 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'QUOTA not set');
      END IF;
    END;
    /
    EOF

Kamal 2 デプロイの詳細は Kamal 2 デプロイの記事を参照してください。

シナリオ10:Autonomous DB

Autonomous DB では
- ADMIN が QUOTA UNLIMITED
- 通常ユーザーも問題なし
- ただしプロビジョニングされたユーザーは要確認

トラブルシューティング

QUOTA 設定しても効かない

セッションキャッシュの可能性、再接続推奨。

DEFAULT TABLESPACE 確認忘れ

SELECT default_tablespace FROM dba_users WHERE username = 'APP';
-- 実際のテーブル作成先確認

UNLIMITED TABLESPACE の監査懸念

個別 QUOTA 推奨(SYSTEM/SYSAUX への書き込み防止)。

CDC / GoldenGate 環境

ターゲット側UNLIMITED TABLESPACE 推奨、バッチロード対応。

Rails 開発環境

開発初期は UNLIMITED本番は数値指定推奨。

PostgreSQL からの移行

PG はテーブルスペース QUOTA なし、Oracle 移行時は明示設定必須。


よくある質問(FAQ)

Q1. ORA-01950 と ORA-01031 の違い

  • 01950: QUOTA 未付与(領域確保不可)
  • 01031: システム権限不足(操作自体不可)

Q2. ORA-01536 との違い

  • 01950: QUOTA 未付与
  • 01536: QUOTA 超過(付与済み)

Q3. UNLIMITED TABLESPACE vs QUOTA UNLIMITED

  • UNLIMITED TABLESPACE: 全 TS で無制限(システム権限)
  • QUOTA UNLIMITED ON TS: 特定 TS で無制限

Q4. 12c で何が変わった

RESOURCE ロールから UNLIMITED TABLESPACE 削除

Q5. SYSTEM テーブルスペース使用の是非

絶対避ける、Oracle の内部管理用。

Q6. 監査対応の推奨

QUOTA 数値指定UNLIMITED TABLESPACE は監査懸念)。

Q7. Rails での対応

DBA に事前依頼、または開発環境で自動化。

Q8. Java での対応

エラーコード 1950 検出、DBA 通知。

Q9. IBM FileNet 導入

専用テーブルスペース + UNLIMITED QUOTA 必須。

Q10. Data Pump インポート

REMAP_TABLESPACE or 事前 QUOTA 設定

Q11. Autonomous DB での挙動

通常問題なし、ADMIN で管理。

Q12. パフォーマンスへの影響

QUOTA 自体は影響なし、設定の有無が問題。


参考リンク

Oracle 公式


まとめ

ORA-01950: no privileges on tablespace の要点を再整理します。

エラーの本質

ユーザーが指定テーブルスペースに QUOTA なし
→ 領域確保できない
→ セグメント(テーブル/インデックス)作成不可
→ CREATE / INSERT / CTAS で失敗

エラーメッセージの読み方

ORA-01950: no privileges on tablespace 'TABLESPACE_NAME'
                                        ↑
                              QUOTA 未付与のテーブルスペース

権限管理3兄弟

エラー意味
ORA-01950QUOTA 未付与
ORA-01031システム権限不足
ORA-01536QUOTA 超過

12c 以降の重要変更

RESOURCE ロール:
- 11g 以前: UNLIMITED TABLESPACE 含まれる
- 12c 以降: UNLIMITED TABLESPACE 削除
→ 従来スクリプトが動かない
→ 明示的な QUOTA 設定が必須

10大原因

#原因対処
QUOTA 未付与ALTER USER QUOTA
QUOTA 使い切り拡張
DEFAULT TABLESPACE 変更新 TS に QUOTA
CTAS 領域確保QUOTA 事前拡張
INSERT 拡張QUOTA 拡張
CREATE INDEX索引 TS に QUOTA
Data PumpREMAP_TABLESPACE
IBM FileNet 等専用 TS
Rails migration事前 QUOTA
12c RESOURCE 変更UNLIMITED TABLESPACE 明示

5つの解決策

-- ① QUOTA UNLIMITED(開発推奨)
ALTER USER app_user QUOTA UNLIMITED ON USERS;

-- ② QUOTA 数値(監査推奨)
ALTER USER app_user QUOTA 5G ON USERS;

-- ③ UNLIMITED TABLESPACE 権限
GRANT UNLIMITED TABLESPACE TO app_user;

-- ④ DEFAULT TABLESPACE 変更
ALTER USER app_user DEFAULT TABLESPACE app_data;

-- ⑤ 専用テーブルスペース
CREATE TABLESPACE app_data DATAFILE ...;
ALTER USER app_user QUOTA UNLIMITED ON app_data;

診断クエリ Top 3

-- ① QUOTA 状態
SELECT username, tablespace_name, bytes, max_bytes
FROM dba_ts_quotas
WHERE username = 'APP';

-- ② DEFAULT TABLESPACE
SELECT default_tablespace FROM dba_users WHERE username = 'APP';

-- ③ UNLIMITED TABLESPACE 権限
SELECT * FROM dba_sys_privs 
WHERE grantee = 'APP' AND privilege = 'UNLIMITED TABLESPACE';

標準的なユーザー作成手順

-- 1. 専用テーブルスペース
CREATE TABLESPACE myapp DATAFILE ... SIZE 500M AUTOEXTEND ON;

-- 2. ユーザー
CREATE USER myapp IDENTIFIED BY pw
  DEFAULT TABLESPACE myapp
  TEMPORARY TABLESPACE temp;

-- 3. 権限
GRANT CONNECT, RESOURCE TO myapp;
GRANT CREATE SESSION, CREATE TABLE TO myapp;

-- 4. QUOTA (絶対忘れずに!)
ALTER USER myapp QUOTA UNLIMITED ON myapp;

予防のポイント

1. 12c 以降は QUOTA 設定必須
2. SYSTEM テーブルスペースは絶対避ける
3. 専用テーブルスペース作成
4. UNLIMITED TABLESPACE は監査懸念
5. 80% 到達時アラート
6. Rails: マイグレーション前に確認
7. Data Pump: REMAP_TABLESPACE 活用
8. CI/CD で QUOTA 検証
9. 標準的なユーザー作成手順書
10. IBM FileNet 等の要件確認

これらの知識は、Oracle DBA の運用・アプリユーザー管理・スキーマ設計・Rails / Java / Python アプリ運用・データ移行・IBM FileNet / Sterling OMS 導入・CI/CD パイプライン・監査対応など、あらゆる場面で活用できます。本記事をブックマークしておけば、ORA-01950 に出会っても冷静に的確に対処できるようになります。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c〜23ai での動作確認・公式ドキュメントに基づき作成しています。Oracle のバージョンにより挙動が異なる場合があるため、最新の情報は Oracle 公式ドキュメント(docs.oracle.com)もあわせてご確認ください。