답변:
Dynamic 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 작업을 실행하려는 경우 [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;
ServerB 와 AdventureWorks 를 자신의 값 으로 바꾸 십시오.
삭제 트리거 만 특정 테이블 세트에 속하거나 일부 삭제 (비활성화) 대신 특정 트리거를 비활성화하는 등 다른 요구 사항에 맞게 쉽게 사용자 정의 할 수있는 매우 유연한 솔루션입니다.
요구 사항이기 때문에 엄밀히 말하면, @ 마크 Sinkinson가 제공하는 솔루션은 정확하지 하지 'system_db_audits'DB에서 삭제 트리거에 있지만, 다른 DB에 트리거를 삭제 에서 'system_db_audits'. 이는 'system_db_audits'와 대상 db가 모두 동일한 SQL Server 인스턴스에 있다고 가정하고 @Mark Sinkinson이 제공 한 "동적 SQL"을 래핑하기 위해 'system_db_audits'에 동적 SQL을 작성해야 함을 의미합니다. 그렇지 않으면 두 개의 db가 같은 인스턴스에 있지 않은 경우 (예 : 연결된 서버 등을 통해) 삭제를 처리하는 것이 훨씬 "못생긴"것입니다. 이러한 시나리오에서 PS는 대상 DB가 동일한 SQL 인스턴스에 있는지 여부에 관계없이 훌륭한 솔루션입니다.
DROP TRIGGER
명령문에는 종결자가 필요 하지;
않습니까?