ProgramlamaVeritabanı Mühendisi / DBA

SQL'de tetikleyicilerin çalışma prensibini, artılarını ve eksilerini açıklar mısınız, ayrıca tipik kullanım senaryolarını belirtin. Gerçek bir tetikleyici örneği verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • İş mantığı ve veri doğrulamasının merkezi uygulanması.
  • Denetim otomasyonu (örneğin, değişikliklerin geçmişi).

Dezavantajlar:

  • Gizli çalışma — tetikleyicinin çalıştığı her zaman bariz olmayabilir.
  • Tablo değişiklikleri sık olduğunda performans düşüklüğü.
  • Hata ayıklama ve ön yüz sorunları ile ilgili zorluklar, döngüsel (özyinelemeli) tetikleyici riski.
  • Veri taşımaları daha karmaşık hale gelir.

Ne zaman uygulanır:

  • Veri denetimi.
  • İlişkili kayıtların otomatik oluşturulması.
  • Standart yöntemlerle mümkün olmayan kısıtlamaların kontrol edilmesi.

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();

Kandırmaca Sorusu

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.