你可以在触发器内禁用触发器吗? SQL Server 2008

问题描述:

你可以在触发器中禁用和重新启用触发器吗?你可以在触发器内禁用触发器吗? SQL Server 2008

例如,我在前端应用程序中有一条信息,可以放在两个地方之一。如果有人把它放在A位置,我想把它复制到B位置,反之亦然。

所以,我的想法是把两个触发器在不同的表1),当它置于它把它在B. 2)当我们把B中它把它在一个

这将创建一个无休止的循环(我假设?)所以你可以禁用触发器1,而触发器2运行并在最后启用它?

+3

你不应该这样做 - 如果连接1刚刚在表A上完成了一个插入操作 - 触发器将禁用表B上的触发器 - 现在连接2在那里插入了一个插入点,并且触发器不触发。 – 2012-07-06 12:20:23

+2

每当你想在数据库中复制数据时,你应该首先问自己该模型是否正确 - 例如,A和B应该是构建在单个表之上的两个视图? – 2012-07-06 12:21:28

+0

我同意你100次99次。在2个地方使用它的原因是因为一个是前端的字段可被任何人超写,另一个是固定的“仅查看”区域(如在它像网格一样可见)。人们懒得把数据放在两个区域,所以我试图想出一种自动将数据从一个数据复制到另一个数据的方式,反之亦然。 – franglais 2012-07-09 13:24:07

虽然我与达明的意见,即在同一个数据库复制两个表中的数据一般是不可取的,如果你真的有一个很好的理由这样做,那么你可以使用INSTEAD OF触发的,而不是AFTER触发器(同意,我想你”现在重新看)。这样,您可以用两个独立的INSERTs'代替'一个INSERT,您可以自己编写和控制自己。

+0

谢谢 - 没有遇到过INSTEAD OF触发器,所以看起来好像它会做的很好! – franglais 2012-07-09 13:28:10

是,您可以:

ALTER TABLE tablename DISABLE TRIGGER triggername 
ALTER TABLE tablename ENABLE TRIGGER triggername 

虽然,您的解决方案,我想创建一个运行在每边是相同的,并且是足够聪明不乱本身了扳机。

即使智能触发器区分用户/客户端INSERT和触发器'MOVE'。

或者您可以在更新之前检查信息是否在触发器中发生了变化,这会结束循环?