행 트리거와 문장 트리거
행 및 문장 트리거의 실행 횟수, 0건 DML과 :NEW 및 :OLD 범위, 트리거 비활성화 주의
#핵심 요약
FOR EACH ROW가 있으면 행 트리거로, 영향받는 행마다 한 번씩 실행됨
없으면 문장 트리거로, 행 수와 상관없이 문장당 한 번 실행됨
문장 트리거는 대상 행이 0건이어도 문장이 실행되기만 하면 돎
행 트리거는 0건이면 한 번도 실행되지 않음
:NEW, :OLD로 행 값을 다루는 예제는 모두 행 트리거임
문장 트리거에서 :NEW, :OLD를 쓸 수 있는지는 기재 없음
ALTER TRIGGER 이름 DISABLE은 트리거 하나를, ALTER TABLE 테이블 DISABLE ALL TRIGGERS는 그 테이블의 트리거 전부를 끔
다시 ENABLE하는 것을 잊으면 업무 규칙과 이력이 조용히 사라짐
#개념과 동작 원리
USER_TRIGGERS.TRIGGER_TYPE에는 실습 기준으로 BEFORE EACH ROW, AFTER EACH ROW, BEFORE STATEMENT처럼 시점과 단위가 함께 나옴
실습에서는 이행 작업처럼 트리거를 잠시 꺼야 하는 상황을 예로 들었음
이기종 이행 수업의 앞 예제에서는 데이터를 옮기는 동안 ALTER TABLE orders DISABLE ALL TRIGGERS를 썼음(그 예제는 데이터 이행 분야)
행 단위 변경 이력과 롤백의 관계는 변경 이력과 입력값 처리에서 다룸
#필수 명령어 또는 SQL
#BEFORE 문장 트리거: 삭제 금지
CREATE OR REPLACE TRIGGER trg_emp_t_bd
BEFORE DELETE ON emp_t
BEGIN
RAISE_APPLICATION_ERROR(-20603, '이행 기간에는 emp_t를 삭제할 수 없습니다.');
END;
/DELETE FROM emp_t WHERE empno = 7900; -- 결과: ORA-20603
DELETE FROM emp_t WHERE empno = 1; -- 결과: 없는 사원인데도 ORA-20603결과 해석: 두 번째 DELETE는 지울 행이 0건인데도 오류가 남
문장 트리거라 문장 실행 자체에 반응하기 때문임
#끄고 켜기
ALTER TRIGGER trg_emp_t_bd DISABLE;DELETE FROM emp_t WHERE empno = 7900; -- 결과: 1 row deleted (이력 트리거는 그대로 동작)SELECT action, empno FROM emp_t_audit WHERE action = 'DELETE';ROLLBACK;
ALTER TRIGGER trg_emp_t_bd ENABLE;SELECT trigger_name, status FROM user_triggers WHERE table_name = 'EMP_T';결과 해석: 삭제 차단 트리거만 꺼졌으므로 DELETE는 성공하고, 이력 트리거는 계속 동작해 DELETE 이력이 남음ROLLBACK으로 삭제와 이력이 함께 취소됨
마지막 조회로 모든 트리거가 ENABLED인지 확인함
#트리거 유형 확인
SELECT table_name, trigger_name, trigger_type, triggering_event, status
FROM user_triggers
WHERE table_name = 'EMP_T'
ORDER BY trigger_name;결과 해석: 개별 실행 출력은 기재 없음