2013-09-24 146 views
3

我有一个更新触发器,用于更新表tblCurrent中的一些重要状态字段。
当我第一次上传每日批量记录到tblCurrent(大约10K条记录)时,我会通过三个单独的存储过程在第一次上传时执行一些更新,然后才会上传。 如何防止在这三个初始更新期间运行更新触发器?如何更新SQL Server表而不触发UPDATE触发器

+0

的[有没有一种方法来禁用一个SQL Server触发器执行的只是一个特定的范围是什么?]可能重复(HTTP:/ /stackoverflow.com/questions/174600/is-there-a-way-to-disable-a-sql-server-trigger-for-just-a-particular-scope-of-ex) –

+0

一个令人讨厌的黑客将创建另一个表分组到您的其他表。这个新表有1列,称为锁定。这是真的还是假的。在存储过程之前,将其设置为false。将其设置为true后。当然,这意味着你的所有查询都必须手动检查条件,但这是我们如何做的。这是一个丑陋的黑客攻击,容易出现人为错误,但它确实有效。 – Dave

回答

3

您可以暂时禁用表格的触发器,然后启用它们。 MSDN article

DISABLE TRIGGER {[schema_name。 ] trigger_name [,... n] | ALL} ON {object_name | DATABASE | ALL SERVER} [; ]

ENABLE TRIGGER {[schema_name。 ] trigger_name [,... n] | ALL} ON {object_name | DATABASE | ALL SERVER} [; ]

例如禁用对给定的表运行的所有触发器以下语句:

DISABLE TRIGGER ALL ON tblCurrent; 
+3

但这会影响其他并发连接。不是一个好主意。以下文章有一些替代方法:http://www.mssqltips.com/sqlservertip/1591/disabling-a-trigger-for-a-specific-sql-statement-or-session/ – Joe

+0

这是完美的。在tblCurrent的新批记录后一天运行一次的三个“存储过程”通常会在触发器启用后总共花费20分钟时间。现在需要五分钟时间。谢谢。 – aSystemOverload

3

做到这一点的一种方法是在tblCurrent中有一些数据,使您能够检测到您描述为“首次上传”的情况。例如,BIT列“FirstUploaded”,或首次上传时为NULL的列,甚至是BIT列“DontFireTrigger”。

然后编写触发器来检测这种情况,并有条件地更新状态字段。

无可否认,这看起来像一个讨厌的黑客,但也许并不比其他解决方案更糟。

0

你可以使用会话变量CONTEXT_INFO。之前CONTEXT_INFO设置为某个值,然后更新测试触发内部

-- update code SET Context_Info 0x55555 Update Table set ...

-- Code Inside the trigger SELECT @Cinfo = Context_Info() IF @Cinfo <> 0x55555 BEGIN ... END