テーブルの作成ができるのにINSERTで ORA-01950 が発生
テーブルの作成(CREATE TABLE)ができても、INSERTのタイミングで ORA-01950 が発生する場合があります。これはテーブルを作成した表領域に対し「使用可能サイズの割り当て」ができていないためです。以下具体的な発生例と対応方法です。
SQL> select USERNAME,ACCOUNT_STATUS,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE
2 from dba_users u where u.USERNAME = 'SOONI'
3 ;
USERNAME ACCOUNT_ST DEFAULT_TA TEMPORARY_
---------- ---------- ---------- ----------
SOONI OPEN TBS01 TEMP
SQL> create table ex01
2 (
3 c1 number
4 ,c2 date
5 ,c3 date
6 );
表が作成されました。
create tableができるのにinsertでエラー
SQL> insert into ex01(c1,c2,c3) values (1,sysdate,sysdate+ 1/24);
insert into ex01(c1,c2,c3) values (1,sysdate,sysdate+ 1/24)
*
行1でエラーが発生しました。:
ORA-01950: 表領域'TBS01'に対する権限がありません
SQL>
DBA_TS_QUOTAS を参照し原因確認
select t.TABLESPACE_NAME,t.USERNAME,t.BYTES,t.MAX_BYTES from DBA_TS_QUOTAS t where t.USERNAME = 'SOONI' ;
col TABLESPACE_NAME for a16 col USERNAME for a16 col TABLESPACE_NAME for a20
--- 割り当ての確認
--- たしかにTBS01表領域への割り当てがありません
---
select t.TABLESPACE_NAME,t.USERNAME,t.BYTES,t.MAX_BYTES from DBA_TS_QUOTAS t
where t.USERNAME = 'SOONI'
;
TABLESPACE_NAME USERNAME BYTES MAX_BYTES
---------------- ---------- ---------- ----------
USERS SOONI 5308416 -1
これを解決するにはDBA権限保持者からの利用サイズ割り当てが必要
対象の表領域に対し使用量の割り当てを行う
今回は無制限に割り当てますが、ある一定のサイズにとどめる事も可能です。
alter user sooni quota UNLIMITED on tbs01 ;
SQL> alter user sooni quota UNLIMITED on tbs01
2 ;
ユーザーが変更されました。
SQL> col TABLESPACE_NAME for a16
SQL> col USERNAME for a16
SQL> col TABLESPACE_NAME for a20
SQL> select t.TABLESPACE_NAME,t.USERNAME,t.BYTES,t.MAX_BYTES from DBA_TS_QUOTAS t
2 where t.USERNAME = 'SOONI'
3 ;
TABLESPACE_NAME USERNAME BYTES MAX_BYTES
-------------------- ---------------- ---------- ----------
USERS SOONI 5308416 -1
TBS01 SOONI 0 -1
SQL> insert into ex01(c1,c2,c3) values (1,sysdate,sysdate+ 1/24);
1行が作成されました。
SQL>
UNLIMITED TABLESPACE システム権限を付与しても解決します
上記は各表領域毎に制限をかける方法ですが、以下は全ての表領域(create tableができる事が前提)に対し表領域いっぱいになるまでINSERT可能になります。(create tableする際に tablespace systemとしてしまえばsystem表領域への作成もできる事になります。ご利用の際はご注意ください)
grant unlimited tablespace to sooni ;