트리거 본문 내 COMMIT 또는 ROLLBACK과 같은 트랜잭션 관리 구문의 사용 위치를 보고합니다.

트리거 본문 내 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;