【问题标题】:how to stop/fire trigger in stored procedure dynamically?如何动态停止/触发存储过程中的触发器?
【发布时间】:2013-01-22 05:02:27
【问题描述】:
假设我在数据库中有一个 MyTab 表。我有一个触发器,例如,删除此表上的触发器。
然后在存储过程中,我尝试从该表中删除数据,但只想为该删除停止删除触发器。之后,将扳机恢复正常。是否可以在存储过程中有代码,例如:
stop trigger on MyTab;
delete from MyTab where ...;
put the trigger back;
【问题讨论】:
标签:
tsql
stored-procedures
triggers
sql-server-2008-r2
【解决方案1】:
正如here 所提到的,您可以禁用和启用触发器,但我可能会将其放在 try-catch 和/或事务中,这样您就不会因为错误而被禁用触发器卡住。
例如:
set xact_abort on; -- Auto-rollback on any error
begin transaction;
alter table MyTab disable trigger TR_MyTab_Delete;
delete from MyTab where 1/0 = 1; -- Causes div by zero error
alter table MyTab enable trigger TR_MyTab_Delete; -- Won't run becuase of above error
commit;
上面的脚本会抛出一个错误,但不会禁用触发器,因为set xact_abort on 保证我的事务被回滚,包括禁用触发器。