상세 컨텐츠

본문 제목

데이터베이스 DELETE 트리거(Trigger)란?

IT/DB

by JR 2025. 12. 2. 16:26

본문

300x250
반응형

 

 

 

DELETE 트리거는 말 그대로 DELETE가 실행될 때 자동으로 발동됩니다.


DB에서 특정 테이블의 행이 삭제될 때, 그 순간에 자동으로 실행되는 “후속 작업 스크립트”라고 보면 됩니다.

 

쉽게 말하면,

“이 테이블에서 누군가 삭제하면 ○○ 작업을 자동으로 실행해라”

라고 DB에 미리 설정해놓은 기능입니다.


DELETE 트리거란?

테이블에서 DELETE 문이 발생할 때 자동으로 실행되는 트리거.

종류는 보통 2개:

  1. BEFORE DELETE 트리거
    • 삭제되기 직전에 실행
    • 삭제를 막거나 로직을 바꿀 때 사용
  2. AFTER DELETE 트리거
    • 삭제된 후에 실행
    • 삭제 이력 저장, 로그 기록 등에 사용

📌 예시로 보면 더 이해됨

✔ BEFORE DELETE 예시

CREATE TRIGGER trg_before_delete_order
BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
    -- 주문 삭제 금지 조건
    IF :old.status = 'SHIPPED' THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '배송된 주문은 삭제 불가';
    END IF;
END;

삭제가 실행되기 전에 트리거가 발동 → 특정 조건이면 삭제 자체를 막음.


✔ AFTER DELETE 예시 (가장 많이 쓰는 케이스)

CREATE TRIGGER trg_after_delete_payment
AFTER DELETE ON payment
FOR EACH ROW
BEGIN
    INSERT INTO payment_history (pay_id, deleted_at)
    VALUES (:old.pay_id, SYSDATE);
END;

→ 삭제된 행 정보를 기록하는 “삭제 로그 테이블” 자동 생성.


🔥 DELETE 트리거가 왜 중요하냐면?

DELETE 문을 실행하면:

  • 삭제 전에 검증
  • 삭제 로그 남기기
  • 연관 테이블 정리
  • 카운트 업데이트
  • 감사 기록(audit) 남기기
  • 비즈니스 룰 실행

등을 수행하게 할 수 있어요.


❗ 핵심 포인트

🟦 DELETE는 트리거가 실행됨

🟧 TRUNCATE는 트리거가 실행되지 않음

 

그래서 전체 데이터를 지우기만 하면 되는 “임시테이블”이라면:

 

TRUNCATE가 안전하고 빠름
✔ DELETE는 불필요한 트리거 실행까지 일어날 수 있음


 

 

CUBRID에서 특정 테이블의 DELETE 트리거 확인 방법

CUBRID는 시스템 카탈로그에서 트리거 정보를 조회할 수 있습니다.

아래 쿼리로 **해당 테이블에 걸린 모든 트리거(INSERT/UPDATE/DELETE 포함)**를 볼 수 있습니다:

SELECT *
FROM db_trigger
WHERE class_name = '테이블명';

🔍 DELETE 트리거만 보고 싶으면

SELECT name, status, condition, action_time, event
FROM db_trigger
WHERE class_name = '테이블명'
  AND event = 'DELETE';

📌 컬럼 정보 간단 설명

컬럼 의미
name 트리거 이름
event INSERT / UPDATE / DELETE
action_time BEFORE / AFTER
condition 트리거 발생 조건
status ACTIVE 여부
action_definition 트리거가 수행하는 실제 로직

✔ 예시 출력

name event action_time status
trg_payment_del_log DELETE AFTER ACTIVE

 

이런 식으로 나오면 해당 테이블에 DELETE 트리거가 걸려 있는 겁니다.


⚠ TRUNCATE가 트리거를 무시한다는 점 다시 강조

형님이 이걸 왜 확인하려는지 내가 감이 오는데…

  • DELETE는 트리거 실행됨
  • TRUNCATE는 트리거 실행 안 됨

그래서 트리거 때문에 DELETE를 강제로 써야 하는지,
아니면 TRUNCATE를 써도 되는지를 판단하려고 하는 거죠?

트리거 내용도 조회하고 싶으면:

SELECT name, action_definition
FROM db_trigger
WHERE class_name = '테이블명'
  AND event = 'DELETE';

 

 

 

 

300x250
반응형

관련글 더보기