본문 바로가기

오라클DBMS/관리(Admin)

[오라클/11G] Trigger 사용시 ORA-04091 Table is Mutating

발생증상 :

TRIGGER(트리거) 사용시 ORA-04091 Table is Mutating  오류 발생 


발생원인 : 

TRIGGER의 대상이 되는 테이블에 대해 select , update ,insert, delete 발생시 

문제가 될 수 있어 (길게 쓰려니.. 귀찮아..) 발생함

each row 사용시 발생함. 


해결방법 : 임시테이블,PL/SQL테이블등과 COMPOUND TRIGGER를 사용하는 방법이 있음 

COMPOUND TRIGGER는 문장내에서 each row 와 statement 를 복합적으로 사용가능하기 때문에 

ORA-04091 를 발생시키는 each row와 new, old 데이터를 사용할 수 없는 statemnet 의 문제점을 상호보완이 가능함



create or replace 

trigger TR_TABLENAME

for insert on TABLENAME

COMPOUND trigger

 

  V_PK_1 varchar2(8);

  V_IFVALUE VARCHAR2(1);

after each row  is

begin

if :new.IFVALUE = '1' then

  v_IFVALUE  := :new.IFVALUE;

v_PK_1 := :new.V_PK_1;    -- after statement 에선 new나 old 같은 row 데이터를 사용할 수 없다

end if;

end after each row;

after STATEMENT is 

 begin

 if v_IFVALUE = '1' then 

  update TABLENAME

  set VALUE_1 = (

  select max(VALUE_3)

  FROM TABLENAME

 where 

 YYYY = TO_CHAR(sysdate, 'YYYY')

  )

  where PK_1 = v_PK_1

  ;

  end if;

end after statement;


END TR_TABLENAME;