2016-08-01 63 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