Oracle ORA-04091 錯誤說明和解決方式

在 Oracle 資料庫中建立一個 Trigger ,執行時出現下列錯誤:
    
[42000][4091] ORA-04091: table my_table is mutating, triggerfunction may not see it ORA-06512: at "my_trigger", line 3 ORA-04088: error during execution of trigger 'my_trigger' Position: 12
    

原因是 Oracle 資料庫有限制每行執行(FOR EACH ROW)的 Trigger 只能取得當前修改的那筆資料,無法存取該 Trigger 所在的 Table, View 等的資料。 在筆者的測試中(oracle 11g)就算是 A table 上的 A trigger 修改 B table 的資料觸發 B trigger ,然後在 B trigger 中有存取 A table 也不行 (例: select * from a_table) 。 A trigger 去觸發 stored procedure,在 stored procedure 中有查詢 A table 也不能。(在 A table insert/update 時不會出現錯誤阻止新增/更新,但資料 stored procedure 會執行失敗)。

不過後來筆者發現第二個 trigger 會無法執行是因為筆者也使用了每行執行(FOR EACH ROW)的 Trigger,只要第二個被間接觸發的那個 trigger 是依照指令執行(沒有 FOR EACH ROW 關鍵字)的 trigger 即可

留言