トリガーの本体に 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;