最近,我開始在大型複雜應用程序的工作,而我剛剛被分配了一個錯誤,由於這個錯誤:ORA-04091:表[胡說]在變異,觸發/功能可能無法看到它
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之上,所以我甚至不能在哪裏它實際上寫出來,所以我希望有一種方法來使這個觸發器工作。在那兒?
僅在代碼中執行這樣的規則是一個壞主意 - 多個同時更新很難處理。如果你在你的代碼中同步,你最終可能會在該鎖和數據庫鎖之間造成骯髒的死鎖。 – 2008-12-17 21:27:03
底線 - Oracle觸發器很糟糕。除了更新序列值或「updated_by」類型字段之外,避免它們像鼠疫一樣。他們的觸發器在90年代吸入,現在吸入。 – 2017-04-12 02:08:42