트리거 본문 내 COMMIT 또는 ROLLBACK 구문을 사용하면 트리거는 컴파일되지 않습니다. 트랜잭션 도중에 트리거가 시작되기 때문에 실패가 발생합니다. 트리거가 시작될 때 현재 트랜잭션은 아직 완료되지 않은 상태입니다. COMMIT이 트랜잭션을 종료하면 두 구문(COMMIT 및 ROLLBACK) 모두 예외를 일으킵니다. 트리거 내에서 실행되는 변경은 트리거를 시작한 소유 트랜잭션에 의해 커밋(또는 롤백)되어야 합니다.
예시(Oracle):
CREATE TABLE employee_audit
(
id INT NOT NULL,
update_date DATE NOT NULL,
old_name VARCHAR2(100),
new_name VARCHAR2(100)
);
CREATE TABLE employees
(
id INT NOT NULL,
name VARCHAR2(100) NOT NULL
);
CREATE OR REPLACE TRIGGER trig_commit
AFTER UPDATE OF name
ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_audit VALUES (:old.id, SYSDATE, :old.name, :new.name);
COMMIT;
END;
CREATE OR REPLACE TRIGGER trig_rollback
AFTER UPDATE OF name
ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_audit VALUES (:old.id, SYSDATE, :old.name, :new.name);
ROLLBACK;
END;