데이터베이스 연구실.log

행 트리거와 문장 트리거

행 및 문장 트리거의 실행 횟수, 0건 DML과 :NEW 및 :OLD 범위, 트리거 비활성화 주의

FOR EACH ROW문장 트리거행 트리거:NEW:OLDALTER TRIGGERDISABLEENABLEDISABLE ALL TRIGGERSUSER_TRIGGERS

#핵심 요약

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 문장 트리거: 삭제 금지

SQL*Plus (객체 소유 계정)객체 또는 설정을 변경함
CREATE OR REPLACE TRIGGER trg_emp_t_bd
BEFORE DELETE ON emp_t
BEGIN
  RAISE_APPLICATION_ERROR(-20603, '이행 기간에는 emp_t를 삭제할 수 없습니다.');
END;
/
SQL*Plus (객체 소유 계정)데이터 또는 파일을 삭제함, 되돌릴 수 없음
DELETE FROM emp_t WHERE empno = 7900;   -- 결과: ORA-20603
DELETE FROM emp_t WHERE empno = 1;      -- 결과: 없는 사원인데도 ORA-20603

결과 해석: 두 번째 DELETE는 지울 행이 0건인데도 오류가 남
문장 트리거라 문장 실행 자체에 반응하기 때문임

#끄고 켜기

SQL*Plus (객체 소유 계정)객체 또는 설정을 변경함
ALTER TRIGGER trg_emp_t_bd DISABLE;
SQL*Plus (객체 소유 계정)데이터 또는 파일을 삭제함, 되돌릴 수 없음
DELETE FROM emp_t WHERE empno = 7900;   -- 결과: 1 row deleted (이력 트리거는 그대로 동작)
SQL*Plus (객체 소유 계정)조회만 함
SELECT action, empno FROM emp_t_audit WHERE action = 'DELETE';
SQL*Plus (객체 소유 계정)객체 또는 설정을 변경함
ROLLBACK;
ALTER TRIGGER trg_emp_t_bd ENABLE;
SQL*Plus (객체 소유 계정)조회만 함
SELECT trigger_name, status FROM user_triggers WHERE table_name = 'EMP_T';

결과 해석: 삭제 차단 트리거만 꺼졌으므로 DELETE는 성공하고, 이력 트리거는 계속 동작해 DELETE 이력이 남음
ROLLBACK으로 삭제와 이력이 함께 취소됨
마지막 조회로 모든 트리거가 ENABLED인지 확인함

#트리거 유형 확인

SQL*Plus (객체 소유 계정)조회만 함
SELECT table_name, trigger_name, trigger_type, triggering_event, status
  FROM user_triggers
 WHERE table_name = 'EMP_T'
 ORDER BY trigger_name;

결과 해석: 개별 실행 출력은 기재 없음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기