트리거(Trigger)는 특정 테이블에 INSERT, UPDATE, DELETE와 같은 DML(데이터 조작어) 이벤트가 발생했을 때, DBMS에 의해 자동적으로 실행되도록 설정된 저장 프로시저의 일종입니다.
마치 총의 방아쇠(Trigger)를 당기면 총알이 나가는 것처럼, 특정 조건이 충족되면 미리 정의된 로직이 '자동'으로 수행되는 것이 핵심입니다.
1. 트리거의 주요 특징
- 자동 실행: 사용자가 직접 호출하는 것이 아니라, 설정된 이벤트가 발생하면 시스템이 자동으로 기동합니다.
- 트랜잭션의 일부: 트리거는 해당 이벤트를 일으킨 DML 문장과 하나의 트랜잭션으로 묶이는 경우가 많습니다.
- 무결성 유지: 데이터의 일관성을 강제하거나 복잡한 비즈니스 규칙을 데이터베이스 계층에서 구현할 때 사용합니다.
2. 트리거의 구성 요소와 작동 시점
트리거는 보통 다음과 같은 요소들로 정의됩니다.
| 요소 | 영문 명칭 | 설명 |
| 이벤트 | Event | 트리거를 기동시키는 촉발제입니다. (DML: INSERT, UPDATE, DELETE 등) |
| 조건 | Condition | 트리거 내 로직이 실행되기 위한 세부 조건입니다. (WHEN 절 등에 명시) |
| 작업 | Action | 조건이 참(True)일 때 실제로 수행할 SQL 문이나 절차형 로직입니다. |
작동 시점 상세
- BEFORE Trigger: 데이터를 변경하기 전에 검사하거나 값을 수정할 때 사용합니다. (예: 입력값 누락 시 기본값 채우기)
- AFTER Trigger: 데이터 변경 후 관련 정보를 다른 테이블에 기록(Logging)하거나 통계를 낼 때 사용합니다.
3. 트리거 내 가상 테이블 (OLD & NEW)
트리거가 실행될 때, 변경 전후의 데이터를 참조하기 위해 DBMS는 임시 가상 테이블을 제공합니다.
- OLD (또는 DELETED): 수정/삭제되기 전의 기존 데이터 값
- NEW (또는 INSERTED): 새로 입력되거나 수정된 후의 데이터 값
| DML 종류 | OLD 값 존재 여부 | NEW 값 존재 여부 |
| INSERT | X | O |
| UPDATE | O | O |
| DELETE | O | X |
4. 트리거 사용 예시 (SQL 표준 유사 구문)
주문 테이블에 데이터가 들어오면 재고 테이블에서 수량을 자동으로 차감하는 예시입니다.
SQL
CREATE TRIGGER UpdateStockAfterOrder
AFTER INSERT ON Orders -- 'Orders' 테이블에 데이터가 들어온 후(AFTER)
FOR EACH ROW -- 각 행마다 실행
BEGIN
UPDATE Products
SET stock_quantity = stock_quantity - NEW.order_quantity
WHERE product_id = NEW.product_id;
END;
5. 주의사항 (장점과 단점)
장점
- 데이터 무결성을 강력하게 유지할 수 있습니다.
- 감사 로그(Audit Trail) 생성이 자동화되어 보안 관리가 용이합니다.
단점
- 성능 저하: 복잡한 트리거가 많아지면 DML 작업 속도가 느려집니다.
- 디버깅의 어려움: 트리거가 연쇄적으로 발생(Cascading)하면 문제 발생 시 원인 추적이 매우 어렵습니다.
- 투명성 부족: 애플리케이션 개발자가 DB 내부 로직을 모를 경우, 데이터가 왜 변했는지 파악하기 힘듭니다.
데이터베이스 설계 시 트리거를 남용하면 유지보수가 힘들어질 수 있으므로, 비즈니스 로직의 성격에 따라 애플리케이션 코드에서 처리할지 DB 트리거로 처리할지 신중히 결정해야 합니다.
'DB' 카테고리의 다른 글
| [뷰] 갱신제약 (0) | 2026.02.13 |
|---|---|
| 순환관계가 변경에 유연한 이유 (0) | 2026.02.11 |
| [정규화] 3정규형 분해 (0) | 2026.02.11 |
| [빅데이터] HDFS(Hadoop Distributed File System) (0) | 2026.02.09 |
| [병행제어] 다중 단위 로킹(Multi-Granularity Locking, MGL) (0) | 2026.02.09 |