104個のトリガーを持つデータベースがあります。「system_db_audits」という単一のデータベースから単一のコマンドですべてのトリガーを削除する方法はありますか?
動的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ウィンドウにコピーし、コードが期待どおりのアクションを実行することを確認して、実行します。
中央サーバー[サーバーA]でSQLジョブを実行してトリガーの削除作業を行う場合は、[サーバーA]にSQLPSモジュールがインストールされたSQL Server 2012(またはそれ以上)のインスタンスがあると想定して、PowerShellバージョンを提供します。
[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を独自の値に置き換えてください。
これはかなり柔軟なソリューションであり、特定のテーブルセットに属する削除トリガーのみを削除したり、特定のトリガーを無効にする(削除ではなく)など、他のさまざまな要件に簡単にカスタマイズできます。
厳密に言うと、@ Mark Sinkinsonが提供するソリューションは正しくありません。要件はnot 'system_db_audits' dbのトリガーを削除するが、別のdbのトリガーを削除するfrom 'であるためです。 system_db_audits '。これは、 'system_db_audits'とターゲットdbの両方が同じsqlサーバーインスタンスにあると想定して、@ Mark Sinkinsonによって提供される「動的sql」をラップしてそれらのターゲットトリガーを削除するために、「system_db_audits」に動的SQLを作成する必要があることを意味します。それ以外の場合、2つのDBが同じインスタンス上にない場合、削除を処理する(リンクサーバー経由など)のは「醜い」ことになります。このようなシナリオでは、ターゲットデータベースが同じSQLインスタンス上にあるかどうかに関係なく、PSはエレガントなソリューションです。