2016-08-01 26 views
0

我使用觸發器來保持單個數據庫中兩個相同的表同步。一個用於內部專有系統,另一個用於向外界展示一部分數據。我無法爲兩者使用相同的表格。SQL Server 2表同步遞歸

我需要更新,插入,刪除任何表中應用於其他。

到目前爲止,我在兩個表上使用觸發器而不是預定的存儲過程,因爲我想立即更新。問題是,表A的更新觸發了更新表B的觸發器,該表觸發更新表A的觸發器,觸發器觸發表B ......等等。

什麼是停止遞歸的最佳方法?

一種方法是先檢查數據,看它是否是不同的,這樣的事情:

 SELECT @cempno = inserted.cempno FROM inserted 

     SELECT @count = COUNT(*) 
      FROM jcempy j INNER JOIN zhhjcempy z ON j.cempno = z.cempno AND j.cempno = @cempno 
      WHERE (j.ccostcode <> z.ccostcode) 
      OR (j.cimearnreg <> z.cimearnreg) 
      OR (j.cimearnot <> z.cimearnot) 
      OR (j.cimearndt <> z.cimearndt) 
      OR (j.cimearnl1 <> z.cimearnl1) 

     IF @count = 1 
     BEGIN 
      -- Update the record 
     END 

另一種方法可以是使用保存狀態標誌,以顯示該表第一發起的第三個表更新,但我有一種感覺,管理這個問題一旦有100名用戶在系統中喋喋不休,就會出現問題。

任何想法或對數據檢查會導致哪種性能損失的評論?

謝謝!

+0

您是否能夠將一個表實際上指向另一個[可更新視圖](https://msdn.microsoft.com/en-nz/library/ms187956.aspx#Anchor_3)? – Blorgbeard

+0

@Blorgbeard不幸的是,這裏涉及第三方工具。有趣的想法,但我沒有想到這一點。 – NelsonH

+0

您需要重新設計,不使用觸發器。有句古話:「有一隻手錶的人知道現在是幾點,一個有兩隻手的人永遠不會確定。」 – JVC

回答

0

如果您無法避免觸發器,請在觸發器內查看@@NESTLEVEL

它應該總是相同的數字。如果數字越大,就什麼都不做。

+0

這可以工作,但我怎麼知道@@ NESTLEVEL值應該是什麼?我在測試中得到了一致的結果 - 這是否總是相同?感謝你的回答! – NelsonH

+0

如果你做直接更新/刪除/插入它應該是「1」。如果您使用這些更新程序,直接更新tat編號的組合可能會有所不同。使用視圖或同義詞更好地擺脫觸發器,並將所有數據都放在一個表中。 –

+0

該值實際上是3.我使用TRIGGER_NESTLEVEL()來查看相對觸發器的對象ID。我瞭解這些評論不使用觸發器,但我沒有重新設計的選項。聽到我的供應商之一,同義詞/可更新的意見是絕對不行的。必須是桌子。非常感謝迴應,感激。 – NelsonH