我有一个更新触发器,可以更新表中的一些重要状态字段tblCurrent
。
当我第一次将每天的一批记录上传到tblCurrent
(大约 10K 条记录)中时,我会通过三个单独的存储过程执行一些更新,当它们第一次上传时,然后才上传。如何防止更新触发器在这三个初始更新期间运行?
3 回答
您可以暂时禁用表的触发器,然后重新启用它们。MSDN 文章。
禁用触发器 { [ schema_name 。] trigger_name [ ,...n ] | 全部 } 开启 { 对象名称 | 数据库 | 所有服务器 } [ ; ]
启用触发器 { [ schema_name 。] trigger_name [ ,...n ] | 全部 } 开启 { 对象名称 | 数据库 | 所有服务器 } [ ; ]
例如,要禁用给定表的所有触发器,请运行以下语句:
DISABLE TRIGGER ALL ON tblCurrent;
一种方法是在其中包含一些数据tblCurrent
,使您能够检测到您描述为“首次上传”的情况。例如,BIT 列“FirstUploaded”,或首次上传时为 NULL 的列,甚至是 BIT 列“DontFireTrigger”。
然后编写触发器来检测这种情况,并有条件地更新状态字段。
诚然,这看起来像一个讨厌的 hack,但也许并不比其他解决方案差。
您可以使用会话变量 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