트리거를 이용한 응용

설명

여기에서는 데모 데이터베이스에 있는 트리거 정의에 대해 알아본다. demodb 데이터베이스에 생성되어 있는 트리거는 그리 복잡하지는 않지만 CUBRID에서 사용할 수 있는 대부분의 기능을 활용한다. 이러한 트리거를 테스트할 때, demodb 데이터베이스의 원형을 유지하고 싶다면 데이터에 변경이 발생한 후 롤백을 수행해야 한다. 

사용자 데이터베이스에 직접 생성한 트리거는 사용자가 만든 응용 프로그램만큼이나 강력할 수 있다.

예제 1

participant 테이블에 만들어진 아래 트리거는 제시된 값이 0보다 작을 때 메달 컬럼(gold, silver, bronze)에 대한 업데이트를 거절한다. 트리거의 조건에 상관명 new가 사용되었기 때문에 시작 시점(evaluation time)은 반드시 BEFORE가 되어야 한다. 비록 기술하지는 않았지만, 이 트리거에서 실행 시점(action time) 또한 BEFORE이다.

CREATE TRIGGER medal_trigger

BEFORE UPDATE ON participant

IF new.gold < 0 OR new.silver < 0 OR new.bronze < 0

EXECUTE REJECT; 

국가코드가 'BLA'인 나라의 금메달(gold) 수를 업데이트 할 때, medal_trigger 트리거가 발동한다. 금메달 수가 음수인 경우를 허용하지 않도록 트리거를 생성하였으므로, 업데이트를 허용하지 않는다.

UPDATE participant

SET gold = -10

WHERE nation_code = 'BLA';

예제 2

아래 트리거는 위의 예제와 같은 조건인데, STATUS ACTIVE가 추가된 경우이다. STATUS 문이 생략될 경우 기본값은 ACTIVE이며, ALTER TRIGGER 문에 의해 STATUSINACTIVE로 변경할 수 있다.

STATUS의 값에 따라 트리거의 실행 여부를 지정할 수 있다.

CREATE TRIGGER medal_trig

STATUS ACTIVE

BEFORE UPDATE ON participant

IF new.gold < 0 OR new.silver < 0 OR new.bronze < 0

EXECUTE REJECT;

 

ALTER TRIGGER medal_trig

STATUS INACTIVE;

예제 3

다음 트리거는 트랜잭션이 커밋되었을 때 어떻게 무결성 제약 조건을 강제적으로 수행하는지 보여 준다. 하나의 트리거가 여러 테이블에 대해 지정 조건을 넣을 수 있다는 점이 이전 예제와 다르다.

CREATE TRIGGER check_null_first

BEFORE COMMIT

IF 0 < (SELECT count(*) FROM athlete WHERE gender IS NULL)

OR 0 < (SELECT count(*) FROM game WHERE nation_code IS NULL)

EXECUTE REJECT;

예제 4

다음 트리거는 record 테이블에 대해서 트랜잭션이 커밋될 때까지 업데이트 무결성 제약조건 검사를 지연시킨다. DEFERRED 키워드가 이벤트 시점으로 주어졌기 때문에 업데이트 실행 시점에 즉시 트리거가 실행되지는 않는다.

CREATE TRIGGER deferred_check_on_record

DEFERRED UPDATE ON record

IF obj.score = '100'

EXECUTE INVALIDATE TRANSACTION;

record 테이블에서 업데이트가 완료되었을 때, 해당 업데이트는 현재 트랜잭션의 마지막(커밋이나 롤백할 때)에 확인하게 된다. 상관명 oldDEFERRED UPDATE를 사용하는 트리거의 조건 절에 사용할 수 없다. 따라서 아래와 같은 트리거는 생성할 수 없다.

CREATE CLASS foo (n int);

CREATE TRIGGER foo_trigger

    DEFERRED UPDATE ON foo

    IF old.n = 100

    EXECUTE PRINT 'foo_trigger';

위와 같이 트리거를 생성하려고 하면 다음과 같은 에러 메시지를 보여주고, 실패한다.

ERROR: Error compiling condition for 'foo_trigger' : old.n is not defined.

상관명 old는 트리거의 조건 시간이 AFTER일 때에만 사용될 수 있다.