Veritabanı Tetikleyicisi (Trigger): Olay Olunca Kendiliğinden Çalışan Kod
Sözlük

Veritabanı Tetikleyicisi (Trigger): Olay Olunca Kendiliğinden Çalışan Kod

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 4 dk okuma

Trigger, bir tabloda ekleme, güncelleme ya da silme olduğunda veritabanının otomatik çalıştırdığı koddur. Nasıl çalıştığı, örnek ve kullanım riskleri.

Veritabanı tetikleyicisi (trigger) nedir?

Tetikleyici (trigger), bir tabloda belirli bir olay gerçekleştiğinde veritabanı motoru tarafından otomatik çalıştırılan, veritabanının içinde tanımlı koddur. Olay genellikle bir satırın eklenmesi (INSERT), güncellenmesi (UPDATE) ya da silinmesi (DELETE) olur. Uygulama ayrıca bir çağrı yapmaz; veri değiştiği anda tetikleyici kendiliğinden devreye girer.

Bunu bir güvenlik kamerasının hareket algılayınca kayda başlamasına benzetebilirsiniz: kayıt işini bir insan başlatmaz, olay tetikler. Aynı mantıkla bir tablodaki fiyat değiştiğinde eski fiyatı bir geçmiş tablosuna yazan tetikleyici, hangi uygulamanın ya da kullanıcının değişikliği yaptığına bakmaksızın çalışır.

Nasıl çalışır?

Bir tetikleyicinin tanımında şu bilgiler bulunur:

  • Tablo: Hangi tabloyu izlediği.
  • Olay: INSERT, UPDATE ya da DELETE.
  • Zamanlama: Olaydan önce (BEFORE) mi, sonra (AFTER) mi çalışacağı. BEFORE tetikleyiciler veriyi kaydedilmeden önce doğrulamak ya da düzeltmek için, AFTER tetikleyiciler ise kayıt tamamlandıktan sonra ek iş (log, bildirim, başka tabloyu güncelleme) için kullanılır.
  • Düzey: Her etkilenen satır için mi (satır düzeyi) yoksa her komut için bir kez mi (ifade düzeyi) çalışacağı.
  • Gövde: Çalışacak kod.

Satır düzeyindeki tetikleyiciler değişen satırın eski ve yeni değerlerine erişir. PostgreSQL ve MySQL'de bunlar OLD ve NEW adlarıyla, SQL Server'da ise inserted ve deleted adlı özel tablolarla sunulur. Sözdizimi veritabanı ürününe göre değişir, kavram aynıdır.

Küçük bir örnek: fiyat değişikliklerini kaydetmek

Örneğin products tablosunda bir ürünün fiyatı değiştiğinde eski ve yeni fiyatı price_history tablosuna kaydetmek isteyelim. PostgreSQL'de bu, ardışık parçalardan oluşur: önce tetikleyici fonksiyonu, sonra tetikleyicinin kendisi.

CREATE FUNCTION log_price_change() RETURNS trigger AS $$ BEGIN IF NEW.price <> OLD.price THEN INSERT INTO price_history (product_id, old_price, new_price, changed_at) VALUES (OLD.id, OLD.price, NEW.price, now()); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;

CREATE TRIGGER trg_price_change AFTER UPDATE ON products FOR EACH ROW EXECUTE FUNCTION log_price_change();

Artık herhangi bir uygulama, betik ya da yönetici products tablosunda fiyat güncellediğinde, fiyat gerçekten değiştiyse geçmiş tablosuna bir satır eklenir. Kod yalnızca fiyat farklıysa kayıt atar; ilgisiz sütun güncellemeleri geçmişi kirletmez.

Tetikleyici ne için kullanılır?

Tetikleyicilerin tipik kullanım alanları şunlardır:

  • Denetim kaydı (audit log): Kim, ne zaman, neyi değiştirdi bilgisinin tutulması.
  • Otomatik alanlar: Güncelleme zamanı gibi sütunların her değişiklikte kendiliğinden doldurulması.
  • Veri doğrulama: Standart kısıtlarla ifade edilemeyen, birden çok tabloya bağlı kuralların denetlenmesi.
  • Türetilmiş veri: Bir tablodaki değişikliğin özet tablosuna yansıtılması.
  • Silme yerine arşive taşıma: Silinen satırın bir arşiv tablosuna kopyalanması.

Bu kullanımların ortak yanı, kuralın uygulamadan bağımsız olarak veride uygulanmasıdır. Bir kural birden çok uygulama tarafından kullanılan bir veritabanında yaşıyorsa, her uygulamanın aynı kodu yazmasına gerek kalmaz.

Tetikleyici, kısıt ve saklı yordam arasındaki fark

Bu kavramlar sık karıştırılır:

  • Kısıt (constraint): NOT NULL, UNIQUE, FOREIGN KEY, CHECK gibi bildirimsel kurallardır. Mümkünse tercih edilir, çünkü basit, hızlı ve açıktır.
  • Saklı yordam (stored procedure): Veritabanında saklanan ve açıkça çağrılan koddur. Kendiliğinden çalışmaz.
  • Tetikleyici: Olayla otomatik çalışan koddur; çağrılması gerekmez, bu hem gücü hem riskidir.

Bir kural bir kısıtla ifade edilebiliyorsa kısıt kullanılmalı, ek bir iş akışı gerekiyorsa saklı yordam düşünülmeli, değişikliğe otomatik tepki gerekiyorsa tetikleyiciye başvurulmalıdır.

Riskler ve sık yapılan hatalar

Tetikleyiciler güçlüdür ama dikkatli kullanılmalıdır:

  • Gizli mantık: Kod uygulamada değil veritabanında olduğu için yeni gelen geliştirici bir güncellemenin neden başka bir tabloyu değiştirdiğini anlayamayabilir. Tetikleyicileri belgelemek şarttır.
  • Performans: Satır düzeyi tetikleyici, toplu güncellemede her satır için çalışır; büyük yüklemeler yavaşlar.
  • Zincirleme tetikleme: Bir tetikleyicinin başka bir tabloyu değiştirmesi diğer tetikleyiciyi çalıştırabilir; hatalı tasarım sonsuz döngüye yol açabilir.
  • Hata ayıklama zorluğu: Hata veren işlem, görünmeyen bir tetikleyiciden kaynaklanabilir.
  • Aşırı iş yüklemek: Ağır iş mantığını, dış çağrıları ya da e-posta göndermeyi tetikleyiciye koymak veri işlemini kilitleyebilir. Bu işler kuyrukla ya da uygulama katmanıyla yapılmalıdır.

Kısa kural: tetikleyiciyi küçük, hızlı ve tek amaçlı tutun.

Hangi rol ve ekipler için önemli?

Tetikleyici bilgisi veritabanı geliştiricileri, veri mühendisleri ve veri tabanı yöneticileri için gereklidir; analistler ise kendi raporlarındaki rakamların neden "kendiliğinden" değiştiğini anlamak için bilmelidir. Mindset'in SQL ile Veri Sorgulama (İleri) eğitimi görünümler, saklı yordamlar ve tetikleyiciler modülünü içerir; PostgreSQL ile Veri Analizi eğitimi PL/pgSQL ile programatik veritabanı geliştirmeyi ele alır.

Kurumsal ekiplerde asıl fayda, hangi iş kuralının veritabanında, hangisinin uygulamada yaşayacağına ortak karar vermektir; bu karar denetim ve bakım sürecini doğrudan etkiler.

İlgili Mindset programı

SQL ile Veri Sorgulama (İleri)

Sık sorulanlar

Sık sorulan sorular

Trigger ile view (görünüm) arasındaki fark nedir?

Görünüm, kayıtlı bir sorgudur; çağrıldığında veriyi okur ve veri üzerinde bir değişiklik yapmaz. Tetikleyici ise bir veri değişikliği olayına otomatik tepki veren koddur. Biri veriyi nasıl göstereceğinizi, diğeri veri değişince ne yapılacağını tanımlar.

Tetikleyici bir işlemi (transaction) geri alabilir mi?

Evet. Tetikleyici, işlemin içinde çalıştığı için bir hata fırlatırsa ana komut da geri alınır. Doğrulama amaçlı tetikleyiciler bu davranıştan yararlanır: kural ihlal edilirse hata verip değişikliği engellerler. Bu nedenle tetikleyici içindeki beklenmeyen hata, asıl işlemi de başarısız kılar.

Tetikleyicileri uygulamada mı yoksa veritabanında mı yazmalıyım?

Kural birden çok uygulama ya da doğrudan veritabanı erişimi tarafından aşılabiliyorsa veritabanı tarafı daha güvenlidir. Kural yalnızca tek uygulamaya özgüyse ve ekip veritabanı mantığını yönetmiyorsa uygulama katmanı daha sürdürülebilir olabilir. Karar, denetlenebilirlik ve bakım maliyetine göre verilir.

Bir tablodaki tetikleyicileri nasıl görürüm?

Çoğu veritabanı ürününde tetikleyiciler sistem kataloglarında ya da yönetim arayüzünde listelenir. Hangi komutun kullanılacağı ürüne göre değişir; PostgreSQL, MySQL ve SQL Server kendi sistem görünümlerini sunar. Bir tabloda beklenmeyen davranış gördüğünüzde bakılacak ilk yerlerden biri budur.

Veritabanı Tetikleyicisi (Trigger) Nedir? SQL Örneği