트리거(Trigger)에 대해 설명해주세요
트리거(Trigger)란,
테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업을 의미한다. 특정 테이블에 INSERT, DELETE, UPDATE 같은 DML 문이 수행될 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램이다.
※ 트리거 유형
(1) 행 트리거 : 테이블 안의 영향을 받은 행 각각에 대해 실행(변화가 생길 때마다). 변경 전의 행은 OLD, 변경 후의 행은 NEW라는 가상 줄 변수를 사용하여 읽을 수 있다.
(2) 문장 트리거 : INSERT, UPDATE, DELETE 문에 대해 한 번만 실행된다.
※ 트리거 장점
- 데이터 무결성 강화(참조 무결성)
- 업무 규칙의 설정
- 검사 기능의 확장
※ 트리거 단점
- 유지보수의 어려움
- 예상치 못한 오류

* 선언부
CREATE TRIGGER 트리거명
CREATE OR REPLACE TRIGGER 트리거명
CREATE : DBMS 내에 객체(트리거, 함수, 프로시저) 생성.
(OR REPLACE) 같은 이름의 프로시저가 존재할 경우, 기존 프로시저를 현재 컴파일 하는 내용으로 덮어쓴다.
* 이벤트부(TRIGGER)
순서 이벤트 ON 테이블명
[FOR EACH ROW]
-- 순서 : BEFORE, 이벤트 : 하나의 이벤트(INSERT)
BEFORE INSERT ON TABLE_NAME
-- 순서 : AFTER, 이벤트 : 여러 이벤트(INSERT, DELETE)
AFTER INSERT OR DELETE ON TABLE_NAME
-- 순서 : AFTER, 이벤트 : 하나의 이벤트(INSERT)
AFTER INSESRT ON TABLE_NAME
FOR EACH ROW -- 변경되는 데이터 행의 수만큼 실행 INSERT, DELETE 는 FOR EACH ROW 없이 사용할 수 없음
* 시작/종료부(BEGIN/END)
트리거의 실행 시작과 종료를 알려주는 부분으로 프로시저에 BEGIN, END는 반드시 포함되어야 한다.
* SQL
- SELECT, INSERT, UPDATE, DELETE tkdyd
- 행 트리거 안에서 접두어를 붙여 OLD(데이터 변경 전) NEW(데이터 변경 후) 값을 참조한다.
트리거 예시
-- 선언부
CREATE TRIGGER INSERT_TABLE_NAME
-- 이벤트부
AFTER INSERT ON TABLE_NAME
FOR EACH ROW
-- 시작/종료부
BEGIN
-- 제어부
IF INSERTING -- IF INSERTING, IF UPDATING, IF DELETING
THEN
-- SQL
INSERT INT TABLE_NAME_HISTORY
(
COL_1,
COL_2,
COL_3
) VALUES (
:NEW.COL_1,
:NEW.COL_2,
"INSERT"
);
END IF;
END;
# 주의 사항 : 트리거 내에서는 COMMIT, ROLLBACK 등의 트랜잭션 제어어(TCL) 사용 시 컴파일 에러가 발생한다.
'CS > DB' 카테고리의 다른 글
| DB 면접 대비 - 트랜잭션(Transaction) (0) | 2024.03.14 |
|---|---|
| DB 면접 대비 - 정규화 & 이상현상 (Normalization & Anomaly) (0) | 2024.03.13 |
| DB 면접 대비 - 인덱스(index) (0) | 2024.03.13 |
| DB 면접 대비 - 프로시저(Procedure) (0) | 2024.03.13 |