如何删除单个数据库中的所有触发器?

Moh*_*oub 18 trigger sql-server-2008 sql-server

我有一个包含 104 个触发器的数据库,有没有办法使用单个命令从名为“system_db_audits”的单个数据库中删除所有触发器?

Mar*_*son 35

您可以使用动态 SQL 和sys.triggersDMV 来构建您可以执行的查询。

is_ms_shipped排除 SQL Server 附带的任何触发器。
parent_class_desc对象级别触发器的过滤器,而不是数据库级别。

更改PRINTEXEC一旦您满意的输出。

USE system_db_audits;
GO

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += 
    N'DROP TRIGGER ' + 
    QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.' + 
    QUOTENAME(t.name) + N'; ' + NCHAR(13)
FROM sys.triggers AS t
WHERE t.is_ms_shipped = 0
  AND t.parent_class_desc = N'OBJECT_OR_COLUMN';

PRINT @sql;
Run Code Online (Sandbox Code Playgroud)


AA.*_*.SC 5

使用Sys.Triggers元数据表,其中包含作为触发器的每个对象的行

  1. 单击此处显示的工具栏按钮将输出模式更改为文本:

在此处输入图片说明

  1. 执行这个脚本:

    USE YourDBName
    GO
    SELECT ' GO ' + Char(10) + Char(13) + 'DROP TRIGGER ' 
        + QUOTENAME(OBJECT_SCHEMA_NAME(O.[object_id])) + '.' 
        + QUOTENAME(name)
    FROM sys.sql_modules as M 
        INNER JOIN sys.triggers as O 
            ON M.object_id = O.object_id; 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将输出复制到新的 SQL Server Management Studio 窗口中,验证代码执行您期望的操作,然后执行。