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

问题描述 投票:0回答:11

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

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'.
sql-server triggers
11个回答
286
投票

请改用以下命令:

ALTER TABLE table_name DISABLE TRIGGER tr_name

ALTER TABLE table_name ENABLE TRIGGER tr_name

82
投票

前面的行需要以

;
结尾,因为在 SQL 中
DISABLE
不是关键字。例如:

BEGIN
;
DISABLE TRIGGER ...

15
投票

正如马克提到的,前面的语句应该以分号结束。所以你可以使用:

; DISABLE TRIGGER dbo.tr_name ON dbo.table_name

6
投票

在新行中的 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

1
投票

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

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

1
投票

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

1
投票
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'

0
投票

-- 哈比利塔触发器 选择“更改表[”+ ( SELECT SCHEMA_NAME(SCHEMA_ID) FROM [sys].[objects] AS O WHERE O.[object_id] = T.[parent_id]) + '].[' + OBJECT_NAME(T.[parent_id]) + '] 启用触发器 '+ T.[name] + ';' AS [启用脚本], * FROM [sys].[触发器] AS T INNER JOIN [sys].[sysobjects] DS ON DS.[id] = T.[parent_id] WHERE T.[is_disabled] = 1 -- 必须为 1,而不是 0 -- --AND DS.[名称] = '表名称'


0
投票

缓冲区状态:

已固定:当前使用。 干净:意味着缓冲区现在已取消固定,并且如果当前(数据块)不再被引用,则可以立即老化。内容要么与磁盘同步,要么缓冲区包含块的 CR 快照。 空闲/未使用:意味着缓冲区是空的,因为实例刚刚启动。该状态与 Clean 非常相似,只不过缓冲区尚未被使用。 脏:缓冲区不再固定,但内容(数据块)已更改,必须通过 DBWn 将其刷新到磁盘才能老化。 三缓冲池:

保留 回收 默认 数据库缓冲区缓存参数:

DB_CACHE_SIZE(BLOCK SIZE 将是 DB_BLOCK_SIZE 中声明的大小) DB_KEEP_CACHE_SIZE DB_2K_CACHE_SIZE DB_4K_CACHE_SIZE DB_8K_CACHE_SIZE DB_16K_CACHE_SIZE DB_32K_CACHE_SIZE DB_RACYCLE_CACHE_SIZE DB_BLOCK_SIZE(默认块大小,以后无论如何都无法更改)

显示参数DB_BLOCK_SIZE;

显示参数db_cache_size;


-1
投票

下面是最简单的方法

尝试代码

ALTER  TRIGGER trigger_name  DISABLE

就是这样:)


-1
投票

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

我们不能这样写:

Conn.Execute "ENABLE TRIGGER trigger_name ON table_name"

相反,我们可以写:

Conn.Execute "ALTER TABLE table_name DISABLE TRIGGER trigger_name"
© www.soinside.com 2019 - 2024. All rights reserved.