2012-03-09 127 views
2

我有一個要求,從一個表鏡像插入/更新/刪除操作到另一個。 例如,在表A上插入必須複製到tableB中,更新到應用於tableB的tableA,並從tableA中刪除應用於tableB。 就像這樣簡單,除了tableB有一個額外的列爲一個常數值,所以非常簡單的觸發器是必需的。插入/更新/刪除或單一觸發器更好嗎?

我不確定編寫3個單獨的觸發器還是有一個觸發器可以執行所有操作。

這是針對3個數據庫:Sybase ASE,MSSQL和Oracle,我想讓它保持類似的解決方案(對於所有數據庫3或3)。

這只是一個偏好問題,有3個觸發器與1個,還是對這兩種解決方案都有實際好處?

+1

你能否更新tableB的結構,以便它只有對tableA和附加列的引用 - 這種方式只存儲一次數據。 – Steve 2012-03-09 18:41:01

+1

你有沒有考慮複製? – 2012-03-09 18:44:13

+0

實際上也有tableC,它的操作也鏡像到TableB中。附加字段包含有關該行從哪個表複製的信息。我必須查看您發佈的建議,但我不確定技術上如何執行這些建議。我希望只有一個表(tableB),並且沒有tableA或tableC,但目前這不是一個選項,我們得到了遺留代碼更新tableA和tableC。 – Alex 2012-03-09 18:59:01

回答

3

假設你實際上需要一個觸發器,並且表B不能簡單地定義爲表A頂部的視圖,或者表B不能簡單地使用引用A中的行的外鍵和常量來定義, A不能被重新定義爲添加額外的列(可能具有常量的默認值),一個觸發器至少可以讓您將所有相關的邏輯保存在一個地方,而不是在您做類似事情時需要更新多個地方爲A添加一個新列。但是我會非常小心任何涉及兩個不同表反映基本上相同的數據的架構。這違反了規範化,增加了系統的I/O工作量,並且使整個系統更加複雜。

+0

同意所有觀點,儘管目前我可以做的不多。希望這張新桌子將成爲未來的桌子。謝謝你的答案。 – Alex 2012-03-09 19:57:35

2

當試圖確定表A上的操作是什麼時,除了觸發器執行本身的效率損失之外,分離觸發器沒有效率。

IE 3單獨的觸發器可以不使用驗證邏輯來​​確定表A中剛發生的事情,因爲被觸發的觸發器本身可以表現在一個泡泡中,因爲它知道它是在觸發時,它是由於單個操作。

鑑於三合一觸發器,您必須檢查虛擬刪除和插入表的狀態,並且每次觸發時都會導出操作。

如果您不擔心導出「操作」的性能影響(確實很小),或者甚至不需要在表B中知道剛剛在Aable A上發生的「操作」...那麼我認爲1完全沒問題。