단일 데이터베이스에서 모든 트리거를 삭제하려면 어떻게해야합니까?


17

104 개의 트리거가있는 데이터베이스가 있는데 'system_db_audits'라는 단일 데이터베이스에서 단일 명령으로 모든 트리거를 삭제하는 방법이 있습니까?

답변:


29

Dynamic SQL 및 sys.triggersDMV를 사용하여 실행할 수있는 쿼리를 작성할 수 있습니다.

is_ms_shippedSQL 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 작업을 실행하려는 경우 [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에서 삭제 트리거에 있지만, 다른 DB에 트리거를 삭제 에서 'system_db_audits'. 이는 'system_db_audits'와 대상 db가 모두 동일한 SQL Server 인스턴스에 있다고 가정하고 @Mark Sinkinson이 제공 한 "동적 SQL"을 래핑하기 위해 'system_db_audits'에 동적 SQL을 작성해야 함을 의미합니다. 그렇지 않으면 두 개의 db가 같은 인스턴스에 있지 않은 경우 (예 : 연결된 서버 등을 통해) 삭제를 처리하는 것이 훨씬 "못생긴"것입니다. 이러한 시나리오에서 PS는 대상 DB가 동일한 SQL 인스턴스에 있는지 여부에 관계없이 훌륭한 솔루션입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.