我有一个更新触发器,用于更新表tblCurrent
中的一些重要状态字段。
当我第一次上传每日批量记录到tblCurrent
(大约10K条记录)时,我会通过三个单独的存储过程在第一次上传时执行一些更新,然后才会上传。 如何防止在这三个初始更新期间运行更新触发器?如何更新SQL Server表而不触发UPDATE触发器
回答
您可以暂时禁用表格的触发器,然后启用它们。 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;
但这会影响其他并发连接。不是一个好主意。以下文章有一些替代方法:http://www.mssqltips.com/sqlservertip/1591/disabling-a-trigger-for-a-specific-sql-statement-or-session/ – Joe
这是完美的。在tblCurrent的新批记录后一天运行一次的三个“存储过程”通常会在触发器启用后总共花费20分钟时间。现在需要五分钟时间。谢谢。 – aSystemOverload
做到这一点的一种方法是在tblCurrent
中有一些数据,使您能够检测到您描述为“首次上传”的情况。例如,BIT列“FirstUploaded”,或首次上传时为NULL的列,甚至是BIT列“DontFireTrigger”。
然后编写触发器来检测这种情况,并有条件地更新状态字段。
无可否认,这看起来像一个讨厌的黑客,但也许并不比其他解决方案更糟。
你可以使用会话变量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
- 1. SQL Server触发器更新
- 2. 更新触发器SQL Server
- 3. SQL Server触发器基于表触发器更新其他表
- 4. SQL Server:触发器触发
- 5. Postgres - 'after update'触发器不会触发
- 6. 的SQL Server触发更新
- 7. MySQL触发UPDATE不触发
- 8. Oracle触发器UPDATE而不是INSERT
- 9. SQL Server触发器更新列值
- 10. 在sql server中更新触发器
- 11. SQL Server 2008更新触发器
- 12. SQL Server 2014:更新FileTable触发器File_Stream.PathName()
- 13. 更新触发器在SQL Server 2008
- 14. SQL Server触发器和批量更新
- 15. SQL Server更新后触发器
- 16. SQL Server INSERT在后更新触发器
- 17. SQL Server触发器 - 复制行更新
- 18. 更新触发器SQL Server 2008
- 19. 如何动态更新所有字段而不是更新触发器SQL Server
- 20. FoxPro和SQL Server而不是触发器
- 21. SQL触发器不工作/更新表
- 22. Mysql触发器做INSERT而不是UPDATE
- 23. AFTER UPDATE触发器
- 24. SQL Server触发器
- 25. Sql Server触发器
- 26. Sql Server触发器
- 27. SQL Server触发器
- 28. 确定更新触发器是否由ON UPDATE CASCADE触发
- 29. SQL Server 2005 - 触发器没有触发
- 30. 创建INSERT触发器更新CreatedBy和UpdatedBy而不触发相同表上的更新触发器
的[有没有一种方法来禁用一个SQL Server触发器执行的只是一个特定的范围是什么?]可能重复(HTTP:/ /stackoverflow.com/questions/174600/is-there-a-way-to-disable-a-sql-server-trigger-for-just-a-particular-scope-of-ex) –
一个令人讨厌的黑客将创建另一个表分组到您的其他表。这个新表有1列,称为锁定。这是真的还是假的。在存储过程之前,将其设置为false。将其设置为true后。当然,这意味着你的所有查询都必须手动检查条件,但这是我们如何做的。这是一个丑陋的黑客攻击,容易出现人为错误,但它确实有效。 – Dave