使用 SQL 在所有表上禁用所有具有特定名称的触发器
DISABLE all triggers with a particular name on all tables using SQL
我想禁用名称以 TRG
开头的所有触发器。我想遍历数据库中的所有表。
到目前为止我有这个:
ALTER TABLE [dbo].[Customer] DISABLE TRIGGER TRG
此处无需循环。那是错误的心态。您只需要利用 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
我唯一知道的是使用查询来构建 alter table 语句,然后 copy/paste 那些:
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%'.
我想禁用名称以 TRG
开头的所有触发器。我想遍历数据库中的所有表。
到目前为止我有这个:
ALTER TABLE [dbo].[Customer] DISABLE TRIGGER TRG
此处无需循环。那是错误的心态。您只需要利用 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
我唯一知道的是使用查询来构建 alter table 语句,然后 copy/paste 那些:
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%'.