我最近开始研究一个大型复杂的应用程序,由于这个错误,我刚刚被分配了一个错误:
ORA-04091: table SCMA.TBL1 is mutating, trigger/function may not see it
ORA-06512: at "SCMA.TRG_T1_TBL1_COL1", line 4
ORA-04088: error during execution of trigger 'SCMA.TRG_T1_TBL1_COL1'
有问题的触发器看起来像
create or replace TRIGGER TRG_T1_TBL1_COL1
BEFORE INSERT OR UPDATE OF t1_appnt_evnt_id ON TBL1
FOR EACH ROW
WHEN (NEW.t1_prnt_t1_pk is not null)
DECLARE
v_reassign_count number(20);
BEGIN
select count(t1_pk) INTO v_reassign_count from TBL1
where t1_appnt_evnt_id=:new.t1_appnt_evnt_id and t1_prnt_t1_pk is not null;
IF (v_reassign_count > 0) THEN
RAISE_APPLICATION_ERROR(-20013, 'Multiple reassignments not allowed');
END IF;
END;
该表有一个主键“ t1_pk
”、一个“约会事件 id”
t1_appnt_evnt_id
和另一列“ t1_prnt_t1_pk
”,它可能包含也可能不包含另一行的t1_pk
.
看来触发器正在尝试确保没有其他具有相同内容的人t1_appnt_evnt_id
引用同一行,如果该行引用另一行,则该行引用另一行的引用。
DBA 对错误报告的评论说“删除触发器,并在代码中执行检查”,但不幸的是,他们在 Hibernate 之上有一个专有的代码生成框架,所以我什至无法弄清楚它实际上在哪里被写出来,所以我希望有办法让这个触发器工作。有没有?