SQL Server'da Trigger Kullanımı 6107061070 okunma
Trigger, kelime anlamı olarak tetikleyici demektir. SQL Server'da bir bileşen (companent) olarak vardır, tıpkı Stored Procedure gibi. SQL Server'da kullanılma amacı, bir işlem yapıldığında farklı bir işlem daha yapılmasını istiyorsak tetikleyici kullanmamız gerekir. Şöyle bir örnek verelim, bir tabloyu sildiğinizi düşünün ama o tablonun silinmemesini, uyarı mesajı verilmesini istiyorsunuz. Tabloyu "sildiğiniz anda" uyarı mesajı verebilir, buradaki tetikleyici olay tabloyu silmek oldu. Yani tetikleyici hangi tablonun üzerindeyse o tablo üzerinde çalışır.
Farklı bir örnek olarak şöyle diyebiliriz, bir tabloya ekleme yapıyorsunuz. Ama siz uğraşmamak için aynı zamanda başka bir tabloyu da eklemek yapacaksınız. Bu trigger ile mümkün. Trigger, hangi işlemler olduğunda ne yapacağını söyleyin yeter.
Trigger'lar DML (Delete, Insert ve Update işlemleri) işlemleri üzerinde çalışırlar. Select ile bir bağlantısı yoktur.
Şimdi satır satır trigger yapısını inceleyelim.
Trigger Oluşturmak
create trigger Ornek -- burada trigger oluşturuluyor ve ismi Ornek
on Personel -- hangi tablo üzerinde geçerli olacağını söylüyor.
For - After Kavramları
create trigger Ornek
on Personel
komutumuz gayet anlaşılır. Bundan sonra kullanacağımız ilk komut ya for ya da after.
For: Trigger'ın o an çalışması için kullanılır.
After: Tablo üzerinde her ne yapıyorsanız, işleminizi yaptıktan sonra trigger çalışmasını sağlar.
DML Işlem Seçimi
for veya after seçildikten sonra DML işlemleri seçilir. Yani tablo üzerinde ne yapılacaksa o işlem seçilir. Trigger ona göre çalışacaktır.
Inserted / Deleted Kavramları
Trigger'ın çalışmasına göre, hangi tablo üzerinde etkinse tablo üzerine eklenilen veya güncellenilen kayıtları "inserted" üzerinde, silinen kayıtları ise "deleted" üzerinde kaydediyor. Bunlar sanal tablolardır (virtual table).
Bu çok işimizi görecektir çünkü eklenilecek bir çok kaydı buradan çekeceğiz.
Bu kayıtlar after kullanılırsa kullanılır. For işlemlerinde kullanılmaz. Çünkü for işleminde o an bir şey ekleniliyor, after olsaydı sonradan ekleyeceği için önce eklenilen kayıtları hafızasında tutar, ona göre işlemler yaptırabilirdik.
Bu komutları nerede kullanacağımızı örneklerle açıklayacağım, şimdilik bilin yeterli.
Örnek Basit Bir Trigger
create trigger Sildirme
on Urunler
for Delete
as
Print ('Bu tabloyu silemezsiniz!)
rollback transaction -- yaptığı işlemi geri aldırıyor
Yukarıda gördüğünüz trigger oldukça basittir. Urunler tablosunu silmeye kalktığınızda, (bakın o anda olduğu için for kullanıldı) size bir uyarı verecek ve işlemleri geri alacak.
Örnek Başlangıç Trigger
Şöyle bir trigger yaparsak bu işi anlamış oluruz.
Ürünler tablosu var ve içerisinde Ekleyen sütunu var. Ekleyen kişi hep aynı, bunu yazmak istemiyorum. Bu yüzden ben yalnızca ürün bilgilerini gireyim, ekleyen kısmını kendisi doldursun.
Evet, bu çok kolay bir şey.
Tablomuz aşağıdaki gibi.
Burada inserted mantığını kullanacağız. Umarım declare'in ne işe yaradığını biliyorsunuzdur, kendisi burada çok işe yarayacak (sanal tablo).
Mantığımız şu, eklenilen ürünün id'sini bilirsem, yani bunu bir yerden alabilirsem, o satırı güncelleyip ekleyen koyabilirim. Burada inserted (yani eklenilen kayıtların sanal tablosu) üzerinden veri çekeceğiz.
Başlıyoruz.
create trigger EkleyenDoldur
on Urunler
after Insert -- insert işlemi olduktan sonra çalışacak
as
begin -- komutları begin-end bloğuna yazarsanız daha iyi olacaktır
declare @id int -- sanal bir değişken oluşturuyorum, bunu koşulda kullanacağım
Select @id = id from inserted -- inserted'ta zaten kayıtlar var, yani id sütunundaki değer de var. O halde yapmam gereken sanal değişkenimi inserted'taki değerle eşitlemek
Update Urunler Set Ekleyen = 'Recep Şerit' Where id = @id -- koşulumu da yazdım, sorgum yalnızca o satırda geçerli olacaktır.
end
Uygulaması aşağıdaki gibi.
Kodları yazdıktan sonra ekleme yapalım. Aşağıda görüldüğü gibi bir işlem yaptığım halde iki değişiklik olmuş, trigger'dan bahsetti.
Son olarak Urunler tablomu listelettirdiğimde trigger'ın çalıştığını görebiliyoruz.
Trigger'a Ulaşma
Yazdığımız trigger'lara SQL Server üzerinden hangi tablodaysak içerisine girin. Burada Triggers olacaktır, bütün trigger'lar burada tutulur. Isterseniz düzenleyebilir isterseniz devre dışı bırakabilirsiniz.
Devre dışı bırakınca tabloda etkin olmuyor. Bunun için trigger'a sağ tuş yapıp disable deyin.
Trigger'ın mantığı bu şekildedir. Çeşitli örnekleri BilişimLife Forum alanında Veritabanı kategorisi altında çeşitli başlıklar halinde görebilirsiniz.
Kolay gelsin.
Recep ŞERIT
BİR YORUM YAZIN