Sql Trigger Çeşitleri Ve Örnekleri

     Merhaba arkadaşlar bu yazımızda sql server da kullanılarn trigger (tetikleyici) türlerini inceleyip örneklerle açıklamaya çalışacağız..
     Triggerlar yapı açısından 2 ye ayrılır bunlar instead of ve after triggerlardır.
Açıklamak gerekirse,
     instead of trigger yaptığımız işlem sonucunda yapılan işlemi bloke eder ve onun yerine yeni tanımladığımız işlemi yapar.Örneğin bir kullanıcı tablomuz olsun ve sistemimize kaydolan her kullanııcının bilgisini sonsuza kadar tutmak isteyelim. Kullanıcı eğer oturumunu silmek isterse arkaplanda delete komutu çalıştırması gerekecektir ancak biz bilgilerin silinmesini istemiyoruz bunun yerine kullanıcı tablosunda onay adında bir alan tutup bu alanı bool tanımlarsak ve delete işlemi çalıştığında bunu instead of trigger ile engelleyip onayı 1 yerine sıfır olarak güncellersek kullanıcı silinmez ancak erişim hakkı kapatılmış olur.Biraz karışık bir örnek farkındayım ancak en basit bu şekilde anlatabilirim sanırım.
     After trigger ise istenen işlemi yapar ve sonrasında otomatik olarak başka bir işlemi tetikler.Buna da şöyle bir örnek verelim;      Ürünler ve stok adında iki tablomuz olsun ve ürünler tablosunda olmayan bir ürünü stok tablosuna ekleyelim bu durumda satmadığımız bir ürünün stoğunu tutmuş gibi görülebilir.Bunun için eğer stok tablouna eklenen ürün ürünler tablosunda yoksa ekleme işleminin hemen ardından bu ürünü ürünler tablosuna da eklemesi için bir after trigger yazılabilir.
     Bu anlatımı hemen örnekleyelim;

create table ogrenci
(
      ogrID int primary key identity(1,1),
      ogrAd nvarchar(20),
      ogrSoyad nvarchar(20),
      ogrTel nvarchar(10),
      ogrOnay bit default(1),
      ogrKayitTar datetime
);

     Böyle bir ogrenci tablomuz olsun.Birinci anlatımdaki işlemi yapalım. Öğrenci silinmek istendiğinde bunun yerine oturumunu engelleyelim ve sanki silinmiş gibi olsun ancak sadece erişimini kapatmış olalım.


create trigger trg_ogr_sil
on ogrenci
instead of delete
as begin
    update ogrenci set ogrOnay=0 where ogrID=(select ogrID from deleted)
end

     Burada veritabanımızın geçici oluşturduğu deleted tablosundan silinen verinin id sini alıp bu id ye sayip kaydın ogrOnay alanını 'true' dan 'false' değerine değiştirdik. Trigger tetiklendiğinde instead of tanımı delete işlemini engelledi ve 'begin-end'  bloğunda tanımladığımız işlemi yaptı.
     Bir diğer örnek de after trigger için yapalım;
     Yine aynı ogr tablosunu ele alalım ve bir tablo daha oluşturalım.Mesela ogrenci tablosunda silme işlemi yapılsın ancak silinen kayıtlar silinenOgr adında ikinci bir tabloda tutulsun.


create table silinenOgr (
      ogrID int ,
      ogrAd nvarchar(20),
      ogrSoyad nvarchar(20),
      ogrTel nvarchar(10),
      ogrOnay bit default(1),
      ogrKayitTar datetime
);


     SilinenOgr tablomuzu oluşturduk.Şimdi triggerımızı yazalım.


Create TRIGGER trg_ogr_silinen
on ogrenci
AFTER DELETE
AS
BEGIN
declare @ogrID int,@ogrAd nvarchar(20), @ogrSoyad nvarchar(20), @ogrTel nvarchar(10), @ogrOnay bit, @ogrKayitTar datetime
Select @ogrID = deleted.ogrID from deleted
Select @ogrAd = deleted.ogrAd from deleted
Select @ogrSoyad = deleted.ogrSoyad from deleted
Select @ogrTel = deleted.ogrTel from deleted
Select @ogrOnay = deleted.ogrOnay from deleted
Select @ogrKayitTar = deleted.ogrKayitTar from deleted
INSERT into silinenOgr
Values (@ogrID ,@ogrAd ,@ogrSoyad ,@ogrTel ,
@ogrOnay ,@ogrKayitTar )

END


     Böylece ogrenci tablosundan bir kayıt sildiğimizde bir önceki örneğin aksine bu örnekte gerçekten kaydı siliyor ancak aynı kaydı silinenOgr adlı ikinci bir tabloda tutmaya devam ediyor.
     Bu işlemleri yaparken delete komutunu kullandık ancak insert update gibi farklı komutlarda da tetiklenen triggerlar yazabilirsiniz.
     

Umarım yardımcı olur iyi çalışmalar....


-