首页 > 解决方案 > SQL Server - 从触发器名称未知的表中删除所有触发器

问题描述

我正在使用 SignalR,它会在数据库表上自动创建具有随机名称的触发器。

有没有一种方法可以使用 T-SQL 脚本从特定表中删除所有触发器而不删除该表?

标签: sql-servertsqltriggers

解决方案


您可以使用动态 SQL 和sys.triggers系统表:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = STRING_AGG(FORMATMESSAGE(N'DROP TRIGGER %s.%s;'
                                      ,QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id))
                                      ,QUOTENAME(t.name))
                        ,NCHAR(13))
FROM sys.triggers AS t
WHERE t.is_ms_shipped = 0
  AND t.parent_id = OBJECT_ID('table_name');

PRINT @sql;  -- debug
--EXEC(@sql);

db<>小提琴演示


编辑:

SQL Server 2012 版本:

DECLARE @sql NVARCHAR(MAX) = '';

SELECT @sql += FORMATMESSAGE(N'DROP TRIGGER %s.%s;'
                                      ,QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id))
                                      ,QUOTENAME(t.name))
                        + NCHAR(13)
FROM sys.triggers AS t
WHERE t.is_ms_shipped = 0
  AND t.parent_id = OBJECT_ID('t');

PRINT @sql;  -- debug
--EXEC(@sql);

db<>小提琴演示


推荐阅读