禁用表的启用触发器SQL服务器

时间:2009-09-07 07:47:37

标签: sql-server triggers

我想创建一个如下所示的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'.

9 个答案:

答案 0 :(得分:226)

使用以下命令:

ALTER TABLE table_name DISABLE TRIGGER tr_name

ALTER TABLE table_name ENABLE TRIGGER tr_name

答案 1 :(得分:66)

之前的行需要以;结尾,因为在SQL DISABLE is not a keyword中。例如:

BEGIN
;
DISABLE TRIGGER ...

答案 2 :(得分:12)

正如马克所说,以前的陈述应以分号结尾。所以你可以使用:

; DISABLE TRIGGER dbo.tr_name ON dbo.table_name

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分:0)

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

我们不能这样写:

Conn.Execute "ENABLE TRIGGER trigger_name ON table_name"

相反,我们可以这样写:

Conn.Execute "ALTER TABLE table_name DISABLE TRIGGER trigger_name"

答案 6 :(得分:0)

我想分享一些对我有帮助的东西。创意归功于@Siavash 和@Shahab Naseer。

我需要一些可以脚本禁用和重新启用特定表的触发器的东西。我通常会尽量远离老虎机,但有时它们可​​能很好用。

我采用了上面的脚本并添加了一个连接到 sysobjects 以便我可以按表名进行过滤。此脚本将禁用表的一个或多个触发器。

select 'alter table '+ (select Schema_name(schema_id) from sys.objects o 
where o.object_id = parent_id) + '.'+object_name(parent_id) + ' ENABLE TRIGGER '+ t.Name as EnableScript,*
from sys.triggers t 
INNER JOIN dbo.sysobjects DS ON DS.id = t.parent_id 
where is_disabled = 0 AND DS.name = 'tblSubContact'

答案 7 :(得分:0)

USE [DatabaseName]
GO

-- HABILITAR TRIGGERS
SELECT 'ALTER TABLE ['+ 
    ( SELECT SCHEMA_NAME(SCHEMA_ID) FROM [sys].[objects] AS O WHERE O.[object_id] = T.[parent_id]) 
        + '].[' + OBJECT_NAME(T.[parent_id]) + '] ENABLE TRIGGER '+ T.[name] + ';' AS [EnableScript], *
        FROM [sys].[triggers] AS T 
            INNER JOIN [sys].[sysobjects] DS ON DS.[id] = T.[parent_id]
        WHERE T.[is_disabled] = 0 
            --AND DS.[name] = 'TableName'

-- DESHABILITAR TRIGGERS
SELECT 'ALTER TABLE ['+ 
    ( SELECT SCHEMA_NAME(SCHEMA_ID) FROM [sys].[objects] AS O WHERE O.[object_id] = T.[parent_id]) 
        + '].[' + OBJECT_NAME(T.[parent_id]) + '] DISABLE TRIGGER '+ T.[name] + ';' AS [EnableScript], *
        FROM [sys].[triggers] AS T 
            INNER JOIN [sys].[sysobjects] DS ON DS.[id] = T.[parent_id]
        WHERE T.[is_disabled] = 0 
            --AND DS.[name] = 'TableName'

答案 8 :(得分:-1)

以下是最简单的方法

尝试代码

ALTER TRIGGER trigger_name DISABLE

那就是:)