我有一个包含104个触发器的数据库,有没有办法用一个命令从一个名为'system_db_audits的数据库中删除所有触发器?
我有一个包含104个触发器的数据库,有没有办法用一个命令从一个名为'system_db_audits的数据库中删除所有触发器?
Answers:
您可以使用动态SQL和sys.triggers
DMV来构建可以执行的查询。
is_ms_shipped
排除SQL Server附带的任何触发器。
parent_class_desc
对象级触发器(而不是数据库级)的筛选器。
更改PRINT
到EXEC
一旦您满意的输出。
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;
使用Sys.Triggers
元数据表,其中每个行都包含一行作为触发器的对象
执行此脚本:
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;
将输出复制到新的SQL Server Management Studio窗口中,确认代码执行了您期望的操作,然后执行。
如果要在中央服务器[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;
请记住用您自己的值替换ServerB和AdventureWorks。
这是一种非常灵活的解决方案,您可以轻松地对其进行自定义以适应其他不同的要求,例如仅删除触发器属于特定的表集,或者禁用(而不是删除)某些特定的触发器等。
严格地说,这是因为要求是由@马克Sinkinson提供的解决方案是不正确的不是对“system_db_audits”数据库删除触发器,但在另一个数据库中删除触发器从 “system_db_audits”。这意味着您需要在'system_db_audits'中创建一个动态sql,以包装@Mark Sinkinson提供的“ dynamic sql”,以删除那些目标触发器,并假设'system_db_audits'和目标db都在同一sql服务器实例上。否则,如果两个数据库不在同一实例上,则处理删除操作(例如通过链接服务器等)将更加“丑陋”。在这种情况下,无论目标db在同一sql实例上或不在同一sql实例上,PS都是一种不错的解决方案。
DROP TRIGGER
报表需要终止;
关系吗?