關於ORA-01536 報錯的幾種場景:

531968912發表於2017-07-10

關於ORA-01536 報錯的幾種場景:


我們都知道unix 或linux下都可以限制某個使用者使用磁碟空間,避免造成空間佔用100%引發系統事故,
oracle也可以實現該功能,就是透過指定使用者對某些表空間的配額quota來實現的。一旦超過配額上限,
就會報ORA-01536,下面的幾個場景就來介紹一下。

場景1:使用者quota不足
sqlplus / as sysdba
drop user test cascade;
create user test identified by abcdefg;
alter user test quota 1m on users ;
grant create session to test;
grant create table to test;

檢視配額情況:
 select username, tablespace_name,bytes, max_bytes from dba_ts_quotas where username = 'TEST';
 
 USERNAME                 TABLESPACE_NAME                  BYTES  MAX_BYTES
------------------------------------------------------------  
TEST                         USERS                                 1048576    1048576  <<1M

插入資料:
create table test.test_t as select * from dba_objects ;
 
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'
 
上述結果可以看到,因為我們只給了test使用者使用users表空間1m的配額,
所以插入大量資料就會報錯,因為錯誤明顯,檢查dba_ts_quotas就可以解決。

場景2:遞迴cursor
sqlplus / as sysdba
grant dba to maob;
SQL> select username, tablespace_name,bytes, max_bytes from dba_ts_quotas where username = 'MAOB';

no rows selected

上述可以看到這個檢視只能查詢到顯式賦予配額的使用者和大小,我們給maob使用者賦予dba之後,在配額表裡面是沒有任何記錄的,這是因為dba的role在起作用,

SQL> select * from session_privs WHERE PRIVILEGE LIKE '%UNLIMIT%' ;

PRIVILEGE
--------------------------------------------------------------------------------
UNLIMITED TABLESPACE

檢視當前session 的確是有UNLIMITED的quota的許可權的

sqlplus maob/abcdefg
create table maob.test_t2  as select * from dba_objects where 1=2;
create table test.test_t2  as select * from dba_objects where 1=2;
grant all on test.test_t2 to public ;
CREATE OR REPLACE TRIGGER maob.test_trg
   BEFORE INSERT OR DELETE OR UPDATE
   ON maob.test_t2  FOR EACH ROW
BEGIN
 
   INSERT INTO test.test_t2(object_id,object_name) values(:new.object_id,:new.object_name);
 
END;
/

SQL> insert into maob.test_T2 select * from dba_objects;
insert into maob.test_T2 select * from dba_objects
                 *
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'
ORA-06512: at "MAOB.TEST_TRG", line 3
ORA-04088: error during execution of trigger 'MAOB.TEST_TRG'

上述可以看到,雖然maob使用者是對任何表空間不限制quota的,但是因為trigger的原因,
導致操作了test使用者下的表,而test使用者是有quota限制的,所以會報錯,不過這個根據報錯
資訊trigger也很容易定位原因。


場景3:錯誤的使用索引,在其他使用者下建立索引  

sqlplus maob/abcdefg
create table  test_t3  as select * from dba_objects where 1=2;

==在使用者test下的索引卻指向本使用者的表
sqlplus test/abcdefg
create index test.i3 on maob.test_t3( object_name,owner,OBJECT_ID,DATA_OBJECT_ID,OBJECT_TYPE,CREATED ) tablespace users;

sql>insert into maob.test_T3 select * from dba_objects;
SQL> SQL> insert into maob.test_T3 select * from dba_objects;
insert into maob.test_T3 select * from dba_objects
                 *
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'

這個報錯就會讓人很奇怪,因為通常情況下在生產系統上類似test_t3業務表,owner是不會被限制quota的,而且
dba通常進一步檢查dba_ts_quotas和系統許可權就能很快排除可能性,但是卻很容易忽略物件上的索引造成問題,
因為的確很少有人在B使用者下建索引卻指向A使用者的表,往往都是有人錯誤操作造成的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2141798/,如需轉載,請註明出處,否則將追究法律責任。

相關文章