【发布时间】:2013-12-02 11:45:15
【问题描述】:
我正在处理以下 PL/SQL trigger:
CREATE OR REPLACE TRIGGER trigger_1
BEFORE UPDATE ON worker
FOR EACH ROW
DECLARE
BEGIN
IF :OLD.type = 'PRESIDENT' THEN
INSERT INTO trigger_log VALUES (sysdate, 'Nope.', 'No change.');
RAISE_APPLICATION_ERROR(-20111, 'Can not change!');
END IF;
END;
在这里,当PRESIDENT 的payment 即将更改时,我想取消worker 表上的UPDATE 命令。同时,我希望将此命令记录到名为trigger_log 的表中。问题是,当我 RAISE_APPLICATION_ERROR 更新被取消时,日志记录 (INSERT INTO trigger_log) 也被取消了。我怎样才能RAISE_APPLICATION_ERROR 或抛出EXCEPTION,但仍然要在TRIGGER 内运行所有命令?
【问题讨论】:
-
试一试,在插入命令后放一个
commit;(我不确定你应该这样做)。我是说您不应该这样做,因为您处于触发器中,并且对每条语句的提交将至少是数据库的成本过程。我认为您应该考虑以另一种方式进行此日志记录。 -
另外,触发器内的提交可能会弄乱事务的状态。
-
您不能在触发器中提交,除非使用自主事务。
标签: oracle exception plsql triggers