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
트리거 안에서 대상 테이블을 참조하면 나는 에러입니다.
해당 참조가 정말 필요한 것인지 한번 고민해 봐야 하구요.
일반적인 행트리거에서는 불가능하고,
행트리거와 문장트리거를 합쳐서 복합트리거로 만들어야 해결 가능합니다.
이게 한줄로 간단하게 적어서 그렇지 상당히 복잡하고 까다롭습니다.
그냥 어플리케이션으로 처리하는 것을 추천합니다.
아래 예제들은 예전에 동일 유형의 질문에 답변한 내용입니다.
http://gurubee.net/article/53504
http://gurubee.net/article/54396
여기서는 트리거를 여러개 나누어 생성했지만.
최근에는 복합트리거라는게 생겨서 한개 트리거 안에서 위 모든 처리가 가능합니다.