104 Tetikleyiciler ile bir veritabanı var, 'system_db_audits adlı tek bir veritabanından tek bir komutla tüm tetikleyicileri silmek için bir yolu var mı?
104 Tetikleyiciler ile bir veritabanı var, 'system_db_audits adlı tek bir veritabanından tek bir komutla tüm tetikleyicileri silmek için bir yolu var mı?
Yanıtlar:
sys.triggers
Yürütebileceğiniz bir sorgu oluşturmak için Dynamic SQL ve DMV'yi kullanabilirsiniz.
is_ms_shipped
SQL Server ile gönderilen tetikleyicileri hariç tutar.
parent_class_desc
veritabanı düzeyi yerine nesne düzeyi tetikleyicileri için filtreler.
Çıktıdan memnun PRINT
olduğunuzda bir EXEC
kez değiştirin .
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
Tetikleyici her nesne için bir satır içeren Meta Veri Tablosunu kullanın
Bu komut dosyasını yürütün:
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;
Çıktıyı yeni bir SQL Server Management Studio penceresine kopyalayın, kodun beklediğiniz eylemleri gerçekleştirdiğini doğrulayın ve Yürütün.
Tetikleyici silme işlemini yapmak için merkezi bir sunucuda [ServerA] bir sql işi çalıştırmak istiyorsanız, [ServerA] üzerinde SQLPS modülü yüklü bir SQL Server 2012 (veya üstü) örneğiniz olduğunu varsayarak bir PowerShell sürümü sağlayacağım.
Diyelim ki [ServerB] SQL Server örneğindeki (SQL Server 2005+) [AdventureWorks] veritabanındaki tüm tetikleyicileri silmek istiyorsunuz.
Aşağıdaki PS'yi [ServerA] üzerinde çalıştırabilirsiniz:
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;
Lütfen ServerB ve AdventureWorks'ü kendi değerlerinizle değiştirmeyi unutmayın .
Bu, yalnızca belirli bir tablo kümesine ait tetikleyicileri silmek veya bazı belirli tetikleyicileri devre dışı bırakmak (silmek yerine) gibi diğer farklı gereksinimlere uyum sağlamak için kolayca özelleştirebileceğiniz oldukça esnek bir çözümdür.
Açıkça söylemek gerekirse, @Mark Sinkinson tarafından sağlanan çözümler doğru değil çünkü gereksinim 'system_db_audits' db'deki tetikleyicileri silmek değil , 'system_db_audits' den başka bir db'deki tetikleyicileri silmek . Bu, hem 'system_db_audits' öğesinin hem de hedef db'nin aynı sql sunucusu örneğinde olduğu varsayılarak, bu hedef tetikleyicileri silmek için @Mark Sinkinson tarafından sağlanan "dinamik sql" i sarmak için 'system_db_audits' içinde dinamik bir sql oluşturmanız gerektiği anlamına gelir. Aksi takdirde, iki dbs aynı örnekte değilse, silme işlemiyle ilgilenmek bile çok fazla "çirkin" olacaktır (örneğin, bağlantılı sunucu üzerinden). Bu senaryoda, PS, hedef db'nin aynı sql örneğinde olduğu veya olmadığı durumda zarif bir çözümdür.
DROP TRIGGER
ifadeleri sonlandıncılannı ihtiyaç;
olsa?