SQL Server’da bilmemiz gereken başka birşey ise trigger’lardır. Bunları C# da gördüğümüz event lara benzetebiliriz. Şu şey meydana gelince bunu yap şeklinde.
Örneğin bir kategori silindiğinde ona bağlı olan tüm ürünlerin kategorisini değiştirmek yada o kategoriyi silmek istiyorsunuz. Bunu SQL Server’da Trigger yapısı ile çok kolay bir şekilde gerçekleştirebiliriz. Bahsettiğim gibi, daha önce gördüğümüz olaylardan hiçbir farkı yok. Biz “Butona tıklanınca şunu yap”, “Mouse formun üzerine geldiğinde şunu yap” diye belirttiğimiz şeylerin trigger yapısı ile (görev olarak) farkı yoktur.
SQL Server da Trigger yapısı nasıl çalışır onu görelim şimdi ;
Trigger lar her tablonun altında Trigger klasörünün içerisinde bulunur. Biz triggerlerimizi bu klasörlerin altında yazacağız. Her tablonun kendine has trigger i olabilir, örneğin Kategoriler tablosu için yazılmış bir triggerın Urunler tablosu için hiçbir geçerliliği yoktur.
Triggerlar hakkında
Trigger yazarken önce şunu belirlemeliyiz; trigger ne zaman çalışacak ? Yeni veri eklenirken mi, düzenlenirken mi silinirken mi, veri çağrılırken mi ?
2 çeşit trigger vardır, instead ve after trigger.
Instead Trigger
Belirtilen işlem gerçekleşmeden önce trigger tetiklenir.
After Trigger
Belirtilen işlem gerçekleştikten sonra trigger tetiklenir.
Trigger nasıl yazılır ?
Aşağıda verdiğim örnekte şu yapılıyor ; Bir kategori silinmek istenildiğinde, eğer o kategoriye bağlı Urunler tablosunda ürün varsa kategoriyi silme Aktif kolonunu(bizim kategorilerin aktif olup olmadığını kontrol için oluşturduğumuz bir kolon..) 0 yap (pasif yap). Eğer Urunler tablosunda bu kategoriye bağlı hiçbir ürün yoksa kategori silinebilir.
create trigger TriggerAdi on Kategoriler instead of delete as begin Declare @katID int,@adet int select @katID=KatID from deleted select @adet=COUNT(*) from Urunler where UrunKatID=@katID if(@adet=0) delete from Kategoriler where KatID=@katID else update Kategoriler set Aktif=0 where KatID=@katID end
Ne yaptığımızı açığa kavuşturalım şimdi.
1.Satır
Burada trigger oluşturup adını yazdık ve bağlı olacağı tabloyu belirttik, daha sonra trigger in ne zaman tetikleneceğini belirttik (instead of delete, yani veri silinmeden önce, eğer after of delete yapsaydık, veri silindikten sonra tetiklenecekti)
5.Satır
İki tane değişken tanımladık. Bu değişkenlerde silinmek istenen verinin değerlerini saklayacağız.
7.Satır
Burada katID değişkenine silinen satırdaki KatID kolonunu atıyoruz. Burada silinmek istenen kolona nasıl ulaşacağımıza gördük, from deleted ile
8.Satır
adet değişkenine silinmek istenen kategoriye bağlı kaç ürünün olduğunu atadık
10-13.Satır
Eğer 0 adet varsa kategorinin silinmesini istedik.
Else ile de kategoriyi pasif hale getirdik.
NOT : Eğer biz burada silme/değiştirme işlemi yapmasaydık, veriler silinmeyecekti aynen olduğu gibi kalacaktı.
Güzel ve açıklayıcı olmuş.Eline sağlık.
Elinize sağlık, çok basit ve anlaşılır bir açıklama olmuş, bu yapıyı ilk kez kullanacaklar için.