Come posso eliminare tutti i trigger in un singolo database?


Risposte:


29

È possibile utilizzare Dynamic SQL e sys.triggersDMV per creare query che è possibile eseguire.

is_ms_shippedesclude tutti i trigger forniti con SQL Server.
parent_class_descfiltri per trigger a livello di oggetto anziché a livello di database.

Cambia PRINTin una EXECvolta che sei soddisfatto dell'output.

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

Utilizzare la Sys.Triggerstabella dei metadati che contiene una riga per ogni oggetto che è un trigger

  1. Cambia la modalità di output in testo facendo clic sul pulsante della barra degli strumenti mostrato qui:

inserisci qui la descrizione dell'immagine

  1. Esegui questo script:

    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. Copia l'output in una nuova finestra di SQL Server Management Studio, verifica che il codice esegua le azioni previste ed esegui.


Le DROP TRIGGERdichiarazioni non hanno bisogno di terminatori ;però?
ypercubeᵀᴹ

MSDN dice: Terminator delle istruzioni Transact-SQL. Sebbene il punto e virgola non sia richiesto per la maggior parte delle istruzioni in questa versione di SQL Server, sarà richiesto in una versione futura.
AA.SC

2

Nel caso in cui si desideri eseguire un lavoro sql su un server centrale [ServerA] per eseguire il lavoro di eliminazione dei trigger, fornirò una versione di PowerShell supponendo che tu abbia un'istanza di SQL Server 2012 (o successiva) con il modulo SQLPS installato su [ServerA]

Supponiamo di voler eliminare tutti i trigger nel database [AdventureWorks] sull'istanza di [ServerB] SQL Server (SQL Server 2005+).

È possibile eseguire il seguente PS su [ServerA]:

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;

Ricordarsi di sostituire ServerB e AdventureWorks con i propri valori.

Questa è una soluzione abbastanza flessibile che puoi facilmente personalizzare per adattarsi ad altri requisiti diversi, come solo i trigger di eliminazione appartengono a un set specifico di tabelle o disabilitano (anziché eliminare) alcuni trigger specifici ecc.

A rigor di termini, le soluzioni fornite da @Mark Sinkinson non sono corrette perché il requisito non è quello di eliminare i trigger su "system_db_audits" db, ma di eliminare i trigger in un altro db da "system_db_audits". Ciò significa che è necessario creare un sql dinamico in 'system_db_audits' per racchiudere il "sql dinamico" fornito da @Mark Sinkinson per eliminare quei trigger di destinazione ipotizzando che sia "system_db_audits" che il db di destinazione si trovino sulla stessa istanza del server sql. Altrimenti se i due dbs non si trovano nella stessa istanza, sarà persino molto "brutto" gestire la cancellazione (come tramite un server collegato, ecc.). In tale scenario, PS è una soluzione elegante, indipendentemente dal punto in cui il db di destinazione si trova o meno nella stessa istanza sql.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.