ORA-04091 "after update" 触发器出错,如何解决?
ORA-04091 Error on "after update" trigger, how to get around?
我有一个触发器设置为在特定列更新后触发。我想在另一列的特定值更改为另一个特定值后更新特定列的值。
我遇到错误:
ORA-04091: table tableName is mutating, trigger/function may not see it
ORA-06512: at "triggerName", line 14
ORA-04088: error during execution of trigger 'triggerName'
我已将其重写为更新前和更新后,并尝试将逻辑存储在函数中,并使用 "pragma autonomous_transaction",但仍然会抛出错误。
BEFORE update of columnName1 ON tableName
FOR EACH ROW
BEGIN
if :new.columnName1 = 3 AND :old.columnName1 = 1 then
update tablename
set columnName2= MOD(sequenceName.NextVal, 5) + 1
where tableName.columnName2 = :old.columnName2;
end if;
END;
/
我不明白为什么整个 table 被标记为 "mutating" 而我没有更新受触发器响应的更新影响的列。当然,如果 table 中的另一个值发生变化,您应该能够更新 table 中列的值,或者我在这里疯了吗?
注意:一次只有一个条目会受到影响。在我的应用程序逻辑中,我更新了数据库中某个人的状态。我希望数据库仅在特定状态更改时执行一些逻辑,并且我想避免在此处使用 API 调用逻辑,如您所见,它只是 PLSQL 中的一行逻辑。
谢谢
也许您真的不想更新 table,而只是更改正在更新的特定行中的值。
如果是这样,请避开 update
并仅设置值:
BEFORE update of columnName1 ON tableName
FOR EACH ROW
BEGIN
if :new.columnName1 = 3 AND :old.columnName1 = 1 then
:new.columnName2 := MOD(sequenceName.NextVal, 5) + 1 ;
end if;
END;
我有一个触发器设置为在特定列更新后触发。我想在另一列的特定值更改为另一个特定值后更新特定列的值。
我遇到错误:
ORA-04091: table tableName is mutating, trigger/function may not see it
ORA-06512: at "triggerName", line 14
ORA-04088: error during execution of trigger 'triggerName'
我已将其重写为更新前和更新后,并尝试将逻辑存储在函数中,并使用 "pragma autonomous_transaction",但仍然会抛出错误。
BEFORE update of columnName1 ON tableName
FOR EACH ROW
BEGIN
if :new.columnName1 = 3 AND :old.columnName1 = 1 then
update tablename
set columnName2= MOD(sequenceName.NextVal, 5) + 1
where tableName.columnName2 = :old.columnName2;
end if;
END;
/
我不明白为什么整个 table 被标记为 "mutating" 而我没有更新受触发器响应的更新影响的列。当然,如果 table 中的另一个值发生变化,您应该能够更新 table 中列的值,或者我在这里疯了吗?
注意:一次只有一个条目会受到影响。在我的应用程序逻辑中,我更新了数据库中某个人的状态。我希望数据库仅在特定状态更改时执行一些逻辑,并且我想避免在此处使用 API 调用逻辑,如您所见,它只是 PLSQL 中的一行逻辑。
谢谢
也许您真的不想更新 table,而只是更改正在更新的特定行中的值。
如果是这样,请避开 update
并仅设置值:
BEFORE update of columnName1 ON tableName
FOR EACH ROW
BEGIN
if :new.columnName1 = 3 AND :old.columnName1 = 1 then
:new.columnName2 := MOD(sequenceName.NextVal, 5) + 1 ;
end if;
END;