如何在不触发UPDATE触发器的情况下“更新”SQL Server表

时间:2013-09-24 07:21:26

标签: sql sql-server triggers

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

3 个答案:

答案 0 :(得分:4)

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

DISABLE TRIGGER {[schema_name。 ] trigger_name [,... n] |所有} ON {object_name |数据库|所有服务器} [; ]

ENABLE TRIGGER {[schema_name。 ] trigger_name [,... n] |所有} ON {object_name |数据库|所有服务器} [; ]

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

DISABLE TRIGGER ALL ON tblCurrent;

答案 1 :(得分:3)

执行此操作的一种方法是在tblCurrent中添加一些数据,使您能够检测到您描述为“首次上传”的情况。例如,BIT列“FirstUploaded”,或首次上载时为NULL的列,甚至是BIT列“DontFireTrigger”。

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

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

答案 2 :(得分: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