ORA-04091: table xxx is mutating, trigger/function may not see it


Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
Connected as tbcs
 
SQL> 
SQL> 
SQL> drop trigger tbcs.TRG_CJW_TEST;
 
drop trigger tbcs.TRG_CJW_TEST
 
ORA-04080: trigger 'TRG_CJW_TEST' does not exist
SQL> drop table tbcs.cjw_test;
 
drop table tbcs.cjw_test
 
ORA-00942: table or view does not exist
SQL> create table cjw_test
  2  (
  3  itemid1    varchar2(10),
  4  itemid2    varchar2(10),
  5  itemid3    varchar2(10)
  6  );
 
Table created
SQL> insert into cjw_test values('1','1','1');
 
1 row inserted
SQL> commit;
 
Commit complete

/*
對於after 類型的 for each row 級別的triggers,不論哪種insert語句觸發了trigger,
都不允許在 trigger 中訪問本trigger所依賴的table的
*/

SQL> create or replace trigger trg_cjw_test
  2    after insert on tbcs.cjw_test
  3    for each row
  4  declare
  5    i   number:=0;
  6  begin
  7    select count(1) into i from tbcs.cjw_test;
  8  end trg_cjw_test;
  9  /
 
Trigger created
 
SQL> insert into cjw_test values('1','1','1');
 
insert into cjw_test values('1','1','1')
 
ORA-04091: table TBCS.CJW_TEST is mutating, trigger/function may not see it
ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
 
SQL> 
SQL> 
/*
對於before 類型的 for each row 級別的triggers,如果使用 insert into ... values 語句觸發此trigger ,
則在trigger 中訪問本table沒有問題;但如果使用 insert into select .. from 語句觸發此trigger ,
則在trigger 中訪問本table就報ora-04091錯誤;
*/

SQL> create or replace trigger trg_cjw_test
  2    before insert on tbcs.cjw_test
  3    for each row
  4  declare
  5    i   number:=0;
  6  begin
  7    select count(1) into i from tbcs.cjw_test;
  8  end trg_cjw_test;
  9  /
 
Trigger created
 
SQL> insert into cjw_test values('1','1','1');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> 
SQL> create or replace trigger trg_cjw_test
  2    before insert on tbcs.cjw_test
  3    for each row
  4  declare
  5    i   number:=0;
  6  begin
  7    insert into tbcs.cjw_test
  8    select '2','2','2' from dual;
  9  end trg_cjw_test;
 10  /
 
Trigger created
 
SQL> insert into cjw_test values('1','1','1');
 
insert into cjw_test values('1','1','1')
 
ORA-04091: table TBCS.CJW_TEST is mutating, trigger/function may not see it
ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
 
SQL> 

 SQL> 
/*
上面實驗中使用before,我們在僅插入一條數據的情況下,並沒有報錯,現在試一下插入多條數據的情況
*/
SQL> create or replace trigger trg_cjw_test
  2    before insert on tbcs.cjw_test
  3    for each row
  4  declare
  5    i   number:=0;
  6  begin
  7    select count(1) into i from tbcs.cjw_test;
  8  end trg_cjw_test;
  9  /
 
Trigger created
 
SQL> 
SQL> create table cjw_test_bak as select * from cjw_test;
 
Table created
SQL> insert into cjw_test_bak values('2','1','1');
 
1 row inserted
SQL> insert into cjw_test_bak values('3','1','1');
 
1 row inserted
SQL> insert into cjw_test_bak values('4','1','1');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> insert into cjw_test select * from cjw_test_bak;
 
insert into cjw_test select * from cjw_test_bak
 
ORA-04091: table TBCS.CJW_TEST is mutating, trigger/function may not see it
ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
 
SQL> 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM