2011-08-02 34 views
3

我想創建一個觸發器:ORACLE更新觸發後:解決ORA-04091突變表錯誤

create or replace trigger NAME_OF_TRIGGER 
    after insert or update on table1 
    REFERENCING OLD AS OLD NEW AS NEW 
    for each row 

來更新/插入一個表格時自動填寫幾個非強制性的領域。

這需要我使用一個遊標來選擇table2和table1(觸發的主題)。

有沒有辦法避免變異表錯誤,而不使用臨時表的值或自治事務?

回答

9

「有什麼辦法,以避免變異表錯誤,而不使用值 臨時表或一個自治事務?」

tl; dr no。


的變異表錯誤是通過查詢該公司擁有的觸發,或者涉及與所屬表的外鍵關係表的表(至少在舊版本的數據庫引起的,不能確定它是否仍然獲得)。

在正確設計的應用程序中,這不是必需的。這就是爲什麼許多人認爲表格變異是數據模型不佳的一個指標。例如,突變通常與正常化不足有關。


套用傑米·薩溫斯基:有些人,當與變異表例外面對,認爲「我知道,我將使用自主交易。」現在他們有兩個問題。


有時,只需修改BEFORE INSERT或UPDATE觸發器中的NEW值或使用虛擬列即可避免該錯誤。但是您需要發佈更多詳細信息以查看這些是否適用。

但最好的解決方法是不需要任何其他類型。

+0

謝謝!這證實了我一直在閱讀的一個實驗。我現在正在改變:觸發前的新值;似乎工作! –

+0

那麼,理論上這很好,但是當你想在複雜的連接中使用這個變異表時,你會做什麼?讓第二個臨時表填充觸發器的數據,然後在連接中使用該臨時表?當你有數百個這樣的桌子時,你會做什麼?加倍你的模式,並有每個查詢的多個版本,以應付目前正在變異的任何連接表的所有可能性..或使用動態SQL? – Dexter

+0

因此,任何Oracle觸發器都沒有什麼價值......或者我 - 猜測後者可能是有效的,但突變觸發器錯誤是一個皮塔皇家。 –