【问题标题】:SQL Server - Drop all triggers from table where trigger names are unknownSQL Server - 从触发器名称未知的表中删除所有触发器
【发布时间】:2019-09-10 14:53:14
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server tsql triggers


    【解决方案1】:

    您可以使用动态 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<>fiddle demo


    编辑:

    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<>fiddle demo

    【讨论】:

    • 这看起来是正确的答案,尽管我的 SQL Server 实例(Microsoft SQL Server 2014 - 12.0.2269.0 (X64))似乎不支持 STRING_AGG。抱歉没有提到 SQL Server 版本。您知道一种适用于 SQL Server 2014 的方法吗?
    • @phicon 那么需要改代码使用@sql += DROP ...
    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多