msHOWTO

30 Nisan 2012 Pazartesi

T-Sql Trigger 1 DML Trigger

Merhaba arkadaşlar.Bu makalemizde ki konumuz T-Sql üzerinden trigger oluşturmak.Öncelikle nedir trigger?Ne amaçla kullanılır? Bu soruların cevaplarını arayalım.Trigger'ı C# da ki event lara benzetebilirsiniz arkadaşlar.C# da nasıl ki bir button un click olayı buttona tıklandığı anda içindeki kodlar çalışıyorsa bizim oluşturduğumuz trigger database üzerinden hangi durumu kontrol ediyorsa o durum oluştuğunda kendi içerisindeki kodlar çalışmaktadır.Peki nerelerde kullanılır?En basit olarak bir tabloya çekilen sorguyu kontrol etmeden tutun da bir database oluşturulurken sizin istediğiniz kodların çalışmasına kadar bir çok amaçlar için kullanılır.Hadi gelin syntax ini inceleyelim.


go
create trigger TriggerAdi
on TriggerinEtkilencegiDatabaseNesnesininAdi
after insert
as
--Trigger tetiklendiği zaman çalışacak sql sorguları
 select * from shipers


2 farklı Trigger vardır.

1-) DML Trigger:Dml yani select, insert, update ve delete sorguları sonucunda tetiklenen trigger'lardır.

2-) DDL Trigger:Ddl yani drop,alter ve create sorguları sonucunda tetiklenen trigger'lardır.

     A-)After : Dml veya ddl sorguları çalıştıktan sonra tetiklenir.Dml veya ddl sorguları işlenir ve daha sonrasında trigger içerisine yazılan sorgular işlenir.

     B-)Instead of : Dml veya ddl sorguları çalıştıktan sonra tetiklenir.Dml veya ddl sorguları yerine trigger içerisine yazılan sorgular işlenir.

Basit örneklerden triggerlarımızı yazmaya başlayalım arkadaşlar.


create trigger tetikci
on shippers
after insert
as
 select * from shipers

Yukarıdaki tetikçi ismindeki triggerımız shippers tablosu üzerinde insert işlemi gerçekleştikten hemen sonra kendi içerisinde yazılan sorguları çalıştırmaktadır.Yani kısaca shippers tablosuna veri her eklendiğinde o tabodaki tüm kayıtları gösterir.

create trigger guncellemeTetikcisi on categories
 after update
 as
      print 'Güncelleme tamamlandı.'

Yukarıdaki trigger da categories tablosu üzerinde update işlemi her olduğunda geriye mesaj döndürür.

Basit olarak iki tane trigger oluşturduktan sonra bilinmesi gereken önemli bir noktayı anlatmam gerekmektedir.T-Sql de insterted ve deleted isminde özel tablolar bulunmaktadır.Siz bir insert işlemi yaptığınızda öncelikle verileriniz inserted tablosuna eklenir.Eğer işleminiz başarılı bir şekilde gerçekleşirse verileriniz kaydetmek istediğiniz tabloya kaydolur.Aynı şekilde deleted tablosunda da delete sorgusu çekildikten sonra veriler önce buraya atılır daha sonra silinir.Fakat dikkat ederseniz updated gibi bir özel tablo bulunmamaktadır.Çünkü update işleminde önce veri silnir daha sonra ekleme işlemi yapılır.Yani update işleminde hem deleted hem de inserted tabloları kullanılır.

Bu bilgiden sonra basit olarak inserted tablosunu kullanarak bir örnek yapalım...

go
create trigger Haberci on categories
after insert
as   
      select @sonId=CategoryId from inserted
      select * from categories where categorId=@sonId

Yukarıdaki örnekte categories tablosuna eklenen son kaydın tüm bilgilerini gösteren bir trigger yazdık.

Bir örnekte de deleted tablosunu kullanarak bir trigger oluşturalım arkadaşlar...

create trigger yedekci on shippers
after delete
as
      declare @firmaAdi nvarchar(50)
      declare @telefon nvarchar(24)
      select @firmaAdi = CompanyName , @telefon=Phone from deleted
      insert YedekDataBase.dbo.SilinenShippers values (@firmaAdi,@telefon)

Yukarıdaki örneğimizde shippers tablosunda bir kayıt silindiğinde YedekDataBase isimli database in  SilinenShippers isimli tablosuna silinen kaydı yedek olarak kaydeden bir trigger oluşturduk.Bu örneğimizde de görüldüğü gibi trigger ile silinen kayıtları otomatik olarak loglama yapabiliriz.

Şuana kadar tüm örneklerimizde bir işlem gerçekleştikten sonra Yani After ile kullanılan trigger lar oluşturduk.Fakat gerçekte bir veri tabanından veriler silinmez düşüncesinde olan yazılımcılardan olduğum için bir silme işlemi yapıldığında ne yapacağım ? Benim o silme işlemini engelleyip o kaydı pasif hale getirmem gerekmektedir(Pasif hale getirmek için önceden boolean tipinde bir kolon oluşturduğumu ve bu kolon uzerinden kontrol ettiğimi varsayalım) Şuana kadar trigger oluşturmak için kullandığımız yöntemlerle bu sorunu çözemem arkadaşlar.İşte burada devreye INSTEAD OF girmektedir.

İlk olarak senaryomuz diyelim ki istediğimiz bir tabloda istediğimiz bir kaydın silinmesini engellemek istiyoruz.Bu kayıt bizim için hayati önem arz ediyor diye düşünelim arkadaşlar.Bu işlemi aşağıdaki trigger ile kolaylıkla oluşturabiliriz.

create trigger silmeEngeli on categories
instead of delete
as
      declare @silinenId int
      select @silinenId=categoryId from deleted
      if @silinenId=8
      begin
            print 'Kayýt silinemez'
            rollback tran
      end
      else
      begin
            delete from Categories where CategoryID=@silinenId
      end

İkinci bir senaryoda silinmek istenen veriyi pasif hale getirmek istediğimizi düşünelim.Bu sorunu da aşağıdaki triggerla kolaylıkla çözebiliriz.

create trigger UrunSilmeEngelleyici
on Products
instead of delete
as
      declare @silinenId int
      select @silinenId=ProductId from deleted
      update Products set Discontinued=0 where ProductID=@silinenId




Peki oluşturduğumu tüm bu triggerlar nerede saklanıyor? Oluşturulan ddl trigger lar hangi tablo üzerinde oluşturulduysa yani hangi tabloda ddl işlemi yapıldığında tetikleniyorsa o tablonun altındaki trigger sekmesinde yer almaktadır.

Son olarak bir trigger ı istediğimiz anda enable edip istediğimiz anda disable etmek isteyebiliriz.Bunun için 2 yöntem vardır.İlk olarak ilgili trigger a sağ tıklayıp enable/disable seçeneğine tıklanarak yapılır.T-Sql ile de ,

disable trigger tetikci on shippers --triggerı disable eder
 go
 enable trigger tetikci on shippers --triggerı enable eder

Evet arkadaşlar bu makalemde triggerlara giriş yaptık.DML Triggerları anlattım.DDL Triggerları devamı olarak anlatacağım.Oldukça uzun oldu makale.Okurken sıkılıp yeter artık deme ihtimalinizi düşünerek diğer part ında anlatacağım.Görüşmek dileğiyle...



2 yorum:

  1. DDL ile DML karıştırmışsın
    DML (insert,update,delete)
    DDL ise (Create, alter, drop vb..)

    tşkler.

    YanıtlaSil
    Yanıtlar
    1. :) ufak bir karışıklık olmuş . Düzelttim teşekkürler ... :)

      Sil