Ho un database con 104 trigger, c'è un modo per eliminare tutti i trigger con un singolo comando da un singolo database chiamato 'system_db_audits?
Ho un database con 104 trigger, c'è un modo per eliminare tutti i trigger con un singolo comando da un singolo database chiamato 'system_db_audits?
Risposte:
È possibile utilizzare Dynamic SQL e sys.triggers
DMV per creare query che è possibile eseguire.
is_ms_shipped
esclude tutti i trigger forniti con SQL Server.
parent_class_desc
filtri per trigger a livello di oggetto anziché a livello di database.
Cambia PRINT
in una EXEC
volta 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;
Utilizzare la Sys.Triggers
tabella dei metadati che contiene una riga per ogni oggetto che è un trigger
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;
Copia l'output in una nuova finestra di SQL Server Management Studio, verifica che il codice esegua le azioni previste ed esegui.
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.
DROP TRIGGER
dichiarazioni non hanno bisogno di terminatori;
però?