⚙️ MySQL Trigger Kullanımı: BEFORE ve AFTER Tetikleyicilerle Otomatik Veri İşleme
💡 Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde MySQL tetikleyicilerinin (triggers) nasıl oluşturulacağını, hangi durumlarda kullanıldığını ve veri bütünlüğünü nasıl koruduğunu öğreneceksiniz.
Adım adım şunları yapacağız:
- $BEFORE$ ve $AFTER$ tetikleyicilerinin farklarını anlamak,
- $INSERT$, $UPDATE$ ve $DELETE$ işlemlerini otomatik hale getirmek,
- Silinen kayıtları arşivlemek,
- Özet (istatistik) tablolarını dinamik olarak güncellemek.
🔍 Kısacası: Bu rehber, manuel sorgularla uğraşmadan otomatik veri yönetimi yapmayı öğretir.
🧠 MySQL Trigger Nedir?
Trigger (tetikleyici), belirli bir olay gerçekleştiğinde (örneğin bir satır eklendiğinde, güncellendiğinde veya silindiğinde) otomatik olarak çalışan bir SQL işlevidir.
Bu sayede her kullanıcı eyleminden sonra sistemin kendi kendini yönetmesini sağlayabilirsiniz.
🎯 Kullanım Amacı
- Veri tutarlılığını korumak
- Silinen kayıtları arşivlemek
- İstatistiksel verileri güncel tutmak
- Denetim kaydı (audit trail) oluşturmak
Örneğin:
Bir ürün silindiğinde, otomatik olarak “silinen ürünler” tablosuna kaydedilebilir veya yeni eklenen kayıtların ismi otomatik büyük harfe çevrilebilir.
🔧 Ön Gereksinimler
Bu adımları uygulamak için ihtiyacınız olanlar:
- MySQL sunucusu (örneğin Rabisu Bulut üzerindeki bir sanal sunucu)
- $SELECT$, $INSERT$, $UPDATE$, $DELETE$ sorgularına temel düzeyde hakimiyet
- Yönetici yetkilerine sahip bir MySQL kullanıcısı
MySQL'e bağlanmak için:
mysql -u kullanici_adiniz -p
🗃️ Örnek Veritabanı ve Tablolar
Bu örneklerde koleksiyonum adlı bir veritabanı kullanılacak.
CREATE DATABASE koleksiyonum;
USE koleksiyonum;
Ana tablolar:
1️⃣ Ürünler Tablosu
Kodu kopyala
CREATE TABLE urunler (
ad VARCHAR(50),
deger DECIMAL(5,2)
);
2️⃣ İstatistik Tablosu
CREATE TABLE urunler_istatistik (
sayi INT,
deger DECIMAL(5,2)
);
INSERT INTO urunler_istatistik VALUES (0, 0.00);
3️⃣ Arşiv Tablosu
CREATE TABLE urunler_arsiv (
ad VARCHAR(50),
deger DECIMAL(5,2),
silinme_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
📌 Bu yapıyla koleksiyonunuza ürün ekleyebilir, silebilir ve istatistikleri otomatik yönetebilirsiniz.
🧩 Tetikleyici Mantığı ve Yapısı
Genel sözdizimi şöyledir:
CREATE TRIGGER tetikleyici_adi
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON tablo_adi
FOR EACH ROW
<yapilacak_islem>;
Açıklama:
| Anahtar Kelime | Açıklama |
|---|---|
BEFORE / AFTER | İşlemin öncesinde veya sonrasında çalışır |
INSERT, UPDATE, DELETE | Tetiklenecek olay |
NEW | Eklenen veya güncellenen veri |
OLD | Silinen veya değişmeden önceki veri |
✍️ BEFORE INSERT / UPDATE — Veri Tutarlılığı Sağlama
Aşağıdaki tetikleyiciler, ürün adlarını otomatik olarak büyük harfe çevirir.
CREATE TRIGGER buyuk_harf_insert
BEFORE INSERT ON urunler
FOR EACH ROW
SET NEW.ad = UPPER(NEW.ad);
$BEFORE$ $UPDATE$
CREATE TRIGGER buyuk_harf_update
BEFORE UPDATE ON urunler
FOR EACH ROW
SET NEW.ad = UPPER(NEW.ad);
🧠 Bu sayede 'model uçak' girilse bile tabloya 'MODEL UÇAK' olarak kaydedilir.
🗑️ BEFORE DELETE — Silinen Verileri Arşivleme
Kayıt silinmeden hemen önce onu yedek bir tabloya kaydetmek için:
CREATE TRIGGER arsivle_delete
BEFORE DELETE ON urunler
FOR EACH ROW
INSERT INTO urunler_arsiv (ad, deger)
VALUES (OLD.ad, OLD.deger);
💾 Bu işlem, silinen kayıtların urunler_arsiv tablosunda saklanmasını sağlar.
📊 AFTER INSERT / UPDATE / DELETE — Otomatik İstatistik Güncelleme
Her işlem sonrası özet bilgileri otomatik güncellemek için üç tetikleyici oluşturulur:
CREATE TRIGGER istatistik_after_insert
AFTER INSERT ON urunler
FOR EACH ROW
UPDATE urunler_istatistik
SET sayi = (SELECT COUNT(ad) FROM urunler),
deger = (SELECT SUM(deger) FROM urunler);
CREATE TRIGGER istatistik_after_update
AFTER UPDATE ON urunler
FOR EACH ROW
UPDATE urunler_istatistik
SET sayi = (SELECT COUNT(ad) FROM urunler),
deger = (SELECT SUM(deger) FROM urunler);
CREATE TRIGGER istatistik_after_delete
AFTER DELETE ON urunler
FOR EACH ROW
UPDATE urunler_istatistik
SET sayi = (SELECT COUNT(ad) FROM urunler),
deger = (SELECT SUM(deger) FROM urunler);
📈 Bu tetikleyiciler sayesinde tablo sayısı ve toplam değeri her zaman güncel kalır.
🧾 Tetikleyicileri Görüntüleme ve Silme
Listeleme:
SHOW TRIGGERS;
Silme:
DROP TRIGGER buyuk_harf_insert;
DROP TRIGGER buyuk_harf_update;
🧹 Bu komutlar ilgili tetikleyicileri devre dışı bırakır.
💬 Sıkça Sorulan Sorular (SSS)
1️⃣ $OLD$ ve $NEW$ farkı nedir? $OLD$ eski veriyi temsil eder ($UPDATE$ / $DELETE$ öncesi), $NEW$ ise yeni değeri ($INSERT$ / $UPDATE$ sonrası).
2️⃣ Bir tetikleyici birden fazla SQL komutu çalıştırabilir mi? Evet, $BEGIN$ ve $END$ bloklarıyla birden fazla sorgu tanımlayabilirsiniz.
3️⃣ Tetikleyiciler performansı etkiler mi? Çok sık tetiklenen tablolarda küçük bir yük oluşturabilir. Sorgularınızı optimize edin.
4️⃣ Tetikleyici ve View farkı nedir? View’lar yalnızca veriyi görüntüler, tetikleyiciler ise veriye doğrudan müdahale eder.
5️⃣ Tetikleyicileri hangi durumlarda kullanmamalıyım? Yoğun yazma trafiği olan sistemlerde (örneğin log tabloları) tetikleyici sayısını minimumda tutmak en iyisidir.
🏁 Sonuç
MySQL tetikleyicileri, veritabanı otomasyonu ve veri bütünlüğü için güçlü araçlardır. Bu rehberle, manuel işlem hatalarını azaltıp veritabanınızı daha akıllı hale getirebilirsiniz.
☁️ Tetikleyici örneklerini Rabisu Bulut MySQL sunucularında hemen deneyebilir, sisteminizin güvenilirliğini bir üst seviyeye taşıyabilirsiniz.