23 Eylül 2008 Salı

Tetikleyicileri devre dışı bırakmak / devreye almak (DISABLE/ENABLE Trigger)

Bazen öyle durumlar oluyor ki, geçici olarak SQL Server da yazdığımız tetikleyici(trigger)ları devre dışı bırakmak, geçici olarak çalışmamasını sağlamak gerekebiliyor.

Eskiden, trigger'ın koduna girer, en başına return yazarak triggerın çalışır çalışmaz hiç bir iş yapmamasını sağlamış olurdum. Bu triggerın ismini de bir yere not eder, tekrar devreye almak istediğimde kodu değiştirirdim.. Eğer bu notu kaybedersem (ki jira dan önce başıma gelen birşeydi bu) tüm trigger scripleri içerisinde return aratır ve gereksiz bir sürü trigger koduna bakmak zorunda kalırdım..
Daha önceki versiyonlarında var mıydı bilmiyorum ama SQL Server 2005 ile keşfettiğim bir SQL kodu var. ENABLE/DISABLE TRIGGER [myTriggerName] ON [myTableNameName]

Önce örnek bir tablo ve o tabloya ait bir trigger yazalım :

CREATE TABLE TestTablo1(ID int identity(1,1),Name varchar(255))
GO
CREATE TRIGGER trTestTrigger1 ON TestTablo1 AFTER UPDATE,INSERT,DELETE
AS BEGIN
select 'triggerdan gelen inserted' as note, * from inserted
select
'triggerdan gelen deleted' as note, * from deleted
END

GO

Bu trigger, sadece test amaçlı yazıldığı için özel bir iş yapmıyor. Sadece trigger lar içerisinden ulaşılabilen ve yeni kayıtları (update ise verilerin yeni halini) gösteren inserted tablosundaki tüm satırları ve silinen (update işleme ise verilen eski halini) gösteren deleted tablosundaki tüm kayıtları getiriyor.

Aşağıdaki insert kodunu çalıştırdığımızda trigger da çalışacağı için 2 recordset dönecek. İlk inserted daki kayıt satırını getirecek, 2. sinde herhangi bir silme kaydı olmadığı için boş kayıt gelecek..

INSERT INTO TestTablo1(Name)
VALUES('Test1')

Trigger'ın çalıştığını ve 2 recordset döndürdüğünü gördük.. Şimdi de devre dışı bırakalım.. Aşağıdaki kodu yazmak ve çalıştırmak yeterli..

DISABLE TRIGGER trTestTrigger1 ON TestTablo1
GO


Aynı insert kodunu bir kere daha çalıştırırsak herhangi bir recordset dönmediğini, yani trigger ın çalışmadığını anlayabiliriz..

Tekrar devreye almak yine çok kolay...

ENABLE TRIGGER trTestTrigger1 ON TestTablo1
GO


Kodunu çalıştırmak yeterli..

Trigger ımızı tekrar devre dışı bırakalım. Sonra da disabled trigger larımızı nasıl görebileceğimize bakalım..

Aktif veritabanındaki tüm triggerların isimlerini, bağlı oldukları tablonun id sini ve birkaç özelliğini gösteren bir system view i tanımlı. Bu view de trigger disabled olup olmadığı bilgisi de var.
Disabled olan tüm triggerları aşağıda sql cümleciğini kullanarak çekebiliriz. Triggerın bağlı olduğu tablonun objectid si de geliyor, object_name sistem fonksiyonunu kullanarak bu tablonun da adını alabiliriz..


SELECT
object_name(parent_id) as parentTable_name,
*
FROM sys.triggers
WHERE is_disabled = 1


Artık hangi triggerı devre dışı bırakmıştım, devreye almayı unuttuğum trigger olabilir mi gibi soruların cevabı basit bir sql cümlesinde..

Hatta bir tablodaki tüm triggerları da enable/disable etmek mümkün.. Trigger ismi yerine "ALL" anahtar kelimesini yazmak yeterli..

DISABLE TRIGGER ALL ON TestTablo1
GO

ENABLE TRIGGER ALL ON TestTablo1
GO



Triggerları kolayce devreden çıkarabildiğimize göre, test için yarattığımız objelerimi artık drop edebiliriz.


DROP TRIGGER trTestTrigger1
GO


DROP TABLE TestTablo1
GO


Hiç yorum yok: