2012-02-17 74 views
0

我在Oracle中有一個變異表有問題。我有兩個表格,CustomerPerson。在修改Person行期間,我必須更新ChangeDate,Customer,所以我創建了一個觸發器。不幸的是,在某些情況下,Customer上觸發了更新Person,這導致了表格變異問題。幸運的是,如果此更改是由Customer更改引起的,則在更新Person時,我不必更新Customer.ChangeDate衝突觸發器 - 變異表

所以這裏是我的問題:我怎麼能認識到Person觸發器是由Customer觸發器觸發的?

+0

執行「某些情況下」,其中'customer'必須更新'person'包括其中*僅*了'changedate'被修改的情況下,當'person'直接更新時似乎是這種情況?發佈兩個觸發器的代碼和兩個表的結構可能會有幫助。 – 2012-02-17 12:17:31

+0

嗨,亞歷克斯,不幸的是,直到星期一,我將無法粘貼觸發器的代碼,但我知道如果只更改'changedate',那麼'person'沒有更新。 – 2012-02-17 13:55:45

回答

0

最後我用global temporary table與清理完畢後提交:

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
    column1 NUMBER, 
    column2 NUMBER 
) ON COMMIT DELETE ROWS; 
4

突變表錯誤幾乎總是表示數據模型或相關業務流程存在問題。最常見的原因是反規範化,即一個表中的數據以某種方式在另一個表中重複的情況。這似乎就是這種情況 - 您的CUSTOMER表保存着關於另一個表PERSON的元數據。只有在另一個方向上的信息級聯更加複雜。

解決這種情況的正確方法是整理數據模型。 CUSTOMER是PERSON的一個子類型還是相反?確定哪一個是父母,哪些是孩子,並確保信息只向一個方向流動:可能是從超類型到子類型。儘管更好的解決方案是完全刪除數據傳播。

有解決方法,但它們涉及包和其他應用更改的設計。

0

@APC是完全正確的。

通過記住我無法與數據模型協商糾正的時間,我會妥協一點。在這種情況下,您可能想要在一個包中使用一個變量來觸發另一個觸發器。

您還可以將WHEN條件放在觸發器執行子句中。

最後,如果你覺得自己像一個真正的黑客,你可以詢問PL/SQL調用棧並在那裏尋找其他觸發器。