我一直在寻找高低,我无法找到一个满意的答案。这往往归结为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应用程序。
更新的东西是好的 - 禁用启用等。
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,即它们作用于数据库对象而不是数据。我不会想到这将属于交易范围
我做了一些测试,显然,你的代码完全符合你的要求。这是我的测试协议:
-- 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
可以看到),但是提醒一句:DISABLE TRIGGER
不会触发implicit transaction。如果您使用(经典)ADO,这很重要,因为Connection.BeginTrans
不会启动显式事务,而是会更改SET IMPLICIT_TRANSACTION ON
。您需要在禁用触发器之前执行one of the operations listed here,否则DISABLE TRIGGER
语句将在事务之外。