Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为表禁用启用触发器SQL server_Sql Server_Triggers - Fatal编程技术网

Sql server 为表禁用启用触发器SQL server

Sql server 为表禁用启用触发器SQL server,sql-server,triggers,Sql Server,Triggers,我想创建一个如下所示的进程,但它在语法上有错误。 有人能指出这个问题吗 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 'ENA

我想创建一个如下所示的进程,但它在语法上有错误。 有人能指出这个问题吗

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'.

请改用以下命令:

ALTER TABLE table_name DISABLE TRIGGER tr_name

ALTER TABLE table_name ENABLE TRIGGER tr_name

前面的行需要以
结尾中禁用
。例如:

BEGIN
;
DISABLE TRIGGER ...

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

; DISABLE TRIGGER dbo.tr_name ON dbo.table_name

下面是最简单的方法

试试代码

ALTER TRIGGER\u name DISABLE


就是这样:)

在新行写入GO中启用触发器或禁用触发器之后,例如:

DISABLE TRIGGER dbo.tr_name ON dbo.table_name

GO
-- some update statement

ENABLE TRIGGER dbo.tr_name  ON dbo.table_name

GO

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

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

如果要直接从源代码执行启用触发器:

我们不能这样写:

Conn.Execute "ENABLE TRIGGER trigger_name ON table_name"
相反,我们可以写:

Conn.Execute "ALTER TABLE table_name DISABLE TRIGGER trigger_name"

我想分享一些帮助我的东西。创意归功于@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'

我更喜欢这个答案。它解决了问题并给出了解决方案,而不是解决方法。虽然变通方法有其一席之地,但重要的是要理解为什么会发生错误,而不是盲目地遵循没有上下文的变通方法。这种方法适用于什么版本的SqlServer?在[schema].[table\u name]上禁用触发器[dbo].[tr\u name]时,
对我不起作用。您的答案是正确的。但实际上@pang语句不需要任何修复,而需要一个简单的
!我更喜欢使用
启用触发器
。它适用于从2008年开始的所有SQL Server。如果需要执行数据库中的所有表,请使用以下命令:执行sp_msforeachtable“ALTER TABLE?disable trigger all”goNot working on SQL Server>2008 R2,问题是MS SQL Server
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'