DELETE 트리거 참조하는 테이블 말고 다른 테이블 업데이트 관련... ORA-04091 오류 0 2 148

by lee0528kr [Oracle 기초] [2019.10.08 14:56:09]



CREATE OR REPLACE TRIGGER TRG_MCOURSE_DML_DEL
    BEFORE 
    DELETE ON TBL_MSUB
    FOR EACH ROW
DECLARE
    V_MIN       NUMBER(10);
    V_MAX       NUMBER(10);
BEGIN    
    IF(DELETING)
       THEN   
              SELECT TO_NUMBER(SUBSTR(MIN(START_DATE),1,4)||SUBSTR(MIN(START_DATE),6,2)||SUBSTR(MIN(START_DATE),9,2))
                 , TO_NUMBER(SUBSTR(MAX(END_DATE),1,4)||SUBSTR(MAX(END_DATE),6,2)||SUBSTR(MAX(END_DATE),9,2)) INTO V_MIN, V_MAX
            FROM TBL_MSUB
            WHERE MCOURSE_CODE = (SELECT MCOURSE_CODE
                                 FROM  TBL_MCOURSE
                                 WHERE MCOURSE_CODE =:OLD.MCOURSE_CODE);
            
            UPDATE TBL_MCOURSE
            SET   MCSTART_DATE = TO_DATE(SUBSTR(TO_CHAR(V_MIN),1,4)||SUBSTR(TO_CHAR(V_MIN),5,2)||SUBSTR(TO_CHAR(V_MIN),7,2), 'YYYY-MM-DD')
            WHERE MCOURSE_CODE = (SELECT MCOURSE_CODE
                                 FROM TBL_MCOURSE
                                 WHERE MCOURSE_CODE = :OLD.MCOURSE_CODE) AND MCSTART_DATE > :OLD.START_DATE;
                                 
            UPDATE TBL_MCOURSE
            SET   MCEND_DATE = TO_DATE(SUBSTR(TO_CHAR(V_MAX),1,4)||SUBSTR(TO_CHAR(V_MAX),5,2)||SUBSTR(TO_CHAR(V_MAX),7,2), 'YYYY-MM-DD')
            WHERE MCOURSE_CODE = (SELECT MCOURSE_CODE
                                 FROM TBL_MCOURSE
                                 WHERE MCOURSE_CODE = :OLD.MCOURSE_CODE) AND MCEND_DATE<:OLD.END_DATE;
   
    END IF;
END;

참조하는 테이블을 검색해서 다른 테이블을 업데이트 하려고하는데 SELECT 로 참조자체를 못하는데 해결방법이있을까요 ㅠㅠㅠㅠ

 

ORA-04091: table TEAM4.TBL_MSUB is mutating, trigger/function may not see it

by jkson [2019.10.10 09:59:14]

TBL_MSUB 트리거에 TBL_MSUB를 SELECT해서 발생하는 문제인데 이거 해결 방법이 좀 복잡했던 걸로 기억하는데..

구글에서 TRIGGER ORA-04091

로 검색하시면 나옵니다.

마농님이 작성하신 것도 있네요.


by 마농 [2019.10.10 14:46:27]

트리거 안에서 대상 테이블을 참조하면 나는 에러입니다.
해당 참조가 정말 필요한 것인지 한번 고민해 봐야 하구요.
일반적인 행트리거에서는 불가능하고,
행트리거와 문장트리거를 합쳐서 복합트리거로 만들어야 해결 가능합니다.
이게 한줄로 간단하게 적어서 그렇지 상당히 복잡하고 까다롭습니다.
그냥 어플리케이션으로 처리하는 것을 추천합니다.

아래 예제들은 예전에 동일 유형의 질문에 답변한 내용입니다.
http://gurubee.net/article/53504
http://gurubee.net/article/54396
여기서는 트리거를 여러개 나누어 생성했지만.
최근에는 복합트리거라는게 생겨서 한개 트리거 안에서 위 모든 처리가 가능합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입