SQL Server Veritabanı

SQL Trigger Nedir? Trigger Kullanımı

Trigger Türkçe anlamı olarak Tetikleyici demektir. Trigger, Stored Procedureler gibi Sql Server içinde bileşen olarak bulunmaktadır. Triggerların kullanım amacı, tablo üzerinde bir işlem gerçekleştiğinde (insert, update, delete) başka bir işlem daha yapılmak istendiği zaman kullanılır.

Şu şekilde basit olarak örneklendirelim.

Öğrenci tablonuz olduğunu düşünelim. Öğrenci tablonuzda bir öğrenciyi sildiğinizde bu öğrenci bilgilerini daha farklı bir tabloda(silinen öğrencilerin tutulduğu) tutmak istiyorsunuz. Öğrenci tablosundaki bir kayıt silindiğinde(delete) başka bir tabloya bu kaydı trigger ile aktarmak mümkün.

Yada daha kapsamlı başka bir örnek Bir kütüphane tablosu üzeride, bir öğrenci sadece bir kitap alabilir durumda olsun. Öğrenci kitabı getirmediği sürece ikinci bir kitap almasına izin verilmesin. Bu işlemi görsel program aracılığı ile yapabileceğiniz gibi trigger ile öğrenci kitap teslim etmediyse ikinci bir kitabı almasına izin verilmesini engelleyebilirsiniz. Yazının sonunda çok daha fazla senaryo ile örneklendirme yapacağım.

Trigger’lar DML (Delete, Insert ve Update işlemleri) işlemleri üzerinde çalışırlar. Select ile bir bağlantısı yoktur. DML işlemi gerçekleştiğinde deleted, inserted yada her iki sanal tablolaya kayıtlar eklenir. Trigger tetiklenerek, trigger içindeki sorgular gerçekleştirilir. Sonra da kayıtlar gerçek tabloya(rollback ile sorguyu iptal edebiliriz) eklenerek sorgu işlemi bitirilir.

Adım adım trigger oluşturma kavramına bir bakalım.

Trigger Oluşturma

trigger_adi: oluşturacağımız trigger adını veriyoruz.

tablo_adi: hangi tabloda çalışacağını belirtiyoruz

After yada Instead of: after yapılırsa işlem yapıldıktan sonra, instead of yapıldığında yapmak istediğimiz işlemin yerine çalıştırılacağını belirtiyoruz

Insert,Update, Delete: Tabloda hangi sql işlemi sırasında çalıştırılacağını belirtiyoruz.

Begin…..End: Trigger çalıştırıldıktan sonra yürütülecek olan sql cümlelerini bu aralıkta yazıyoruz.

 

Trigger Güncelleme

 

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).
Insert: Bir insert işlemi gerçekleştirdiğimizde, eklediğimiz kayıt ilk olarak inserted tablosuna eklenir.

Delete:Bir delete işlemi gerçekleştirdiğimizde sildiğimiz kayıt ilk olarak deleted tablosuna eklenir.

Update:Update işleminde ise eski kayıt önce deleted tablosuna, güncellenen(yeni) kayıt ise inserted tablosuna eklenir.

 

Trigger enable/disable yapma

Enable (Aktifleştirme):

Disable (Pasifleştirme):

 

Tüm Triggerları Pasifleştirme / Aktifleştirme

 

Trigger Kaldırma

Kaldırma :

 

After /Instead Of Kavramı

After Triggerler: Insert,Update yada Delete işlemi gerçekleştirildiğinde tetiklenir. Sadece tablolar için tanımlanabilir.

Instead Of Triggerler: Belirlenen işlem gerçekleşirken devreye girip, SQL sorgusu yerine çalıştırılır. After tetikleyicileri sadece tablolar için tanımlanabilirken Instead Of tetikleyicileri hem tablolar için hem de view tabloları ile de kullanılabilir.

 

Rollback Transaction ve Raise Error

Rollback Transaction komutu trigger ne için tanımlanmışsa o işlemi iptal etmek için kullanılır.

Raise Error komutu kullanıcıya işlemin neden iptal edildiğini bildirmek için kullanılır. Kullanıcıyı bilgilendirme amacı ile kullanılır.

 

Sql Server Management Trigger Nerede Bulunur

Sql Server Management üzerinde triggerlar aşağıdaki resimde görüntülendiği gibi ilgili tabloya tıklandığında tablonun altında görünecektir.

 

Aşağıdaki Komutlar Trigger İçine Kullanılmaz

Alter Database Create Database

Load Database Drop Database

Disk Init Disk Resize

Load Log Reconfigure

Restore Database Restore Log

 

Recursive Trigger Oluşturma

Trigger’ın kendini çağırması durumudur.

Triggerda aynı tabloda işlem yapılıyorsa o işlem sonucu aynı trigger bir daha çalışabilir.

Trigger başka tabloda işlem yapar. O işlem sonucu çalışan başka bir triggerda yeniden birinci tablo ile ilgili işlem yapar. Bu durum da da recursive olur.

32 tane en fazla çalışır.

Sürekli bir şart ile kontrol edilip sonlandırılmalıdır. Yoksa sonsuz döngüye girer.

 

 

Recursive trigger’ları aktif yapmak için yukarıdaki kodlar kullanılır.

Bir alanının güncellendiğini öğrenmek için update(alanadi) fonksiyonu kullanılır. Sonucu true yada false olarak döner.

Bir trigger başka bir tabloda işlem yaparken o tablodaki trigger’ı da çalıştırabilir.

İç içe 32 trigger çalıştırılabilir.

@@Nestlevel hangi seviyede olduğunu belirtir.

Sp_configure procedure’ü kullanılarak iç içe tetiklenme kapatılabilir.

İlk trigger çalışır diğerleri tetiklenmez.

 

Trigger Örnekleri

Trigger örneklerini basit olarak oluşturulmuş kütüphane veritabanı üzerinde uygulayacağım. Kütüphane veritabanını indirmek için tıklayın.

Aşağıdaki örneklerde triggerlar bir kez execute ile yürütüldükten sonra insert/update/delete işlemleri gerçekleştirildiğinde ilgili trigger tetiklenecektir.

Bazı örneklerde triggerlar bir birlerini etkileyeceği için ya triggerı kaldırmanız yada bir birini etkileyeceğini düşündüğünüz triggerları durdurmanız gerekir.

 

Örnek: Kullanıcı bir kayıt ekledikten sonra ogrenci tablosunu listeleyen trigger oluşturunuz.

 

Örnek: 10A sınıfına cinsiyeti kız olan öğrenciler kaydedilebilsin

 

Örnek: 10A’nın kız öğrencileri silinemesin

 

Örnek: Silinen öğrenciler başka bir tabloya kaydedilsin

 

Örnek: Öğrencilerin cinsiyet alanı güncellenmesin

 

Örnek: Kitap tablosu güncellenirken eski sayfa sayısı yeni sayfa sayısından fazla olmak zorunda

 

Örnek: Tür tablosundan hiçbir kayıt silinmesin

After yerine Instead of kullanılarak delete işlemi yapmak yerine hata vermesi sağlanabilir.

Örnek: Ogrenci tablosuna silindi isminde bir alan ekleyiniz. Ogrenci silinmesin silindi alanının değeri 1 olsun –instead of kullanılacak after yerine

 

Örnek: Tur tablosuna gTarih adında bi alan ekleyin tur tablosunda guncelleme yapıldığında gtarih alanına güncelleme tarihini kaydediniz.

Örnek: 500 sayfadan daha az roman türünde kitap eklenemesin

 

Yorum Yap

Yorum yapmak için tıklayın