Tetikleyiciler (Triggers)

Eyl 06, 2013
Tetikleyiciler, SQL Server üzerinde herhangi bir işlem gerçekleştiğinde başka bir işlemin tetiklenmesi istenildiğinde kullanılır. Tetiklenecek işlem tamamen kullanıcının belirlediği çerçevede başka bir kayıt ekleme, rapor alma veya genelde kullanıldığı gibi kontrol mekanizmaları oluşturmak için kullanılabilir. 

Tetikleyici Türleri:

SQL Server'da iki farklı tür tetikleyici vardır. Bunlar After ve Instead Of tetikleyicileridir. 

  1. "After" Tetikleyicileri:

    "After" tetikleyicileri kendiyle ilişkili işlem gerçekleştikten hemen sonra tetiklenir. Veritabanındaki temel işlemler için (ekleme,silme ve güncelleme) "After" tetikleyicileri tanımlanabilir. Örneğin: Yeni bir personel kaydı silindiğinde farklı tablolarda o personele ait diğer bilgilerin silinmesi "After Delete" tetikleyicisi ile sağlanabilir. Birden fazla tetikleyici, bir iş için tanımlanabildiği gibi, bir tetikleyici de, birden fazla iş için tanımlanabilir. "After" tetikleyicileri sadece tablolar için tanımlanabilir.
  2. "Instead Of" Tetikleyicileri:

    "Instead of" tetikleyicileri belirlenen işlem tam çalışacakken araya girer ve kendi içinde tanımlanan komutları icra etmeye başlar. Yani belirlenen işlemin yerine geçer. "Instead of" tetikleyicileri işlemlerin arasına girebildiğinden kontrol amaçlı kullanılabilirler. Örneğin: Ekleme işlemi için tanımlanan bir tetikleyici, ekleme işleminden hemen önce araya girerek uygun koşulların sağlanıp sağlanmadığını kontrol edebilir. Tıpkı "after" tetikleyicileri gibi temel veritabanı işlemleri için "instead of" tetikleyicileri tanımlanabilir; fakat "after" tetikleyicileri sadece tablolar için tanımlanabiliyorken "Instead of" tetikleyicileri hem tablolar için hem de "view"lar için tanımlanabilirler.

Tetikleyici Oluşturmak:

Tıpkı SQL Server üzerinde yapılan diğer tüm işlemler gibi tetikleyici oluşturmak için de farklı yöntemler mevcuttur. Burada Enterprise Manager kullarak tetikleyici oluşturma üzerinde durulacaktır. Bunun için;

  • Enterprise Manager başlatılır.
  • Önceden oluşturulmuş olan Musteriler tablosuna MusteriId (int, identity = Yes) , MusteriKodu (int) olan iki sütun eklenir.
  • Tetikleyici oluşturmak istenen Musteriler tablosuna sağ tıklanarak All Tasks (Tüm Görevler) başlığından Manage Triggers (Tetikleyicileri Yönet) seçeneği seçilir. Açılan pencere tetikleyici oluşturmak ve düzenlemek için bir arabirim sunar.



Bu arabirim tetikleyici için bir şablon sunar. Köşeli parantezlerin ( [] ) içindeki değerleri değiştirerek istenen işlevi yerine getirecek tetikleyici oluşturulabilir. İlk değişken ( [TRIGGER NAME] ) tetikleyiciye verilmek istenen isim ile değiştirilsin. İkinci değişken, tetikleyicinin hangi tablo üzerinde oluşturulacağını belirler. Tetikleyici oluşturmak için sağ tıklanan tablonun adı (resimde [dbo].[Musteriler] olan kısım) varsayılan olarak şablona yazılmış durumda gelecektir. "For" ifadesinden sonraki kısım tetikleyicinin hangi işlemlerden sonra çalışacağını belirler. As ifadesinden hemen sonra ise tetikleyicinin ne iş yapacağı belirlenir.

Tetikleyicinin kullanımını örneklemek amacıyla, Musteriler tablosuna yeni eklenen bir kayıt olduğunda MusteriKodu'nu '100' olarak olarak atayan bir tetikleyici oluşturulacak. Bunun için bir "After tetikleyicisi" kullanılır.

CREATE TRIGGER [Tetikleyicim] ON [dbo].[Deneme] 
FOR INSERT
AS
UPDATE Deneme SET BC_NO = 202
WHERE Deneme.BC_NO= (SELECT BC_NO FROM inserted)

Kodu birinci şekilde görünen arabirimdeki kod kısmına yapıştırılır. Burada dikkat edilmesi gereken Inserted tablosunun kullanımıdır. Inserted, kayıt eklendiğinde eklenen kayıtları tutan, Deleted ise kayıt silindiğinde silinen kayıtları tutan geçici tablolardır. Örnekte eklenen kayıdın MusteriId değeri okunarak, yeni eklenen kaydınMusteriKodu değiştiriliyor.

OK komut düğmesine basarak arabirim kapanır. Artık tetikleyici işlevsel durumdadır. Denemek için Deneme tablosuna yeni bir kayıt girilsin. BC_NO, identity = yesolarak belirlendiğinde otomatik olarak atandığı için ve  tetikleyici tarafından doldurulacağı için herhangi bir giriş yapılmamalıdır.



Kaydı girdikten sonra, görüntünün tazelenmesi için ünlem işaretine basılır.



Görüldüğü gibi BC_NO alanı tetikleyici tarafından otomatik olarak doldurulur.

Mevcut bir tetikleyici üzerinde değişiklik yapmak için de aslında aynı yolun takip edilmesi yeterlidir. Sadece birinci şekilde görülen pencerenin üst kısmından istenen tetikleyici seçilmelidir. Bundan sonra güncelleme yapılıp OK(Tamam) komut düğmesine tıklanması yeterli olacaktır. Yine tetikleyici silme işlemi de bu pencereden istenilen tetikleyici seçilip Sil (Delete) komut düğmesine tıklanır gerçekleştirilir.