如何在同一个表中使用AFTER INSERT触发器更新表?

时间:2015-05-26 11:04:52

标签: oracle plsql database-trigger

我在表上有2个触发器一个是BEFORE INSERT,一个是AFTER INSERT:

CREATE OR REPLACE TRIGGER DEMO_TRG
AFTER INSERT
ON A
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin

UPDATE A
SET STATUS = 'DONE'
WHERE id_id =:new.p_id;

commit;

END;
/

为什么后插入中的更新命令不起作用(状态未设置为DONE)?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

问题很可能是AUTONOMOUS_TRANSACTION引起的 - 当你这样做时,你实际上是切换到另一个交易,这个交易不会知道你的未提交交易(即你的插入),所以那里没有什么可以更新。

您应该做的是修改之前触发器中的列(:new.status := 'DONE')。或者,更好的是,避免使用触发器并在存储过程中使用逻辑,并且不允许任何人直接插入表中,尽管我很欣赏如果您有大量应用程序直接插入表等,这可能是一个很大的转换