MySQL tetikleyicileri(trigger), tablolara veri eklerken, güncellerken veya satırları kaldırırken belirli kısıtlamaları uygular.
MySQL’deki sütunlar, bir miktar değer kısıtlaması uygular. Örneğin, bir sütunu tiny int olarak ayarlamak ve null olmamasını zorunlu kılmak, küçük bir sayı değeri girişi gerektirir. Ancak, veri bütünlüğünü korumak için daha fazla kısıtlamaya ihtiyaç vardır.
Bu yazı, kişisel blogunuzda MySQL tetikleyicilerini nasıl kullanacağınızı ayrıntılı bir şekilde açıklar ve her bir tetikleyici türü için somut örnekler sunar.
MySQL’de Tetikleyici Nedir?
Bir tetikleyici, bir olayın bir tabloda gerçekleştiğinde devreye giren adlandırılmış bir MySQL nesnesidir. Tetikleyiciler, belirli bir tablo ile ilişkilendirilmiş özel bir depolanan prosedür türüdür.
MySQL CREATE TRIGGER
Bir tetikleyici, belirli bir olaya yanıt olarak otomatik olarak yürütülen SQL ifadeleri kümesidir; bu olaylar arasında özellikle belirtilen bir tabloda gerçekleşen INSERT, UPDATE veya DELETE işlemleri bulunmaktadır.
CREATE TRIGGER ifadesi, bir tablo ile ilişkilendirilmiş yeni bir tetikleyici oluşturmanıza olanak tanır.
İşte CREATE TRIGGER ifadesinin sözdizimi:
1 2 3 4 5 6 7 8 | CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN -- Tetikleyici ifadeleri buraya gelecek END; |
Not: tetikleciyi adı genellikle tabloadı – before|after }-{insert|update|delete} şeklinde yazılır. Örnek: ogrenci_before_insert şeklinde bir isim vermek daha uygundur.
- trigger_name: Tetikleyici adı.
- BEFORE veya AFTER: Tetikleyicinin ne zaman yürütüleceğini belirler.
- INSERT, UPDATE veya DELETE: Tetikleyiciyi etkinleştiren işlemin türünü belirler.
- table_name: Tetikleyicinin tanımlandığı tablonun adı.
- FOR EACH ROW: Tetikleyicinin tetikleyici olayı tarafından etkilenen her bir satır için bir kez yürütülmesini belirtir.
- BEGIN ve END: Tetikleyici gövdesini sınırlar; burada yürütülecek SQL ifadelerini tanımlarsınız.
- Tetikleyici gövdesi, işlem tarafından etkilenen sütunların değerlerine erişebilir.
Olayın tetiklendikten ÖNCE ve SONRA gelen sütun değerleri arasındaki farkı ayırt etmek için NEW ve OLD değiştiricilerini kullanırsınız.
Örneğin, sayfasayisi sütunundaki bir değeri güncellerseniz, tetikleyici gövdesinde güncelleme ÖNCESİ sayfasayisi sütununun değerine OLD.sayfasayisi ve yeni değere NEW.sayfasayisi şeklinde erişebilirsiniz.
Aşağıdaki tablo, OLD ve NEW değiştiricilerinin kullanılabilirliğini göstermektedir:
Olay / Etkileşim Türü | OLD Modifier | NEW Modifier |
---|---|---|
INSERT | NULL | Değer Var |
UPDATE | Değer Var | Değer Var |
DELETE | Değer Var | NULL |
Bu tablo, OLD ve NEW değiştiricilerinin belirli olay ve etkileşim türlerinde hangi durumlarda kullanılabileceğini gösterir.
MySQL Trigger Örnekleri
MySQL Trigger Örneği 1:
Tablonuzu ve tabloyla ilişkili bir tetikleyici örneğini oluşturalım. Aşağıda, “kitap” adlı basit bir tabloyu ve bu tabloya bir güncelleme tetikleyici örneğini içeren SQL ifadelerini bulabilirsiniz:
1. Kitap Tablosunu Oluşturma:
1 2 3 4 5 6 7 8 9 | CREATE TABLE kitap ( kitap_id INT PRIMARY KEY, baslik VARCHAR(255), yazar VARCHAR(255), yayinevi VARCHAR(255), yayin_yili INT ); |
2. Kitap Tablosuna Veri Ekleme:
1 2 3 4 5 6 7 | INSERT INTO kitap (kitap_id, baslik, yazar, yayinevi, yayin_yili) VALUES (1, 'Harry Potter ve Felsefe Taşı', 'J.K. Rowling', 'YKY', 1997), (2, '1984', 'George Orwell', 'Can Yayınları', 1949), (3, 'Beyaz Diş', 'Jack London', 'İş Bankası Kültür Yayınları', 1906); |
3. Kitap Tablosu İçin Güncelleme Tetikleyicisi Oluşturma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | DELIMITER // CREATE TRIGGER kitap_before_update BEFORE UPDATE ON kitap FOR EACH ROW BEGIN -- Güncelleme öncesindeki değeri alma (OLD değiştirici) DECLARE eski_baslik VARCHAR(255); SET eski_baslik = OLD.baslik; -- Güncelleme sonrasındaki değeri alma (NEW değiştirici) DECLARE yeni_baslik VARCHAR(255); SET yeni_baslik = NEW.baslik; -- Konsola bilgi yazdırma (bu kısmı ihtiyaca göre değiştirebilirsiniz) SELECT CONCAT('Kitap güncellendi: ', eski_baslik, ' -> ', yeni_baslik) AS 'Bilgi'; END; // DELIMITER ; |
Bu örnekte, “kitap” adlı bir tablo oluşturulmuş ve tablonun güncellenmesi durumunda tetiklenecek bir “kitap_guncelleme” adlı tetikleyici eklenmiştir. Tetikleyici, güncelleme işleminden önce her bir satır için çalışacak şekilde ayarlanmıştır. Tetikleyici, güncelleme öncesindeki ve sonrasındaki değerleri alarak konsola bir bilgi mesajı yazdırmaktadır. Bu, gerçek dünya senaryolarına uygun olarak daha karmaşık hale getirilebilir.
MySQL Trigger Örneği 2:
MySQL Trigger Örneği: “islem_after_update”
MySQL tetikleyicileri, belirli bir olayın gerçekleşmesi durumunda otomatik olarak çalışan SQL kodlarıdır. Aşağıda, bir “islem” tablosu üzerinde güncelleme yapıldığında çalışan bir tetikleyici örneği bulunmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATE TRIGGER `islem_after_update` AFTER UPDATE ON `islem` FOR EACH ROW BEGIN -- Kitap tablosundan sayfa sayısını al DECLARE sayfa INT; SELECT sayfasayisi INTO sayfa FROM kitap WHERE kitapno = NEW.kitapno; -- Öğrenci tablosunu güncelle UPDATE ogrenci SET puan = puan + sayfa WHERE ogrno = NEW.ogrno; END; |
Bu tetikleyici, “islem” tablosunda bir güncelleme yapıldığında çalışacaktır. Güncelleme işlemi sonrasında, ilgili “kitapno” ve “ogrno” değerlerine göre “kitap” ve “ogrenci” tablolarındaki verileri güncelleyecektir.
Bu örnek, bir öğrencinin okuduğu bir kitaptaki sayfa sayısına bağlı olarak puanını güncellemek için kullanılabilir. Tetikleyici, güncelleme işlemi gerçekleştiğinde otomatik olarak devreye girer ve gerekli güncellemeleri yapar.
MySQL Trigger Örnek 3:
MySQL Tetikleyici Örneği: “islem_before_insert”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATE TRIGGER `islem_before_insert` BEFORE INSERT ON `islem` FOR EACH ROW BEGIN -- Öğrencinin alınmış kitapları arasında henüz iade edilmemiş bir kitap var mı kontrol et DECLARE islem_sayisi INT; SELECT COUNT(*) INTO islem_sayisi FROM islem WHERE vtarih IS NULL AND ogrno = NEW.ogrno; -- Eğer alınmış ancak iade edilmemiş bir kitap varsa, hata mesajı gönder IF islem_sayisi > 0 THEN SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Alınan kitap geri getirilmeli'; END IF; END; |
Bu tetikleyici, “islem” tablosuna yeni bir kayıt eklenmeden önce çalışacaktır. Tetikleyici, eklenmeye çalışılan kaydın öğrencinin daha önce iade etmediği bir kitap içerip içermediğini kontrol eder. Eğer öğrencinin iade etmediği bir kitap varsa, tetikleyici bir hata mesajı gönderecektir.
Bu örnek, öğrencilerin alıp henüz iade etmedikleri kitapları kontrol etmek için kullanılabilir ve bu sayede sistemin daha tutarlı olmasını sağlar.
Sonuç
Bu makalede, MySQL tetikleyicilerinin nasıl oluşturulacağını ve kullanılacağını anlatan bir dizi örnek incelendi. Veritabanı işlemlerinin daha etkili ve özelleştirilebilir hale getirilmesini sağlayan tetikleyiciler, örneklerle detaylı bir şekilde açıklanmıştır. “kitap_before_update” tetikleyicisi ile güncellemelerin kitap sayfasına bağlı olarak öğrenci puanlarını otomatik güncelleme örneği ve “islem_before_insert” tetikleyicisi ile öğrencinin alınan ancak iade edilmemiş kitaplarını kontrol eden bir örnek sunulmuştur. Bu tetikleyiciler, veritabanı yönetiminde daha fazla kontrol ve bütünlük sağlamak için kullanılabilirler.
Yorum Yap