SQL Server 2005:T-SQL暂时禁用触发器

时间:2020-03-06 14:37:28  来源:igfitidea点击:

是否可以为一批命令禁用触发器,然后在批处理完成后启用它?

我确定我可以删除触发器并重新添加它,但是我想知道是否还有另一种方法。

解决方案

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

http://msdn.microsoft.com/zh-CN/library/ms189748(SQL.90).aspx

其次是逆:

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

http://msdn.microsoft.com/zh-CN/library/ms182706(SQL.90).aspx

但是,执行此操作几乎总是一个坏主意。我们将弄乱数据库的完整性。在没有考虑后果的情况下,不要这样做,并与dbas核对(如果有的话)。

如果我们确实遵循Matt的代码,请务必记得重新打开触发器。还要记住,触发器在关闭时对表的每个插入,更新或者删除操作都是禁用的,而不仅仅是针对进程,因此,如果必须执行此操作,则在数据库最不活动的时间内执行(最好在单用户模式下)。

如果我们需要执行此操作以导入大量数据,请考虑批量插入不会触发触发器。但是,那么在大容量插入之后,过程将必须解决由触发器引起的任何数据完整性问题。

有时要从外部数据源填充空数据库或者调试数据库中的问题,我需要禁用所有触发器和约束。
为此,我使用以下代码:

要禁用所有约束和触发器:

sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER  all"

要启用所有约束和触发器:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? ENABLE TRIGGER  all"

我前一段时间在SQLServerCentral上找到了该解决方案,但是需要修改启用约束部分,因为原始解决方案无法完全正常工作