使用SQL禁用所有表上具有特定名称的所有触发器

时间:2015-04-28 15:26:44

标签: sql sql-server triggers

我想禁用名称以TRG开头的所有触发器。我想遍历我数据库中的所有表格。

到目前为止,我有这个:

ALTER TABLE [dbo].[Customer] DISABLE TRIGGER TRG

2 个答案:

答案 0 :(得分:3)

我唯一知道的是使用查询来构建alter table语句,然后复制/粘贴它们:

        SELECT 
             sysobjects.name AS trigger_name 
            ,USER_NAME(sysobjects.uid) AS trigger_owner 
            ,s.name AS table_schema 
            ,OBJECT_NAME(parent_obj) AS table_name ,
            'ALTER TABLE ' + OBJECT_NAME(parent_obj) + ' DISABLE TRIGGER ' + SYSobjects.name + ';' as Stmt

        FROM sysobjects 

        INNER JOIN sys.tables t 
            ON sysobjects.parent_obj = t.object_id 

        INNER JOIN sys.schemas s 
            ON t.schema_id = s.schema_id 
    WHERE sysobjects.type = 'TR' 
and sysobjects.name like 'TRG%'.

答案 1 :(得分:1)

无需循环播放。这是错误的心态。您只需要利用sys.triggers并构建动态sql。一旦你对@SQL的输出感到满意,就取消注释exec行。

declare @SQL nvarchar(MAX) = ''

select @SQL = @SQL + 'alter table [' + OBJECT_NAME(parent_id) + '] DISABLE TRIGGER ' + name + ';'
from sys.triggers
where name like 'trg%'

select @SQL

--exec sp_executesql @SQL