CREATE TRIGGER 문을 사용하여 새로운 트리거를 생성하고, 트리거 대상, 실행 조건과 수행할 내용을 정의할 수 있다. 트리거는 데이터베이스 객체로서, 특정 이벤트가 대상 테이블에 대해 발생하면 정의된 동작을 수행한다.
CREATE TRIGGER trigger_name
[ STATUS { ACTIVE | INACTIVE } ]
[ PRIORITYkey ]
event_time event_type[ event_target ]
[ IFcondition ]
EXECUTE [ AFTER | DEFERRED ] action [ ; ]
event_time:
• BEFORE
• AFTER
• DEFERRED
event_type:
• INSERT
• STATEMENT INSERT
• UPDATE
• STATEMENT UPDATE
• DELETE
• STATEMENT DELETE
• ROLLBACK
• COMMIT
event_target:
• ONtable_name
• ONtable_name [ (column_name) ]
condition:
• expression
action:
• REJECT
• INVALIDATE TRANSACTION
• PRINT message_string
• INSERT statement
• UPDATE statement
• DELETE statement
다음은 participant 테이블의 레코드를 갱신할 때 획득 메달의 개수가 0보다 작을 경우 갱신을 거절하는 트리거를 생성하는 예제이다.
예로 2004년도 올림픽에 한국이 획득한 금메달의 개수를 음수로 갱신할 경우 갱신이 거절되는 것을 알 수 있다.
CREATE TRIGGER medal_trigger
BEFORE UPDATE ON participant
IF new.gold < 0 OR new.silver < 0 OR new.bronze < 0
EXECUTE REJECT;
csql> UPDATE participant SET gold = -5 WHERE nation_code = 'KOR'
AND host_year = 2004;
csql> ;x
In line 1, column 1,
ERROR: The operation has been rejected by trigger "medal_trigger".
다음은 glo 객체를 이용하여 특정 경로에 있는 파일을 DB에 저장하는 경우, 사용자가 정의한 테이블에서 glo 데이터를 삭제할 때, 시스템 테이블 중 하나인 glo 테이블에서 해당 데이터에 관한 데이터를 함께 삭제하는 트리거를 생성하는 예제이다. glo 타입의 데이터가 입력되면 CUBRID는 glo 테이블에 해당 파일을 저장하고 반환되는 OID 값을 GLOData 타입으로 사용한 컬럼에 저장한다. 따라서 glo를 사용할 때에는 항상 glo 테이블에 존재하는 관련 데이터를 함께 삭제하는 트리거를 생성하는 것을 권장한다.
CREATE TABLE person (name string, photo glo);
CREATE TRIGGER person_delete_glo
BEFORE DELETE ON person
IF obj.photo is not null
EXECUTE DELETE FROM glo where glo=obj.photo;
csql> ;sc person
=== <Help: Schema of a Class> ===
<Class Name>
person
<Attributes>
name CHARACTER VARYING(1073741823)
photo glo
<Triggers>
person_delete_glo : BEFORE DELETE