TSQL - 禁用事务中的触发器

问题描述 投票:10回答:2

我一直在寻找高低,我无法找到一个满意的答案。这往往归结为TRANSACTION在SQL Server中的工作原理。

基本上,这会做我认为它做的事情。

BEGIN TRAN

DISABLE [my_update_trigger] ON [my_table]

/*.. Do Some Updates ..*/

ENABLE [my_update_trigger] ON [my_table]

COMMIT TRAN

我希望能够在表中修复一些数据,而无需运行我在桌面上的更新触发器。这是一个Web应用程序,所以我想确保如果从Web应用程序在桌面上完成更新,当我正在做我的工作时,[my_update_trigger]仍将触发Web应用程序。

sql sql-server sql-server-2008 tsql triggers
2个回答
2
投票

更新的东西是好的 - 禁用启用等。

DISABLE TRIGGER [my_update_trigger] ON [my_table]

/*.. Do Some Updates ..*/

ENABLE TRIGGER [my_update_trigger] ON [my_table]

看看msdn页面:http://msdn.microsoft.com/en-us/library/ms189748.aspx

关于使它特定于会话:我怀疑这是否可行 - 禁用/启用是DDL而不是DML,即它们作用于数据库对象而不是数据。我不会想到这将属于交易范围


0
投票

我做了一些测试,显然,你的代码完全符合你的要求。这是我的测试协议:

   -- Session 1 --                                   -- Session 2 --
1. BEGIN TRANSACTION
2. DISABLE TRIGGER [my_update_trigger] ON [my_table]
3.                                                   UPDATE my_table SET x = y   -- blocks
4. ROLLBACK
                                                     -- unblocks *and triggers the trigger*

此外,SELECT is_disabled FROM sys.triggers where name = 'my_update_trigger';显示在步骤2之后触发器被禁用,在步骤4之后启用。

因此,我的结论是:

  • 是的,启用/禁用触发器是“全局”而不是“每个会话”(通过查询sys.triggers可以看到),但是
  • SQL Server锁定机制确保禁用事务中的触发器会锁定表,因此其他会话不会“错过”其触发器。

提醒一句:DISABLE TRIGGER不会触发implicit transaction。如果您使用(经典)ADO,这很重要,因为Connection.BeginTrans不会启动显式事务,而是会更改SET IMPLICIT_TRANSACTION ON。您需要在禁用触发器之前执行one of the operations listed here,否则DISABLE TRIGGER语句将在事务之外。

© www.soinside.com 2019 - 2024. All rights reserved.