如何将所有触发器都放在一个数据库中?


Answers:


29

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

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; 
  2. 将输出复制到新的SQL Server Management Studio窗口中,确认代码执行了您期望的操作,然后执行。


不要将DROP TRIGGER报表需要终止;关系吗?
ypercubeᵀᴹ

MSDN说:Transact-SQL语句终止符。尽管在此版本的SQL Server中,大多数语句不需要分号,但在将来的版本中将需要分号。
AA.SC

2

如果要在中央服务器[ServerA]上运行sql作业以执行触发器删除工作,我将提供PowerShell版本,假定您具有在[ServerA]上安装了SQLPS模块的SQL Server 2012(或更高版本)实例。

假设您要删除[ServerB] SQL Server实例(SQL Server 2005+)上[AdventureWorks]数据库中的所有触发器。

您可以在[ServerA]上运行以下PS:

import-module sqlps -DisableNameChecking;
$db=get-item -Path "sqlserver:\sql\ServerB\default\databases\AdventureWorks";

#before deletion, you can check that triggers do exist
$db.tables.triggers | select name

#now delete
$db.tables.triggers |Where-Object {-not $_.IsSystemObject } | foreach-object {$_.drop()};

#check after deletion
$db.tables.triggers | select name;

请记住用您自己的值替换ServerBAdventureWorks

这是一种非常灵活的解决方案,您可以轻松地对其进行自定义以适应其他不同的要求,例如仅删除触发器属于特定的表集,或者禁用(而不是删除)某些特定的触发器等。

严格地说,这是因为要求是由@马克Sinkinson提供的解决方案是不正确的不是对“system_db_audits”数据库删除触发器,但在另一个数据库中删除触发器 “system_db_audits”。这意味着您需要在'system_db_audits'中创建一个动态sql,以包装@Mark Sinkinson提供的“ dynamic sql”,以删除那些目标触发器,并假设'system_db_audits'和目标db都在同一sql服务器实例上。否则,如果两个数据库不在同一实例上,则处理删除操作(例如通过链接服务器等)将更加“丑陋”。在这种情况下,无论目标db在同一sql实例上或不在同一sql实例上,PS都是一种不错的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.