Sql İle Veritabanı Trigger Oluşturma İşlemi Nasıl Yapılır?

Sql İle Veritabanı Trigger Oluşturma İşlemi Nasıl Yapılır?
Sql İle Veritabanı Trigger Oluşturma İşlemi Nasıl Yapılır?

SQL ile Veritabanı Trigger Oluşturma İşlemi Nasıl Yapılır?

Veritabanı yönetimi süreçlerinde, belirli bir tablo üzerinde gerçekleşen veri değişikliklerini otomatik olarak izlemek ve buna bağlı işlemler yapmak için SQL ile veritabanı trigger oluşturma işlemi kullanılır. Trigger'lar (tetikleyiciler), bir tabloya veri eklendiğinde, güncellendiğinde veya silindiğinde arka planda çalışan özel saklı yordamlardır.

Bu rehberde, 2026 yılı standartlarında SQL kullanarak nasıl profesyonel trigger'lar yazacağınızı, bu yapıların veritabanı bütünlüğünü nasıl koruduğunu ve performans üzerindeki etkilerini adım adım öğreneceksiniz. Veritabanı yöneticileri ve yazılım geliştiriciler için hazırlanan bu içerik, karmaşık iş mantıklarını veritabanı katmanında çözmenize yardımcı olacaktır.

Gereksinimler ve Ön Hazırlık

Trigger oluşturma işlemlerine başlamadan önce sisteminizde bir veritabanı yönetim sisteminin (RDBMS) kurulu olması gerekir. Bu makaledeki örnekler PostgreSQL, MySQL 8.0 ve SQL Server 2022 gibi modern sistemlerle uyumlu standart SQL sözdizimi kullanılarak hazırlanmıştır.

  • Veritabanı Sunucusu: PostgreSQL 16+, MySQL 8.4+ veya SQL Server 2022.
  • Yetkilendirme: Trigger oluşturmak için veritabanı üzerinde TRIGGER ve CREATE yetkilerine sahip olmalısınız.
  • İstemci Aracı: DBeaver, pgAdmin veya SQL Server Management Studio (SSMS) gibi bir yönetim arayüzü.

Trigger Nedir ve Neden Kullanılır?

Trigger, veritabanı üzerinde gerçekleşen bir "olay" (event) ile otomatik olarak tetiklenen bir nesnedir. Örneğin, bir kullanıcının bakiyesinden para çekildiğinde, bu işlemin loglanması veya başka bir tablodaki toplam tutarın güncellenmesi gerekiyorsa, trigger'lar en güvenli yoldur.

Trigger kullanmanın temel avantajları şunlardır:

  • Veri Bütünlüğü: Uygulama katmanından bağımsız olarak kuralların uygulanmasını sağlar.
  • Otomatik Denetim (Audit): Kimin, neyi, ne zaman değiştirdiğini otomatik olarak kaydeder.
  • Karmaşık İlişkiler: İlişkisel veritabanlarında çapraz tablo güncellemelerini tek bir işlemde yönetir.

Adım Adım Basit Bir Trigger Oluşturma

İlk adım olarak, bir tabloya yeni kayıt eklendiğinde o kaydın oluşturulma zamanını otomatik olarak bir log tablosuna yazan bir trigger oluşturalım. Aşağıdaki örnekte, siparisler tablosuna her veri girişi yapıldığında siparis_log tablosuna kayıt düşecektir.

-- Log tablosunu oluşturalım
CREATE TABLE siparis_log (
    id SERIAL PRIMARY KEY,
    islem_turu VARCHAR(50),
    tarih TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Trigger fonksiyonunu oluşturalım (PostgreSQL örneği)
CREATE OR REPLACE FUNCTION log_siparis_ekle()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO siparis_log(islem_turu) VALUES ('Yeni sipariş eklendi');
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Trigger'ı tabloya bağlayalım
CREATE TRIGGER trg_siparis_log
AFTER INSERT ON siparisler
FOR EACH ROW
EXECUTE FUNCTION log_siparis_ekle();

Bu kod bloğunda, AFTER INSERT ifadesi, verinin tabloya yazılmasından hemen sonra tetikleme yapılacağını belirtir. FOR EACH ROW ise her satır değişikliği için fonksiyonun çalışmasını sağlar.

Trigger Türleri ve Karşılaştırma Tablosu

Trigger'lar çalışma zamanlarına ve tetiklenme türlerine göre farklılık gösterir. Doğru trigger türünü seçmek, veritabanı performansını doğrudan etkiler.

Trigger Türü Avantajı Dezavantajı
BEFORE Veri yazılmadan önce kontrol/değişiklik imkanı sağlar. Hata durumunda işlem tamamen durabilir.
AFTER İşlem başarıyla tamamlandıktan sonra çalışır. Veri zaten yazıldığı için geri dönüş daha zordur.
INSTEAD OF View (Görünüm) üzerinde işlem yapılmasına olanak tanır. Sadece belirli veritabanı sistemlerinde desteklenir.

Veri Doğrulama ve Güvenlik İçin Trigger Kullanımı

Trigger'lar sadece kayıt tutmak için değil, aynı zamanda verinin doğruluğunu sağlamak için de kullanılır. Örneğin, bir ürünün stok adedi hiçbir zaman sıfırın altına düşmemelidir. Aşağıdaki örnek, bir güncelleme öncesinde stok kontrolü yapar.

CREATE TRIGGER trg_stok_kontrol
BEFORE UPDATE ON urunler
FOR EACH ROW
WHEN (NEW.stok_adedi < 0)
BEGIN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Stok adedi sıfırın altına düşemez!';
END;

Bu kodda BEFORE UPDATE kullanılmıştır. Eğer yeni değer (NEW) 0'dan küçükse, SIGNAL SQLSTATE komutu ile işlem iptal edilir ve kullanıcıya hata mesajı döner. Bu, veritabanı seviyesinde bir güvenlik katmanıdır.

Kritik Uyarı: Trigger'lar içerisinde çok ağır sorgular (karmaşık join'ler veya dış API çağrıları) çalıştırmaktan kaçının. Her trigger, ilgili tablodaki her işlem için ek yük oluşturur ve bu durum yüksek trafikli sistemlerde kilitlenmelere (deadlock) neden olabilir.

Trigger Yönetimi: Düzenleme ve Silme

Oluşturduğunuz bir trigger'ı güncellemek isterseniz, genellikle önce mevcut olanı silip (DROP) yeniden oluşturmanız gerekir. Bazı sistemlerde CREATE OR REPLACE desteklense de, standart SQL'de silme işlemi daha güvenlidir.

-- Trigger'ı silme
DROP TRIGGER IF EXISTS trg_siparis_log ON siparisler;

-- Trigger'ı devre dışı bırakma (PostgreSQL)
ALTER TABLE siparisler DISABLE TRIGGER trg_siparis_log;

Trigger'ları yönetirken, özellikle üretim ortamında (production) değişiklik yapmadan önce mutlaka yedek almalısınız. Devre dışı bırakma komutları, bakım çalışmaları sırasında performans kazanmanıza yardımcı olur.

Sıkça Sorulan Sorular

Trigger'lar veritabanı performansını yavaşlatır mı?

Evet, eğer trigger içerisinde çok sayıda karmaşık sorgu veya uzun süren işlemler varsa, tablo üzerindeki her yazma işlemi yavaşlayacaktır. Trigger'ları olabildiğince hafif tutmak en iyi pratiktir.

Bir tabloda birden fazla trigger olabilir mi?

Evet, aynı olay (örneğin INSERT) için birden fazla trigger tanımlayabilirsiniz. Ancak bunların çalışma sırasını yönetmek zor olabilir, bu yüzden mümkünse tek bir trigger içerisinde tüm mantığı toplamak daha düzenlidir.

Trigger içinden başka bir veritabanına bağlanabilir miyim?

Modern veritabanlarında dblink veya linked server gibi yapılarla bu mümkündür, ancak bu yöntem oldukça riskli ve performans düşürücüdür. Genellikle önerilmez.

Trigger'lar nasıl debug edilir?

Trigger'lar arka planda çalıştığı için hata ayıklamak zordur. En iyi yöntem, bir hata tablosu oluşturup trigger içindeki değişkenleri bu tabloya loglamaktır.

Trigger yerine uygulama katmanı (backend) kullanılabilir mi?

Evet, iş mantığını uygulama katmanında tutmak daha esnektir. Ancak veritabanı bütünlüğü (örneğin, verinin her türlü giriş yönteminde -API, CLI, Admin Panel- aynı kuralla korunması) için trigger'lar vazgeçilmezdir.

Yasal Uyarı: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Veritabanı üzerinde yapılacak tüm değişikliklerin sorumluluğu kullanıcıya aittir. Üretim ortamında yapılacak işlemleri önce geliştirme (development) ortamında test etmeniz önerilir.

Trigger Tasarımında İleri Seviye Stratejiler ve En İyi Uygulamalar

Trigger'lar, veritabanı mimarisinde "görünmez kahramanlar" gibi çalışır. Ancak, yanlış kurgulanmış bir trigger, veritabanı işlemlerinde darboğazlara (bottleneck) neden olabilir. Profesyonel bir veritabanı yönetimi için trigger tasarlarken şu stratejileri göz önünde bulundurmalısınız:

  • Atomik İşlemler: Trigger içerisindeki tüm işlemler tek bir işlem (transaction) bloğu içerisinde değerlendirilir. Eğer trigger başarısız olursa, ana işlem de geri alınır (rollback). Bu nedenle trigger kodunuzu mümkün olduğunca kısa ve hızlı tutun.
  • Karmaşık Sorgulardan Kaçının: Trigger içerisinde ağır JOIN işlemleri veya dış servis çağrıları yapmaktan kaçının. Bu, veritabanı yanıt süresini doğrudan olumsuz etkiler.
  • Sonsuz Döngü Riski: Bir trigger'ın kendi kendini tetikleyen bir tablo üzerinde işlem yapmadığından emin olun. Örneğin, bir UPDATE trigger'ı içerisinde aynı tabloyu tekrar UPDATE ederseniz, veritabanı "stack overflow" hatası verecektir.

Audit Log (Denetim Kaydı) Senaryosu: Uygulamalı Örnek

Birçok kurumsal projede, kritik verilerin kim tarafından ve ne zaman değiştirildiğini takip etmek yasal bir zorunluluktur. Aşağıdaki örnek, Personel tablosunda yapılan maaş güncellemelerini ayrı bir Personel_Log tablosuna kaydeden bir trigger yapısını göstermektedir.

Adım 1: Log Tablosunun Oluşturulması

CREATE TABLE Personel_Log (
    LogID INT IDENTITY(1,1) PRIMARY KEY,
    PersonelID INT,
    EskiMaas DECIMAL(18,2),
    YeniMaas DECIMAL(18,2),
    DegistirenKullanici NVARCHAR(100),
    DegisimTarihi DATETIME DEFAULT GETDATE()
);

Adım 2: Denetim Trigger'ının Yazılması

CREATE TRIGGER trg_PersonelMaasDegisim
ON Personel
AFTER UPDATE
AS
BEGIN
    IF UPDATE(Maas)
    BEGIN
        INSERT INTO Personel_Log (PersonelID, EskiMaas, YeniMaas, DegistirenKullanici)
        SELECT 
            i.PersonelID, 
            d.Maas, 
            i.Maas, 
            SYSTEM_USER
        FROM inserted i
        INNER JOIN deleted d ON i.PersonelID = d.PersonelID
        WHERE i.Maas  d.Maas;
    END
END;
İpucu: Yukarıdaki inserted ve deleted tabloları, SQL Server'da trigger'ın çalışma anında erişebildiği sanal tablolardır. deleted tablosu eski veriyi, inserted tablosu ise yeni veriyi tutar.

Trigger Performans Analizi ve İzleme

Trigger'ların sistem üzerindeki yükünü ölçmek için veritabanı yönetim araçlarının sunduğu "Execution Plan" (Çalışma Planı) özelliklerini kullanmalısınız. Eğer bir trigger'ın çok fazla kaynak tükettiğini fark ederseniz, şu adımları izleyin:

  1. İstatistikleri Kontrol Edin: Trigger'ın çalışması sırasında oluşan I/O (Giriş/Çıkış) maliyetlerini inceleyin.
  2. Mantığı Basitleştirin: Eğer trigger içerisinde çok sayıda IF koşulu varsa, bunları CASE ifadeleriyle veya daha optimize edilmiş sorgularla değiştirmeyi deneyin.
  3. Batch İşlemleri: Trigger'ın tek bir satır mı yoksa toplu (batch) güncelleme mi aldığını kontrol edin. INSERT INTO ... SELECT gibi toplu işlemlerde trigger'ın satır bazlı değil, set bazlı çalıştığından emin olun.

Performans sorunlarını minimize etmek için, trigger içerisinde sadece verinin doğruluğunu veya loglanmasını sağlayın. İş mantığı (business logic) gerektiren ağır hesaplamaları, mümkünse veritabanı dışında, uygulama katmanında (backend) gerçekleştirmek sistemin ölçeklenebilirliğini artıracaktır.

Sonuç

SQL ile veritabanı trigger oluşturma işlemi, veritabanınızın kendi kendini yönetebilen, güvenli ve tutarlı bir yapıya kavuşmasını sağlar. Bu rehberde, trigger'ların temel mantığını, nasıl oluşturulacağını ve hangi durumlarda kullanılacağını adım adım inceledik. Bir sonraki adım olarak, "Saklı Yordamlar (Stored Procedures)" konusunu araştırarak, trigger'lar ile birlikte nasıl daha gelişmiş veritabanı otomasyonları kurabileceğinizi öğrenebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Kerem Demir

Dijital araçlar ve kişisel verimlilik üzerine uzmanlaşmış profesyonel bir yazarım. Karmaşık konuları basit ve anlaşılır kılmak için rehber odaklı içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz