ORA-04091: 表名正在变异

Posted

技术标签:

【中文标题】ORA-04091: 表名正在变异【英文标题】:ORA-04091: table name is mutating 【发布时间】:2013-01-21 14:51:09 【问题描述】:

将数据插入表 A 时出现 ORA-04091 错误。表 A 的记录正在引用同一个表 1:N 中的其他记录。 父记录的 fk_id = null,子记录的 fk 不为 null。

create or replace trigger TRBI_A 
BEFORE INSERT ON A
for each row
BEGIN
  IF :new.fk_id IS NOT NULL then
     UPDATE A SET actualTS = CURRENT_TIMESTAMP WHERE id = :new.fk_id;
  END IF;
END;

ORA-04091: 表名发生变化,触发器/函数可能看不到它

问题可能是由触发器试图修改或查询当前正在由触发触发器的语句修改的表引起的。 有谁知道如何修改触发器以使其正确?

【问题讨论】:

【参考方案1】:

您知道问题出在哪里,所以只需稍微阅读一下您的代码:更新您要放置触发器的同一张表。

我想在你的情况下你只需要输入:NEW.actualTS:=current_timestamp,而不使用更新语句。

【讨论】:

以上是关于ORA-04091: 表名正在变异的主要内容,如果未能解决你的问题,请参考以下文章

ORA-04091: 表名正在变异

ora-04091 表正在变异-

ORA-04091: 表 [blah] 正在变异,触发器/函数可能看不到它

ORA-04091: 表 JOSEP.EMP 正在变异,触发器/函数可能看不到它

ORA-04091:表正在变异,触发器/函数可能看不到它,ORA-06512:,ORA-06512:在“SYS.DBMS_SQL”,第 1721 行

如何修复 ORA-04091:表正在变异,触发器/函数可能看不到它?