Tüm tetikleyicileri tek bir veritabanına nasıl bırakabilirim?


Yanıtlar:


29

sys.triggersYürütebileceğiniz bir sorgu oluşturmak için Dynamic SQL ve DMV'yi kullanabilirsiniz.

is_ms_shippedSQL Server ile gönderilen tetikleyicileri hariç tutar.
parent_class_descveritabanı düzeyi yerine nesne düzeyi tetikleyicileri için filtreler.

Çıktıdan memnun PRINTolduğunuzda bir EXECkez 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;

5

Sys.TriggersTetikleyici her nesne için bir satır içeren Meta Veri Tablosunu kullanın

  1. Burada gösterilen araç çubuğu düğmesini tıklayarak çıktı modunu metne değiştirin:

resim açıklamasını buraya girin

  1. 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; 
  2. Çı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.


Etmeyin DROP TRIGGERifadeleri sonlandıncılannı ihtiyaç ;olsa?
ypercubeᵀᴹ

MSDN diyor ki: Transact-SQL deyimi sonlandırıcısı.Yer noktalı virgül, SQL Server'ın bu sürümündeki çoğu ifade için gerekli olmasa da, gelecekteki bir sürümde gerekli olacaktır.
AA.SC

2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.