禁用为表启用触发器SQL Server


128

我想创建一个如下所示的proc,但是语法上有错误。有人可以指出问题吗?

Create PROCEDURE [dbo].[my_proc] AS

BEGIN

DISABLE TRIGGER dbo.tr_name ON dbo.table_name

-- some update statement

ENABLE TRIGGER dbo.tr_name  ON dbo.table_name

END

** Error Message : Incorrect syntax near 'ENABLE'.

Answers:


242

请改用以下命令:

ALTER TABLE table_name DISABLE TRIGGER tr_name

ALTER TABLE table_name ENABLE TRIGGER tr_name

3
这对什么版本的SqlServer有好处?不是为我工作,而DISABLE TRIGGER [dbo].[tr_name] on [schema].[table_name]工作
马斯洛

1
您的回答是正确的。但是实际上@pang语句不需要任何修复,而不仅仅是简单的;!我更喜欢使用ENABLE Trigger。它适用于从2008
ABS

如果您需要执行数据库中的所有表,请使用以下命令:EXECUTE sp_msforeachtable“ ALTER TABLE?disable trigger ALL” go
John Dyer

71

前一行需要以a结尾,;因为在SQL DISABLE 中不是关键字。例如:

BEGIN
;
DISABLE TRIGGER ...

10
我更喜欢这个答案。它解决了问题并给出了解决方案,而不是解决方法。尽管变通办法具有其应有的地位,但重要的是要理解为什么会发生错误,而不是盲目地遵循无上下文的变通办法。
Bpainter

13

正如Mark所提到的,前面的语句应该以分号结尾。因此,您可以使用:

; DISABLE TRIGGER dbo.tr_name ON dbo.table_name

2

在新行中的ENABLE TRIGGER或DISABLE TRIGGER之后,写GO,例如:

DISABLE TRIGGER dbo.tr_name ON dbo.table_name

GO
-- some update statement

ENABLE TRIGGER dbo.tr_name  ON dbo.table_name

GO

0

以下是启用或禁用触发器的动态脚本。

select 'alter table '+ (select Schema_name(schema_id) from sys.objects o 
where o.object_id = parent_id) + '.'+object_name(parent_id) + ' ENABLE TRIGGER '+
Name as EnableScript,*
from sys.triggers t 
where is_disabled = 1

0

如果要直接从源代码执行ENABLE TRIGGER:

我们不能这样写:

Conn.Execute "ENABLE TRIGGER trigger_name ON table_name"

相反,我们可以这样写:

Conn.Execute "ALTER TABLE table_name DISABLE TRIGGER trigger_name"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.