Yazı Boyutu Yazıları Büyüt Yazıları Küçült
 MS SQL Server'da Trigger Kullanımı
 

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.

Yazının başına git 09.05.2008

Etiketler:  SQL



Yorumlar Yorum Yaz