oracle

Oracle 表領域の割り当てを行わないとINSERTできません

テーブルの作成ができるのに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
;
スポンサーリンク
タイトルとURLをコピーしました