【完全ガイド】ORA-01950: no privileges on tablespace の原因と解決方法|QUOTA・DEFAULT TABLESPACE・RESOURCE ロール 徹底解説
- 作成日 2026.08.21
- Oracle Database
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 FileNet や Sterling OMS などの導入時
- Rails マイグレーションで新テーブル作成
多くの日本語記事が「QUOTA を付与せよ」で終わりますが、実務では:
- 姉妹エラー(
ORA-01031,ORA-01536)との厳密な違い QUOTA UNLIMITEDvsUNLIMITED 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 を根本から解決できるようになります。
- 1. 結論:QUOTA を付与
- 2. Oracle のスペース管理モデル
- 3. Oracle 12c での重要な変更
- 4. 【原因①】QUOTA 未付与(最頻出)
- 5. 【原因②】QUOTA を使い切った
- 6. 【原因③】DEFAULT TABLESPACE 変更
- 7. 【原因④】CTAS で領域確保失敗
- 8. 【原因⑤】INSERT で新規エクステント
- 9. 【原因⑥】CREATE INDEX で領域確保
- 10. 【原因⑦】Data Pump インポート
- 11. 【原因⑧】IBM FileNet / Sterling OMS 導入
- 12. 【原因⑨】Rails / Django マイグレーション
- 13. 【原因⑩】RESOURCE ロール 12c 変更未認識
- 14. 診断ツール完全リファレンス
- 15. 5つの解決策 完全リファレンス
- 16. Rails / Java / Python 対応
- 17. 実践シナリオ
- 18. トラブルシューティング
- 19. よくある質問(FAQ)
- 19.1. Q1. ORA-01950 と ORA-01031 の違い
- 19.2. Q2. ORA-01536 との違い
- 19.3. Q3. UNLIMITED TABLESPACE vs QUOTA UNLIMITED
- 19.4. Q4. 12c で何が変わった
- 19.5. Q5. SYSTEM テーブルスペース使用の是非
- 19.6. Q6. 監査対応の推奨
- 19.7. Q7. Rails での対応
- 19.8. Q8. Java での対応
- 19.9. Q9. IBM FileNet 導入
- 19.10. Q10. Data Pump インポート
- 19.11. Q11. Autonomous DB での挙動
- 19.12. Q12. パフォーマンスへの影響
- 20. 参考リンク
- 21. まとめ
結論: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-01950 | QUOTA 未付与(領域確保不可) |
| ORA-01031 | システム権限不足(操作自体不可) |
| ORA-01536 | QUOTA 超過(付与済みだが使い切り) |
権限管理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 公式
- Oracle Database Error Messages: ORA-01950
- Oracle Database Security Guide: User Quotas
- Oracle Database Administrator’s Guide: Managing Tablespaces
- Oracle Database SQL Language Reference: ALTER USER
まとめ
ORA-01950: no privileges on tablespace の要点を再整理します。
エラーの本質
ユーザーが指定テーブルスペースに QUOTA なし
→ 領域確保できない
→ セグメント(テーブル/インデックス)作成不可
→ CREATE / INSERT / CTAS で失敗
エラーメッセージの読み方
ORA-01950: no privileges on tablespace 'TABLESPACE_NAME'
↑
QUOTA 未付与のテーブルスペース
権限管理3兄弟
| エラー | 意味 |
|---|---|
| ORA-01950 | QUOTA 未付与 |
| ORA-01031 | システム権限不足 |
| ORA-01536 | QUOTA 超過 |
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 Pump | REMAP_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)もあわせてご確認ください。
-
前の記事
【完全ガイド】ORA-01578: ORACLE data block corrupted の原因と解決方法|RMAN BLOCKRECOVER・DBVERIFY・Data Guard 徹底解説 2026.08.21
-
次の記事
【完全ガイド】ORA-04061: existing state of … has been invalidated の原因と解決方法|ORA-04068 との違い・グローバル状態・EBR 徹底解説 2026.08.24
コメントを書く