SQL’de Tetikleyiciler (Triggers) Nedir ?

Furkan Alaybeg
4 min readNov 24, 2019

--

Tetikleyiciler (triggers) store procedure’ler ile neredeyse aynı işlevlere sahip olduğundan, SQL programlama diline yeni başlayanlar için karıştırılan konulardan biridir. Bu yazıda, SQL programlama dilinde Trigger (Tetikleyici) yapısının ne olduğu, nerelerde kullanıldığını, yeni bir trigger oluşturma, güncelleme, silme gibi işlemleri uygulamalı olarak anlatmaya çalışacağım.

Tetikleyici (Trigger) yapısı, ilişkisel veri tabanı yönetim sistemlerinde, bir tabloda belirli olaylar meydana geldiğinde veya gelmeden önce otomatik olarak çalışan özel bir store procedure türüdür. Bir tabloda ekleme, güncelleme ve silme işlemlerinden biri gerçekleştiğinde veya gerçekleşmeden önce, aynı tabloda veya başka bir tabloda belirli işlemlerin yapılmasını istediğimizde, trigger yapısını kullanırız. Örnek verecek olursak, satış tablosunda satış işlemi gerçekleştiğinde ürünün stok miktarının eksiltilmesi, banka hesabında işlem gerçekleştikten sonra otomatik olarak email gönderilmesi gibi örnekler verilebilir.

  • Tetikleyiciler veritabanı yöneticisi (Db admin) tarafından INSERT, UPDATE ve DELETE işlemlerinden önce veya sonra çalıştırılmak üzere tanımlanır.
  • Tetikleyiciler kullanıcı tarafından manuel olarak çalıştırılamaz.
  • Bir tetikleyici içinde, bir transaction commit ve rollback edilemez.
  • Tetikleyiciler tablo veya view yapılarına tanımlanabilir.
  • Bir tetikleyici olayı meydana geldiğinde, trigger fonksiyonu uygun bir zamanda veriyi işlemek üzere çağrılır.
  • DML (AFTER ve INSTEAD OF), DDL ve Logon tetikleyiciler olmak üzere üç yapı bulunmaktadır.

Nerelerde Kullanılır

  • Veri bütünlüğünu sağlamak için kullanılır. Veriler üzerinde bir işlem yapıldığında, iş kurallarına uygun gerçekleşip gerçekleşmediği kontrol edilerek, hatalı girişlerin yapılması önlenir.
  • Referans bütünlüğünü sağlamak için kullanılır. Bir kullanıcı silindiğinde onunla ilgili satış tablosundaki siparişleri silmek istediğimizde tanımlanır.
  • Tablolarda veya veritabanında mevcut olmayan ek bilgiyi türetmek için kullanılır. Örneğin sipariş tablosunda miktar sütununda bir güncelleme meydana geldiğinde toplam_fiyat sütununa karşılık gelen işlemi hesaplayabiliriz.

Tetikleyici (Trigger) Türleri

DML (Data Manipulation Language) Triggers:
INSERT, UPDATE ve DELETE gibi veri okuma ve işleme için kullanılan DML ifadeleridir. DML tetikleyicileri, INSERT, UPDATE ve DELETE olayları kullanılarak veriler her değiştirildiğinde tetiklenir. DML tetikleyicileri iki tip olarak sınıflandırılır.

  • AFTER tetikleyicileri: Bir tabloda INSERT, UPDATE, DELETE işlemleri yapıldıktan belli işlemlerin yapılması için kullanılmaktadır.
  • INSTEAD OF tetikleyicileri: Bir tablo veya view yapısında INSERT, UPDATE veya DELETE işlemlerini atlayıp, bunun yerine tetikleyici içinde tanımlanan diğer ifadeleri yerine getirirmektedir.

DDL (Data Definition Language) Triggers:
CREATE, ALTER, DROP gibi veritabanı ve tablo ile ilgili işlemler DDL ifadeleridir. DDL tetikleyicisinin amacı, bir DDL nesnesi oluşturmaya (create), değiştirmeye (alter) veya düşürmeye (drop) çalışan kullanıcılara kısıtlama getirilmesini sağlamaktadır. CREATE, ALTER ve DROP ifadeleri kullanıldığında devreye giren tetikleyici türüdür

Logon Triggers:
Logon tetikleyicisi, SQL Server sunucusuna bağlanan bir kullanıcılara belirli kısıtlamalar uygulayabiliriz. Logon tetikleyicileri, SQL Serverde güvenlik ve kontrol amaçlı kullanılmaktadır. Örneğin kullanıcı veritabanına dışarıdan bilinmeyen bir bilgisayarın bağlanmasını engelleyip, sadece şirket bilgisayarından bağlanılmasına izin verilebilir.

Uygulamalı Örnekler

Bu kısımda tetikleyici yapısına ait uygulamalı örnekler MSSQL Server ortamında NORTHWIND veritabanı kullanılarak gerçekleştirilmektedir.

Tetikleyici Oluşturma (Create Trigger)

Yeni bir Tetikleyici oluşturmak istediğimize, CREATE TRİGGER komutu ve Trigger ismi yazılır, sonrasında AFTER veya INSTEAD OF ifadeleri kullanılarak tetikleyicinin ne zaman çalışacağı belirlenir. Daha sonra AS ifadesiyle sorguya devam edilip, BEGIN ve END ifadeleri arasında tetikleciyle ilgili yapılmak istenen sorgular yazılır. Böylece [Order Details] tablosuna yeni bir sipariş (INSERT) işlemi yapıldığında, [Products] tablosunda sipariş adeti (quantity) kadar UnitInStock miktarı eksiltilir. Sonuç olarak, Update_StockQuantity isminde oluşturulan tetikleyici, her yeni sipariş sonrası otomatik olarak çalıştırılır.

Trigger Güncelleme (Alter Trigger)

Tetikleyici yapısında güncelleme işlemi gerçekleştirmek istediğimizde, ALTER ifadesi kullanılır. ALTER ifadesinden sonra, güncellenecek olan Tetikleyici ismi ve güncelleme sorgusu yazılır. Böylece ilk oluşturulan tetikleyicide [Products] tablosundan ürünün önceki ve sonraki stok miktarı listelenirken, güncellenen tetikleyicide ise [Products] tablosundan sadece eksiltme işlemi yapılır.

Tetikleyici Etkinleştirme ve Devre Dışı Bırakma (Enable and Disable Triggers)

Çalışmasını istemediğimiz tetikleyici DISABLE ifadesi kullanarak devre dışı bırakabiliriz. Böylece her ekleme işleminden sonra otomatik olarak çalışan tetikleyici artık çalışmayacaktır. Yukarıdaki örnekte ise, OBJECT_ID ile oluşturulan tetikleyicinin var olup olmadığı kontrol edilir. Eğer [Update_StockQuantity] isminde tetikleyici veritabanında mevcutsa, DISABLE ifadesiyle devre dışı bırakılır.

Devre dışı bırakılan tetikleyici tekrar çalışmasını istediğimizde, ENABLE ifadesi kullanarak etkinleştirebiliriz. Yukarıda yaptığımız gibi OBJECT_ID ile tetikleyicinin mevcut olup olmadığı kontrol edilir. Eğer mevcut silinmediyse, ENBALE ifadesi ile tekrar etkin hale getirilir. Böylece her sipariş ekleme işleminden sonra Update_StockQuantity tetikleyicisi, tekrar otomatik olarak çalışmaya başlayacaktır.

Trigger Silme (Drop Trigger)

Kullanılmayan Tetikleyici yapısının silinmesi istendiğinde, DROP ifadesi kullanılır. Yukarıdaki örnekte OBJECT_ID ile tetikleyicinin mevcut olup olmadığı kontrol edildikten sonra, DROP ifadesi ile tetikleyici silme işlemi gerçekleştirilir.

Şifreli Tetikleyici Oluşturma (With Encryption)

Tetikleyicimizin düzenlenebilirliğini kapatmak için şifreleme işlemi uygulanır. Şifrelenen Tetikleyiciler üzerinde artık kendimiz dahi değişiklik yapamayız. Bunun için şifreli tetikleyici oluştururken tetikleyici kodlarının da yedeğini bir yerde saklamamız ilerde değişiklik yapmak istediğimizde gerekli olabilir. Şifreli Tetikleyici, normal tetikleyici oluşturur gibi Tetikleyici isminden sonra WITH ENCRYPTION ifadesi eklenerek oluşturulur.

Umarım faydalı bir yazı olmuştur. Diğer yazılarda görüşmek dileğiyle.
İyi Çalışmalar…

--

--

Furkan Alaybeg

Big Data Engineer | SQL | PySpark | Hadoop | Apache Airflow | Apache Flink