Tetikleyiciler — belirli bir olay gerçekleştiğinde (genellikle bir tabloya INSERT, UPDATE veya DELETE işlemi olduğunda) belirli bir kodun (genellikle SQL veya prosedürel genişletmelerdeki diller gibi PL/pgSQL için PostgreSQL) otomatik olarak çalıştırılmasını sağlayan özel veritabanı nesneleridir.
Avantajlar:
Dezavantajlar:
Ne zaman uygulanır:
Tetikleyici örneği (PostgreSQL):
CREATE TABLE employee_audit ( id SERIAL PRIMARY KEY, employee_id INT, old_salary NUMERIC, new_salary NUMERIC, changed_at TIMESTAMP ); CREATE OR REPLACE FUNCTION audit_salary() RETURNS TRIGGER AS $$ BEGIN IF NEW.salary <> OLD.salary THEN INSERT INTO employee_audit(employee_id, old_salary, new_salary, changed_at) VALUES (OLD.id, OLD.salary, NEW.salary, NOW()); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_salary_update AFTER UPDATE ON employees FOR EACH ROW EXECUTE FUNCTION audit_salary();
Bir tetikleyici içinde, kurulu olduğu aynı tabloyu güncelleyebilir miyiz? Ne olur?
Cevap:
Eğer tetikleyici, bir tablonun UPDATE olayına ayarlandıysa ve içinde aynı tablonun başka bir UPDATE'ini gerçekleştiriyorsa, bu sonsuz özyineleme (döngü) durumuna yol açar ve komutun acil durumu veya tetikleyici derinliğini aşma hatasına neden olur. Bu nedenle her zaman özyineleme ortaya çıkmadığından emin olun veya özyinelemeli çağrılara izin veren/engelleyen seçenekleri kullanın.
Örnek:
-- Bu yapı, tetikleyiciyi döngüsel hale getirebilir: CREATE OR REPLACE FUNCTION recursive_update() RETURNS TRIGGER AS $$ BEGIN UPDATE employees SET salary = salary * 1.01 WHERE id = NEW.id; -- tekrar tetiklenecek RETURN NEW; END; $$ LANGUAGE plpgsql;
Tarih
Muhasebe CRM'sinde, işlem tablosu değiştiğinde otomatik olarak kayıtların loga yazılması için bir tetikleyici uygulandı. Yüksek yük altında hizmet daha yavaş çalışmaya başladı ve analiz, tetikleyicinin loga ekleme yapmakta çok zaman harcadığını ve optimize edilmediğini (örneğin, yalnızca önemli olayları yazmadığını) gösterdi.
Tarih
Envanter yönetimi projesinde, pozisyon ID'sini hesaplamak için bir BEFORE INSERT tetikleyici kullanıldı. Yanlış ID mantığı, veri çoğaltmaya neden oldu ve hata uzun süre gözden kaçtı çünkü "kamera arkasında" çalışıyordu.
Tarih
HR platformunda, her INSERT işlemi ile üst ve alt tablolardaki kayıtların toplu güncellenmesi gerçekleştiriliyordu. Tetikleyicideki mantık hataları nedeniyle özyineleme oluştu ve bu, tablolardaki tüm işlemleri tamamen engelledi. Tetikleyici devre dışı bırakılmak zorunda kaldı ve tabloları serbest bırakmak için karmaşık bir geri alma işlemi yapılması gerekti.