Bu yazımızda Microsoft SQL Server'da kullanılan triggerlardan bahsedeceğiz.
Trigger Ne Demektir?
Trigger Oluşturma
Trigger Örneği 1
Enable/Disable Trigger (Triggerları Aktif veya Pasif Duruma Getirme)
Trigger Örneği 2
DDL Triggerlar (Data Definiton Language)
Tablo üzerinde yapılan insert, update ve delete işlemleri öncesinde veya sonrasında ek işlemler yapmamıza olanak sağlayan (Aynı veya başka bir tabloya kayıt eklemek, kayıt silmek gibi) veya yapılan işlemi (insert, update, delete) kontrol etmemize duruma göre işlemi iptal etmemize yarayan özel stored prosedürleri trigger olarak tanımlayabiliriz.
Bu tür tablolar üzerinde çalışan triggerlara DML (Data Manipulation Language) triggerlar adı verilir. SQL Server 2005 ile DDL (Data Definiton Language) trigger adı verilen 2. bir trigger biçimi karşımıza geldi. DDL triggerlar Drop, Alter, Create gibi işlemler öncesinde veya sonrasında otomatik olarak çalıştırılarak yapılan işlemleri kontrol altına almamızı sağlıyor. DDL triggerlar yardımı ile örneğin veritabanından bir tablonun silinmesini engelleyebiliriz.
Triggerlar çalışma şekli açısından transaction ile benzerlik gösterir.
Herhangi bir tablo üzerine trigger tanımladığımız zaman tabloya gönderilen komutlar (insert, update, delete) işletilmeden önce bir transaction başlar. Daha sonra tabloya gönderilen komut işletilir. Üçüncü olarak trigger içerisine yazdığımız komutlar çalıştırılır. Son olarak yapılan işlem geçerli ise transaction commit olur, işlem geçersiz bulunursa RollBack Transaction ile yapılan işlemler iptal edilir.
Trigger Oluşturma:
Yeni bir trigger oluşturmak için aşağıdaki yapıyı kullanabiliriz.
CREATE
TRIGGER /*TriggerAdı*/ ON /*TabloAdı*/
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
/*Yazmak istediğimiz sql komutları*/
END
Birinci satırda oluşturulacak triggerın hangi tablo için geçerli olacağı belirtiliyor, ikinci satırda ise triggerın hangi işlemler için çalıştırılacağı tanımlanıyor. Burada kullanılan AFTER sözcüğü triggerın tabloya kayıt eklendikten (silindikten veya güncellendikten) sonra çalıştırılacağını belirtiyor. After yerine Instead Of cümleside kullanılır ise trigger kayıt eklenmeden (silinmeden veya güncellenmeden) önce çalştırılır. Instead Of olarak tanımlanmış bir triggerda tabloya bir kayıt otomatik olarak eklenmez, ekleme işlemini trigger içerisinde bizim yapmamız gerekir. Yine ikinci satırda bulunan INSERT, UPDATE ve DELETE sözcükleri ise tablodaki hangi işlemlerde bu triggerın çalıştırılacağını belirler. Sadece DELETE yazarsak trigger tablodan kayıt silinmesi durumunda tetiklenecektir.
Bir tablo üzerinde trigger oluşturulmuş ise o tablo ile aynı yapıda 2 tane tablo SQL server tarafından tanımlanır. Bunlara INSERTED ve DELETED tablolar denir.
Trigger konusunun daha iyi anlaşılabilmesi için örnek olarak ürün tablomuzdan bir kayıt silindiğinde debug tablosuna silinen ürünü kaydeden bir trigger yazalım.
CREATE
TRIGGER tr_UrunSil ON Urunler
AFTER DELETE
AS
BEGIN
INSERT INTO Debug SELECT 'Ürün Silindi : ' + CONVERT(Varchar,UrunID) + ', ' + UrunAdi FROM DELETED
END
Tanımlı olan triggerları aşağıdaki sql cümleleri ile enable veya disable edebiliriz.
DISABLE TRIGGER tr_UrunSil ON Urunler
ENABLE TRIGGER tr_UrunSil ON Urunler
Başka bir örnek olarak silinen ürün sipariş tablosunda mevcut ise silme işlemini iptal edelim.
CREATE
TRIGGER tr_UrunSil ON Urunler
AFTER DELETE
AS
BEGIN
DECLARE @Uid INT
SET @Uid=SELECT UrunID FROM DELETED
IF EXISTS(SELECT * FROM Siparisler WHERE UrunID=@Uid)
BEGIN
Print 'Ürün siparişlerde mevcut, silinenmez'
ROLLBACK TRANSACTION
RETURN
END
END
Son olarak SQL Server 2005 ile birlikte gelen DDL triggerlara bir örnek verelim. Veritabanımızı tabloların silinmesine karşı koruyalım.
CREATE
TRIGGER tr_TabloSilinmesin ON DATABASE
FOR DROP_TABLE
AS
Print 'Veritabanından tablo silinenmez'
ROLLBACK
Bu yazıda bildiğim ve dilimin döndüğü kadarı ile SQL Server Trigger'larını anlatmaya çalıştım, umarım faydalı olmuştur.
Mustafa Altuntaşlar.