본 장에서는 트리거의 기본 개념과 이를 생성하는 방법을 설명한다.
트리거(Trigger)는 스키마 객체의 일종으로, 데이터베이스가 미리 정해 놓은 특정 조건이 만족되거나 어떤 동작이 수행되면 자동으로 실행되도록 정의한 동작이다. 예를 들어 데이터베이스에 특정한 이벤트가 발생되거나 사용자가 설정한 DDL 문장이 수행될 때 트리거가 실행될 수 있다.
트리거의 내용은 PSM으로 이루어져 있다. 트리거는 이미 정의된 PSM 객체를 호출하여 사용하거나 트리거를 생성할 때 이름 없는 블록을 함께 선언해주는 방식을 모두 이용할 수 있다.
트리거는 다음과 같은 세 가지 구성요소를 갖춰야만 생성할 수 있다.
트리거가 실행될 조건이 되는 문장이나 이벤트
실행 조건의 제약
실행될 내용
다음은 alarm_for_balance 라는 트리거를 생성하는 예이다.
CREATE OR REPLACE TRIGGER alarm_for_balance BEFORE INSERT OR UPDATE ON balance_tab ... ⓐ ... FOR EACH ROW WHEN (new.balance < 3000) .. ⓑ ... CALL alarm_for_balance_fn() .. ⓒ ...
ⓐ 테이블 balance_tab의 balance 컬럼에 로우가 삽입되거나 수정이 발생했을 때 ⓑ로 이동한다.
ⓑ 해당 로우의 값이 3000 이하인지를 검사한다.
ⓒ 검사한 결과가 맞으면 alarm_for_balance_fn
함수를 호출하고,
함수에 정의한 동작이 실행된다.
트리거의 타입은 다음과 같이 나눌 수 있다.
로우(row) 및 문장(statement)
타입 | 설명 |
---|---|
로우 | 테이블에 INSERT, UPDATE, DELETE가 발생하는 로우마다 트리거의 내용이 실행되는 타입이다. 이 타입의 트리거는 각 로우에 연산이 발생할 때마다 연산 직전 또는 직후에 트리거가 실행된다. |
문장 | 로우의 개수에 상관없이 문장 단위로 한 번만 실행되는 타입이다. |
BEFORE 및 AFTER
타입 | 설명 |
---|---|
BEFORE | 조건 문장이 실행되기 전에 트리거의 내용이 실행되는 타입이다. |
AFTER | 조건 문장이 실행된 후 트리거의 내용이 실행되는 타입이다. |
트리거는 두 종류의 타입 중에서 하나씩을 각각 가질 수 있다. 즉, BEFORE 로우(BEFORE row), BEFORE 문장(BEFORE statement), AFTER 로우(AFTER row), AFTER 문장(statement)의 타입으로 생성할 수 있다.
트리거를 생성하는 방법은 다음과 같다.
CREATE [OR REPLACE] TRIGGER 트리거_이름 {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON 테이블_이름 [FOR EACH ROW] WHEN (조건_제약) {[선언부] BEGIN ... END;} | CALL 함수_또는_프러시저_이름
트리거의 문법에 대한 자세한 내용은 "Tibero SQL 참조 안내서"를 참고한다.
다음은 로우 타입의 트리거로, 테이블 DECK_TBL의 COUNT 컬럼에 로우 값이 1000을 초과할 때마다 로그를 기록하도록 작성한 예이다.
[예 3.1] 트리거의 생성
CREATE OR REPLACE TRIGGER Log_overflow
AFTER UPDATE ON Deck_tbl
FOR EACH ROW
WHEN (new.count > 1000)
BEGIN
INSERT
INTO Deck_log (Deck_id, Timestamp, New_count, Action)
VALUES (:new.Deck_no, SYSTIMESTAMP, :new.count, 'overflow');
END;
CREATE 문장은 Tibero 내부에서는 BEGIN – END 사이의 부분을 PSM으로 인식한다. 이 문장이 컴파일 되면 PSM 스키마 객체가 생성되고 이를 데이터베이스에 저장한다. 만약 컴파일 에러가 발생한다면 정적 뷰를 통해 에러의 내용을 확인할 수 있다.