트리거 실행 영역
설명
트리거 실행 영역은 트리거의 조건 영역이 참이거나 조건 영역이 생략된 경우 수행될 내용을 기술하는 영역이다.
실행 영역 절에 특정 시점(AFTER나 DEFERRED)이 주어지지 않으면, 실행 영역은 트리거 이벤트와 같은 시점에서 수행된다.
아래 목록은 트리거를 정의할 때 사용할 수 있는 실행 영역의 목록이다.
- REJECT
- REJECT는 트리거에서 조건 영역이 참이 아닌 경우 트리거를 발동시킨 연산은 거절되고 데이터베이스의 이전 상태를 그대로 유지한다. 연산이 수행된 후에는 거절할 수 없기 때문에 REJECT는 실행 시점이 BEFORE일 때만 허용된다. 따라서 실행 시점이 AFTER나 DERERRED인 경우 REJECT를 사용해서는 안 된다.
- INVALIDATE TRANSACTION
- INVALIDATE TRANSACTION은 트리거를 부른 이벤트 연산은 수행되지만, 커밋을 포함하고 있는 트랜잭션은 수행되지 않도록 한다. 트랜잭션이 유효하지 않으면 반드시 ROLLBACK 문으로 취소시켜야 한다. 이러한 실행은 데이터를 변경하는 이벤트가 발생한 후에 유효하지 않은 데이터를 가지는 것으로부터 데이터베이스를 보호하기 위해 사용된다.
- PRINT
- PRINT는 터미널 화면에 텍스트 메시지로 트리거 활동을 가시적으로 보여주기 때문에 트리거의 개발이나 시험하는 도중에 사용될 수 있다. 이벤트 연산의 결과를 거절하거나 무효화시키지는 않는다.
- INSERT
- INSERT는 테이블에 하나 혹은 그 이상의 새로운 인스턴스를 추가한다.
- UPDATE
- UPDATE는 테이블에 있는 하나 혹은 그 이상의 컬럼 값을 변경한다.
- DELETE
- DELETE는 테이블로부터 하나 혹은 그 이상의 인스턴스를 제거한다.
예제
다음은 트리거 생성 시에 실행영역의 정의 방법을 보여주는 예제이다. medal_trig 트리거는 실행 영역에 REJECT를 지정하였다. REJECT는 실행 시점이 BEFORE일 때만 지정 가능하다.
CREATE TRIGGER medal_trig
BEFORE UPDATE ON participant
IF new.gold < 0 OR new.silver < 0 OR new.bronze < 0
EXECUTE REJECT;
주의 사항
- INSERT 이벤트가 정의된 트리거의 실행 영역에 INSERT를 사용할 때는 트리거가 무한 루프에 빠질 수 있으므로 주의해야 한다.
- UPDATE 이벤트가 정의된 트리거가 분할된 테이블에서 동작하는 경우, 정의된 분할이 깨지거나 의도하지 않은 오동작이 발생할 수 있으므로 주의해야 한다. 이를 방지하기 위해 CUBRID는 트리거가 동작중인 경우 분할 변경을 야기하는 UPDATE가 실행되지 않도록 오류 처리한다. UPDATE 이벤트가 정의된 트리거의 실행 영역에 UPDATE를 사용할 때는 무한 루프에 빠질 수 있으므로 주의해야 한다.