単一のデータベースにすべてのトリガーをドロップするにはどうすればよいですか?


17

104個のトリガーを持つデータベースがありますが、「system_db_audits」という単一のデータベースから単一のコマンドですべてのトリガーを削除する方法はありますか?

回答:


29

動的SQLとsys.triggersDMVを使用して、実行可能なクエリを作成できます。

is_ms_shippedSQL 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;

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ジョブを実行してトリガー削除作業を行う場合、[ServerA]に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;

ServerBAdventureWorksを独自の値に置き換えることを忘れないでください。

これは非常に柔軟なソリューションで、特定のテーブルセットに属する削除トリガーのみ、特定のトリガーを無効にする(削除する代わりに)など、他のさまざまな要件に合わせて簡単にカスタマイズできます。

要件があるため、厳密に言えば、@マークSinkinsonが提供するソリューションは、正しくないではない「system_db_audits」デシベルの削除トリガーに、しかし別のDBにトリガを削除することから「system_db_audits」。これは、 'system_db_audits'に動的SQLを作成して、@ Mark Sinkinsonが提供する "dynamic sql"をラップし、 'system_db_audits'とターゲットdbの両方が同じsqlサーバーインスタンスにあると仮定して、それらのターゲットトリガーを削除する必要があることを意味します。それ以外の場合、2つのdbが同じインスタンス上にない場合、削除を処理するのは(リンクサーバーなどを介して)さらに「見苦しい」ことになります。そのようなシナリオでは、ターゲットdbが同じsqlインスタンス上にあるかどうかに関係なく、PSはエレガントなソリューションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.