발생증상 :
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;
'오라클DBMS > 관리(Admin)' 카테고리의 다른 글
[오라클] HWM 줄이기 SHRINK SPACE (0) | 2013.04.23 |
---|---|
DROP TEMPORARY TABLESPACE 임시테이블스페이스 삭제불가시 (0) | 2013.04.02 |
RAW DEVICE control file 복사 (0) | 2013.04.02 |
ORA-00845 : MEMORY_TARGET not supported on this system (0) | 2012.09.10 |
[ORACLE10G] DBMS_SPACE로 SHRINK (fregmentation 해결) (0) | 2012.03.13 |