Sql & Veritabanı İle Uygulamalar İçin Veri Kayıt Tetikleyici Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri Kayıt Tetikleyici Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri Kayıt Tetikleyici Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu eğitimde yer alan örnekleri uygulayabilmek için yerel makinenizde veya bir bulut sunucusunda çalışan güncel bir SQL veritabanı sunucusuna ihtiyacınız vardır. 2026 yılı itibarıyla PostgreSQL 17+ veya MySQL 9.0+ sürümlerini kullanmanız önerilir.

  • Veritabanı Sunucusu: PostgreSQL veya MySQL kurulumu.
  • SQL İstemcisi: DBeaver, pgAdmin veya terminal üzerinden erişim sağlayabileceğiniz bir araç.
  • Temel Bilgi: Tablo oluşturma (CREATE TABLE) ve temel SQL sorguları (INSERT, UPDATE) hakkında bilgi sahibi olmanız yeterlidir.

Tüm örnekler, standart SQL sözdizimine sadık kalınarak hazırlanmıştır. Ancak, veritabanı motorları arasındaki küçük farklar (örneğin PostgreSQL'de FOR EACH ROW kullanımı) için ilgili bölümlerde uyarılar yer alacaktır.

Adım 1: Tetikleyici (Trigger) Mantığını Anlamak

Tetikleyici, veritabanında belirli bir olay (event) gerçekleştiğinde otomatik olarak çalışan bir saklı yordamdır (stored procedure). Bir tetikleyici oluştururken üç temel unsuru belirlemeniz gerekir: Hangi tablo, hangi olay (INSERT, UPDATE, DELETE) ve olaydan önce mi (BEFORE) yoksa sonra mı (AFTER) çalışacağı.

Tetikleyiciler genellikle denetim izleri (audit logs), veri doğrulama veya ilişkili tablolardaki verilerin otomatik güncellenmesi için kullanılır. Örneğin, bir kullanıcı kayıt olduğunda, bu kullanıcının profil tablosuna da otomatik bir satır eklemek tetikleyicinin en yaygın kullanım senaryolarından biridir.

Adım 2: Örnek Bir Senaryo ile Tabloları Oluşturma

Uygulamamızda bir 'kullanıcılar' tablosu ve bu kullanıcıların eylemlerini takip edeceğimiz bir 'log' tablosu olduğunu varsayalım. İlk olarak bu tabloları hazırlayalım.

CREATE TABLE kullanicilar (
    id SERIAL PRIMARY KEY,
    ad VARCHAR(100),
    email VARCHAR(150) UNIQUE NOT NULL,
    kayit_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE sistem_loglari (
    log_id SERIAL PRIMARY KEY,
    islem_turu VARCHAR(50),
    kullanici_id INT,
    aciklama TEXT,
    islem_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Yukarıdaki kod bloğunda, verilerin tutulacağı temel yapıyı kurduk. SERIAL veri tipi, PostgreSQL'de otomatik artan kimlik numaraları için kullanılır; MySQL kullanıyorsanız AUTO_INCREMENT anahtar kelimesini kullanmalısınız.

Adım 3: Veri Kayıt Tetikleyici (Trigger) Oluşturma

Şimdi, kullanicilar tablosuna yeni bir kayıt eklendiğinde, sistem_loglari tablosuna otomatik olarak "Yeni kullanıcı eklendi" bilgisini yazacak tetikleyiciyi oluşturalım. Bu işlem, veri güvenliği ve izlenebilirlik açısından büyük önem taşır.

-- Önce tetikleyici fonksiyonu oluşturuyoruz (PostgreSQL örneği)
CREATE OR REPLACE FUNCTION log_yeni_kullanici()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO sistem_loglari (islem_turu, kullanici_id, aciklama)
    VALUES ('INSERT', NEW.id, 'Yeni bir kullanıcı sisteme dahil oldu: ' || NEW.email);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Ardından tetikleyiciyi tabloya bağlıyoruz
CREATE TRIGGER kullanici_eklendikten_sonra
AFTER INSERT ON kullanicilar
FOR EACH ROW
EXECUTE FUNCTION log_yeni_kullanici();

Bu kod bloğu, NEW anahtar kelimesini kullanarak yeni eklenen satırın verilerine erişir. AFTER INSERT ifadesi, verinin tabloya başarıyla yazılmasından hemen sonra tetikleyicinin devreye gireceğini belirtir.

Adım 4: Tetikleyiciyi Test Etme

Tetikleyicinin çalışıp çalışmadığını doğrulamak için kullanicilar tablosuna basit bir veri girişi yapalım ve ardından sistem_loglari tablosunu kontrol edelim.

-- Kullanıcı ekleme
INSERT INTO kullanicilar (ad, email) VALUES ('Ahmet Yılmaz', 'ahmet@example.com');

-- Logları kontrol etme
SELECT * FROM sistem_loglari;

Eğer her şey doğru yapılandırıldıysa, SELECT sorgusunun sonucunda sistem_loglari tablosunda yeni bir satır görmelisiniz. Bu, tetikleyicinin başarıyla tetiklendiğini ve veriyi işlediğini kanıtlar.

Adım 5: Tetikleyici Kullanımında Güvenlik ve Performans

Tetikleyiciler güçlü araçlardır ancak yanlış kullanıldıklarında veritabanı performansını ciddi şekilde düşürebilirler. Özellikle çok büyük verilerle çalışırken tetikleyici içinde karmaşık sorgular çalıştırmaktan kaçınmalısınız.

Kritik Uyarı: Tetikleyiciler içerisinde sonsuz döngülere dikkat edin. Örneğin, bir tablonun UPDATE tetikleyicisi içinde aynı tabloyu tekrar UPDATE ederseniz, veritabanı sonsuz bir döngüye girebilir ve sistem çöker. Her zaman tetikleyici mantığınızın bir çıkış noktası olduğundan emin olun.

Ayrıca, SQL Injection riskine karşı tetikleyici içinde dinamik SQL oluştururken EXECUTE komutunu kullanırken kullanıcıdan gelen verileri doğrudan sorguya eklemeyin; her zaman parametreli sorguları tercih edin.

Karşılaştırma: Tetikleyici vs. Uygulama Katmanı

Veri kayıt işlemlerini nerede yapmalısınız? Aşağıdaki tablo, tetikleyici ile uygulama katmanı (Backend) arasındaki farkları özetler.

Özellik Veritabanı Tetikleyicisi Uygulama Katmanı (Backend)
Performans Daha hızlı (veritabanına yakın) Daha yavaş (network trafiği)
Bakım Zor (DB içinde gizli kalır) Kolay (Kod üzerinde izlenebilir)
Güvenilirlik Yüksek (Her türlü girişi yakalar) Düşük (Doğrudan DB sorgularını atlar)

Sıkça Sorulan Sorular

Tetikleyici (Trigger) hatasını nasıl debug ederim?

PostgreSQL kullanıyorsanız RAISE NOTICE komutunu kullanarak tetikleyici içindeki değişkenleri konsola yazdırabilir ve hata ayıklama yapabilirsiniz.

Tetikleyiciyi nasıl devre dışı bırakırım?

ALTER TABLE tablo_adi DISABLE TRIGGER tetikleyici_adi; komutu ile geçici olarak tetikleyiciyi durdurabilirsiniz.

Tetikleyiciler veritabanını yavaşlatır mı?

Evet, eğer tetikleyici çok sayıda karmaşık işlem yapıyorsa (örneğin her kayıt eklemede 10 farklı tabloyu güncelliyorsa) yazma hızını (INSERT/UPDATE) düşürebilir.

Birden fazla tetikleyici aynı anda çalışabilir mi?

Evet, aynı tablo üzerinde aynı olay için birden fazla tetikleyici tanımlayabilirsiniz. Ancak bunların çalışma sırasını yönetmek karmaşık olabilir.

Tetikleyici içinde şifre hashleme yapılır mı?

Önerilmez. Şifre hashleme gibi güvenlik işlemleri, uygulama katmanında (Backend) yapılmalı ve veritabanına hashlenmiş veri gönderilmelidir.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim (production) ortamlarında kullanmadan önce mutlaka kapsamlı testler yapın ve veritabanı yedeklerinizi aldığınızdan emin olun. Yanlış yapılandırılmış tetikleyiciler veri kaybına yol açabilir.

Tetikleyici Yönetiminde İleri Seviye Stratejiler ve Best Practices

Tetikleyicilerin karmaşıklığı arttıkça, veritabanı yönetim sistemlerinin (DBMS) sunduğu gelişmiş özellikleri kullanmak, kodun sürdürülebilirliği açısından kritik öneme sahiptir. Özellikle büyük ölçekli sistemlerde, tetikleyicilerin sadece "çalışması" değil, aynı zamanda "yönetilebilir" olması gerekir.

Koşullu Tetikleyici Mantığı (Conditional Triggers)

Her tetikleyici, tablodaki her işlemde çalışmak zorunda değildir. Gereksiz tetikleyici tetiklemelerini önlemek için WHEN yan tümcesini kullanmak, veritabanı üzerindeki yükü ciddi oranda azaltır. Bu yöntem, tetikleyicinin gövdesine girmeden önce belirli bir koşulun sağlanıp sağlanmadığını kontrol eder.

CREATE TRIGGER trg_audit_salary_change
AFTER UPDATE ON employees
FOR EACH ROW
WHEN (OLD.salary IS DISTINCT FROM NEW.salary)
BEGIN
    INSERT INTO salary_audit_log (employee_id, old_salary, new_salary, changed_at)
    VALUES (NEW.id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP);
END;

Tetikleyici Zincirleme (Trigger Chaining) ve Riskleri

Tetikleyiciler, başka tabloları güncelleyebilir ve bu durum başka tetikleyicileri tetikleyebilir. Bu "zincirleme" etkisi, kontrol edilmediğinde sonsuz döngülere veya tahmin edilemez veri tutarsızlıklarına yol açabilir. Bu tür durumlarda RECURSIVE tetikleyici ayarlarını ve veritabanı motorunuzun izin verdiği maksimum tetikleyici derinliğini (nesting level) göz önünde bulundurmalısınız.

İpucu: Tetikleyici zincirlerini takip etmek için veritabanı loglarını izleyin. Eğer bir işlem beklenenden uzun sürüyorsa, tetikleyicileriniz arasında bir döngü oluşmuş olabilir.

Tetikleyici Performansını İzleme ve Optimizasyon

Tetikleyiciler, veritabanı işlemlerinin bir parçası olarak çalıştıkları için, tetikleyici içinde yapılan her ek sorgu, ana işlemin süresini uzatır. Performansı optimize etmek için şu adımları izleyebilirsiniz:

  • Sorgu Karmaşıklığını Azaltın: Tetikleyici içinde karmaşık JOIN işlemlerinden kaçının.
  • İndeksleme: Tetikleyici içerisinde sorgulanan veya güncellenen sütunların mutlaka indekslendiğinden emin olun.
  • Toplu İşlemler (Batch Processing): Eğer mümkünse, tek tek satırlar yerine toplu işlemler için tasarlanmış tetikleyici yapılarını (örneğin PostgreSQL'de FOR EACH STATEMENT) tercih edin.

Tetikleyici Maliyet Analizi

Veritabanınızın tetikleyiciler üzerindeki etkisini ölçmek için yerleşik performans araçlarını kullanın. Örneğin PostgreSQL üzerinde bir tetikleyicinin maliyetini analiz etmek için aşağıdaki yaklaşımı kullanabilirsiniz:

-- Tetikleyici çalışma sürelerini izlemek için pg_stat_user_functions görünümünü kullanın
SELECT funcname, calls, total_time, self_time
FROM pg_stat_user_functions
WHERE funcname LIKE '%trg_%';

Bu analiz, hangi tetikleyicinin en çok kaynak tükettiğini belirlemenize ve optimize etmeniz gereken noktaları net bir şekilde görmenize yardımcı olacaktır. Unutmayın, veritabanı performansı, yazılan kodun verimliliği ile doğrudan ilişkilidir.

Sonuç

Sql & veritabanı ile uygulamalar için veri kayıt tetikleyici nasıl yapılır sorusunu, temelden ileri seviyeye doğru inceledik. Tetikleyiciler, veritabanı bütünlüğünü korumak ve uygulama bağımsız işlemler gerçekleştirmek için vazgeçilmezdir. Bir sonraki adım olarak, tetikleyicilerin performansını izlemek için EXPLAIN ANALYZE komutlarını öğrenerek, tetikleyici içeren sorgularınızın veritabanı üzerindeki maliyetini analiz etmeye başlayabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Burak Çelik

Doğa sporları, kampçılık ve açık hava aktiviteleri konularında uzmanlaşmış bir rehber yazarıyım. Yeni başlayanlar için güvenli ve keyifli bir deneyim sunacak, teknik bilgisi yüksek içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz