트리거(Trigger)
는 DBMS에서 특정 테이블에 DML문(INSERT, UPDATE, DELETE 등)이 수행되었을 때 '데이터베이스에서 자동으로 동작하도록 설정'된 프로그램이다. 즉, 사용자가 직접 호출하는 것이 아니라 데이터베이스에서 자동적으로 호출되는 사용자 정의 프로시저(Procedure)
이다.
프로시저(Procedure)란 '데이터베이스에 대한 일련의 작업을 정리한 절차를 RDBMS가 저장한 것으로, 간단하게 말하면 여러 SQL문을 모아 하나의 쿼리로 만든 것이다. 함수와 비슷한 개념으로 이해할 수 있다(비슷한 것이지 같은 것은 아니므로 주의).
트리거를 통해 SQL 제약 조건(Constraint)
방법으로는 명시할 수 없는 무결성 제약 조건을 구현함으로써, 제약 조건과 함께 데이터의 무결성(Integrity)을 유지하는 방법이다.
트리거는 문장 트리거(Statement level trigger)
와 행 트리거(Row level trigger)
로 나눌 수 있다.
문장 트리거(State level trigger)
FOR EACH ROW
옵션을 선언하지 않음으로써 문장 트리거로 선언행 트리거(Row level trigger)
FOR EACH ROW
옵션을 선언하여 행 트리거로 선언OLD
, NEW
를 통해 확인 가능트리거는 실행 시점에 따라 세 가지 유형으로 구분할 수 있다.
트리거에는 몇 가지 제약 조건이 존재한다.
Triggering 문장
의 실행 부분으로서, Triggering 문장과 동일한 트랜잭션에 존재한다.트리거는 다음과 같은 요소로 구성된다.
구성 요소 | 내용 |
---|---|
선언(Declare) | 트리거의 명칭을 정의 |
이벤트(Event) | 트리거가 실행되는 시점을 명시 |
시작/종료(Begin/End) | 트리거의 시작과 종료를 나타내는 것으로, BEGIN과 END가 쌍을 이룸 다수의 실행을 제어하는 기본적 단위로서 논리적인 프로세스를 구성 |
제어(Control) | 단위 블록별 실행 흐름을 제어하며, IF문과 CASE문으로 구분 |
SQL | 주로 DML(INSERT, UPDATE, DELETE)문을 사용하나, 경우에 따라 DDL도 사용(자주 사용되지는 않음) |
예외(Exception) | 시작/종료 사이의 SQL문이 실행될 때 예외가 발생할 경우 그 예외의처리 방법을 정의 |
트리거는 기본적으로 다음과 같이 선언한다.
CREATE [OR REPLACE] TRIGGER '트리거 이름'
BEFORE | AFTER
[INSERT | UPDATE | DELETE] ON '테이블 이름'
[REFERENCING NEW | OLD TABLE AS '테이블 이름']
[FOR EACH ROW]
[WHEN '조건식']
BEGIN
'SQL'
END
상기에서 사용된 각 명령어들은 다음과 같은 기능을 한다.
명령어 | 기능 |
---|---|
CREATE | 트리거 생성 |
OR REPLACE | 같은 이름의 트리거가 존재할 경우 해당 트리거의 내용을 현재 선언하는 트리거로 갱신 (이 옵션을 명시하지 않았는데 동명의 트리거가 존재할 경우 에러 발생) |
BEFORE/AFTER | 트리거의 유형 결정(트리거의 동작 시점 결정) |
DML | INSERT, UPDATE, DELETE 등 해당 동작이 실행될 때 트리거가 실행됨 |
REFERENCING NEW/OLD | 트리거의 실행 대상이 되는 데이터를 결정(추가, 수정, 삭제 작업 수행 전의 데이터 혹은 작업 수행 후의 데이터) |
FOR EACH ROW | 행 트리거로 선언 |
WHEN | 트리거 실행 시 특정 조건의 데이터에 대해서만 트리거를 실행하도록 하는 조건식 설정 |
BEGIN/END | 트리거의 본문 코드를 입력하는 부분으로 하나 이상의 SQL문을 포함 |
SELECT *
FROM USER_TRIGGERS;
ALTER TRIGGER '트리거 이름' [ENABLE | DISABLE];
ALTER TABLE '테이블 이름' [ENABLE | DISABLE] ALL TRIGGER;
ALTER TRIGGER '트리거 이름' COMPILE;
DROP TRIGGER '트리거 이름';