DBMS/개념

26_ 트리거(TRIGGER) 정리

seungwon-1 2025. 10. 30. 12:32

1. 트리거란?

트리거(Trigger)는 데이터베이스에서 INSERT, UPDATE, DELETE 같은 이벤트가 발생했을 때 자동으로 실행되는 프로시저다.
즉, 사용자가 직접 실행하지 않아도, 특정 조건이 충족되면 DB가 알아서 동작한다.

트리거의 주요 특징

  • 사용자의 명시적 호출 없이 자동으로 실행
  • 데이터의 무결성과 일관성 유지
  • 복잡한 업무 규칙을 자동으로 구현 가능
  • 다른 테이블과의 연계 작업 자동화 가능

 

2. 트리거의 종류

(1) 실행 시점에 따른 분류

  • BEFORE 트리거: DML 문이 실행되기 직전에 작동
  • AFTER 트리거: DML 문이 실행된 후에 작동

(2) 이벤트에 따른 분류

  • INSERT 트리거: 데이터가 삽입될 때 실행
  • UPDATE 트리거: 데이터가 수정될 때 실행
  • DELETE 트리거: 데이터가 삭제될 때 실행

 

3. 트리거 문법 구조

 
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
[FOR EACH ROW]
[WHEN condition]
DECLARE
    -- 변수 선언부
BEGIN
    -- 실행부
EXCEPTION
    -- 예외 처리부
END;
/

주요 구성 요소 설명

  • OR REPLACE: 같은 이름의 트리거가 있으면 새로 덮어씀
  • FOR EACH ROW: 행 단위로 실행할지 여부 지정
    • 행 레벨 트리거: 영향을 받는 각 행마다 실행 (예: 10행 수정 시 10번 실행)
    • 문장 레벨 트리거: SQL 문장 단위로 한 번만 실행
  • WHEN: 특정 조건일 때만 트리거를 작동시킴

 

 

4. 트리거에서 사용되는 레퍼런스 (:OLD, :NEW)

행 레벨 트리거에서는 :OLD, :NEW라는 의사 레코드(Pseudo Record) 를 사용한다.

참조                                     INSERT                                      UPDATE                                  DELETE

 

:OLD NULL 변경 전 값 삭제될 값
:NEW 삽입될 값 변경 후 값 NULL

즉,

  • :OLD → 기존 데이터
  • :NEW → 새로 들어오거나 수정된 데이터

 

5. 트리거 예제

(1) 급여 변경 로그 기록

CREATE OR REPLACE TRIGGER trg_salary_log
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
    INSERT INTO salary_log (
        emp_id,
        changed_date,
        old_salary,
        new_salary
    ) VALUES (
        :NEW.employee_id,
        SYSDATE,
        :OLD.salary,
        :NEW.salary
    );
END;
/

직원의 급여가 바뀔 때마다 salary_log 테이블에 변경 이력을 자동으로 저장한다.

 

(2) 새로운 직원 입사 시 로그 기록

CREATE OR REPLACE TRIGGER trg_new_employee_log
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employee_log (
        emp_id,
        hire_date,
        department_id,
        position,
        action_type
    ) VALUES (
        :NEW.employee_id,
        :NEW.hire_date,
        :NEW.department_id,
        :NEW.job_id,
        'NEW_HIRE'
    );
    
    UPDATE department_stats
    SET employee_count = employee_count + 1
    WHERE department_id = :NEW.department_id;
END;
/

새로운 직원이 등록될 때 자동으로 employee_log에 입사 기록을 추가하고,
해당 부서의 인원수를 1 증가시킨다.

 

6. 트리거 관리 명령어

(1) 트리거 확인

SELECT trigger_name, trigger_type, triggering_event
FROM user_triggers
WHERE table_name = 'TABLE_NAME';

(2) 트리거 활성화 / 비활성화

ALTER TRIGGER trigger_name ENABLE;   -- 활성화
ALTER TRIGGER trigger_name DISABLE;  -- 비활성화

(3) 트리거 삭제

DROP TRIGGER trigger_name;

 

7. 트리거 사용 시 주의사항

  • 트리거 내부에서 COMMIT, ROLLBACK 사용 불가
  • 트리거 간 무한 루프 발생 주의 (서로 호출하는 경우)
  • 성능 저하 가능성 고려 (특히 대용량 테이블에서)
  • 디버깅이 어려움 → 로그 테이블 활용 추천
  • 명확한 목적을 가진 트리거만 사용하기

'DBMS > 개념' 카테고리의 다른 글

28_ Oracle 사용자 정의 함수  (0) 2025.11.03
27_ DCL (Data Control Language)  (0) 2025.11.01
25_ 정규표현식(Regular Expression)  (0) 2025.10.28
24_ DBMS 심화 주제  (0) 2025.10.26
23_ CASE문  (0) 2025.10.24