Trigger

Trigger yani tetikleyici, ilişkisel veri tabanı yönetim sistemlerinde bir tabloda belirli olaylar meydana geldiği zaman yani ekleme, güncelleme, silme işlemlerinden biri gerçekleşmeden önce veya sonra çalışan ve belirli işlemleri kodlandığı şekilde yerine getiren yordamdır.

Tetikler, veritabanında yapılan değişikliklerle birlikte otomatik olarak çalışan prosedürel program parçacıklarıdır. Bu yüzden iş mantığının tetiklerin içinde gerçeklenmesi, istenmeyen bir durumdur. Hatta tetiklerin profesyonel olmayan kişiler tarafından kullanılması genellikle tavsiye edilmez.

Bilâkis tetikleyici performans kaybı demektir. Fakat faydalarına ve sağladıklarına istinaden kaybedilen performansa razı olunur. Mesela birbirinin aynısı iki tablodan birinde tetikleyici kodları olup diğerinde olmaması durumunda her iki tabloya da toplu insert yapıldığında tetikleyici olan tabloda insert işleminin daha uzun süreceği görülebilir. Fakat işin sorgulama tarafında tetikleyicilerin olumlu ya da olumsuz bir katkısı yoktur. Gerek veri bütünlüğünü sağlamada, gerek bir takım işlemlerin otomatik yaptırılmasında tetikleyici yapılarından faydalanılır.

Bir tablo üzerinde belirli bir olaya bağlı olarak tetiklenip çalışan SQL kodlarıdır. Tablo üzerindeki tetikleyicileri (triggerleri) tetikleyen olaylar delete, insert ve update olaylarıdır. Bu olaylara istinâden üç ana tip tetikleyiciden bahsedilir. Bunlar insert tetikleyicisi, delete tetikleyicisi şeklindedir. Bir tablo üzerinde bu olayların öncesinde ve sonrasında tetiklenecek istenildiği kadar tetikleyici yazılabilir. Fakat genel eğilim ve kullanım, her bir olay için tek bir tetikleyici kullanmak şeklindedir.

Örneğin stok hareketleri sonucunda stok miktarlarının azalması veya artması işlemlerinin veya tahakkuk ve tahsilatlar sonucu carî hesapların etkilenmesi işlemlerinin tetikleyiciler aracılığı ile yapılmaları, tipik bir tetikleyici kullanım yeridir. Ayrıca referential integrity’yi sağlamak amacı ile de tetikleyici kullanımı çok tercih edilir. İlişkisel bir veritabanında örneğin PERSONEL tablosundaki kişinin bölüm bilgisi amaçlı olarak BOLUM_NO tutulması ve bölümün adının da BOLUM tablosundan bulunması yapıldığını düşünelim. Eğer 1 numaralı bölüm herhangi bir personele kullanıldıysa BOLUM tablosundan BOLUM_NO değeri 1 olan kaydın kesinlikle silinememesi gerekmektedir. Bu tür kontrollerin yapılarak veri bütünlüğünün korunmasına İngilizcede referential integrity denir. Bu amaçla yazılan veya bir veritabanı tasarım aracı kullanıldıysa onun otomatik olarak yazdığı tetikleyici kodları sayesinde bu bütünlük korunur. Çünkü BOLUM tablosunun delete tetikleyicisi’nde gerekli kontrolleri yapacak kod yazılır ve silinmek istenen BOLUM_NO herhangi bir personel için kullanıldıysa bu silme işlemine izin verilmez.

Satır düzeyi tetikleyici mantığında yazılan tetikleyici kodları, o an işleme tâbî olan bütün satırlar için veritabanı tarafından ayrı ayrı çalıştırılır. Yani misal 100 adet kaydı yeniliyorsak update tetikliyicimiz arka arkaya her satır için bir defa olmak üzere toplam 100 defa çalışır.

Statement level tetikleyici ise her statement için bir defa çalışır. Yani ister bir adet, ister 100 adet kaydı yeniliyor olun, yazdığınız tetikleyici kodu sadece bir defa çalışacaktır. Dolayısıyla yenilenen 100 kayıt için de yapılması gereken ayrı ayrı işlemler varsa bu işlemler tetikleyici içinde bir döngü marifetiyle yapılmalıdır.