在触发器主体中使用 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;