MySQL ve Triggerlar
MySQL 5. 0 alpha'ya kadar trigger desteği bulunmayan bir veritabanı yönetim sistemi olduğundan çoğu kez bu nedenle çocukça bir uğraş olarak görülmüştür - abartmıyorum. Yeni sürümlerine entegre edilen trigger desteği sayesinde MySQL severler oldukça büyük bir huzura kavuşmuştur
İlk cevaplamamız gereken soru bu. Trigger'lar ilişkisel veri tabanlarıda belirli bir olay/durum ortaya çıktığında belirli bir işin yapılmasını sağlayan özelliklerdir. Bu işler daha önce yaratılmalı ve veritabanında saklanmalıdır.
Peki, bu prosedür ve işlemleri nerede kullanabiliriz? Hemen, örnek bir olay yaratalım. Mesela bir blogumuz olsun ve bu blogda yazıları ve yorumları tutan iki tane tablo olsun. Yazılar tablosunun aşağıdaki yapıda olduğunu farzedelim:
Posts Tablosu
Yazılar dışında bir de yorumları sakladığımız bir "comments" tablosu var demiştim. Bu tablonun yapısı ise basitçe aşağıdaki gibi olsun.
Comments tablosu
Comments üzerindeki parent_id, posts tablosundaki id'yi referans ediyor ve yorumun hangi yazı için yazıldığını belirliyor. Blogumuza her yeni yorum eklendikten sonra posts tablosundaki "count"un artması isteriz, her yorum silindiğinde ise azaltılmasını. Böyle bir durumda programlamaya başvurarak bu işi halledebiliriz, ama program dışında birileri direkten database üzerinden bir yorum silmek isterse, ayrıca manuel olarak "count" değerini de değiştirmesi gerekecektir. Bu işkenceye son vermek amacıyla trigger'lar yaratılabilinir. Aşağıda her yorum eklendiğinde ona ait yazının count'unu bir arttıran bir trigger nasıl yaratılır bunu inceleyeceğiz.
PLAIN TEXT
SQL:
1.
DELIMITER |
2.
CREATE TRIGGER mytrigger AFTER INSERT ON comments
3.
FOR EACH ROW BEGIN
4.
UPDATE posts SET count = count + 1 WHERE id = NEW.parent_id;
5.
END;
6.
| DELIMITER ;
Gördüğünüz trigger yaratma sorgusunda ilgi çeken ana hatlardan ilki "AFTER INSERT ON", bu sayede yeni yorum eklendikten sonra yapılacak bir işlem belirlemek istediğimizi belirtiyoruz. Bu anahtar kelimenin birçok versiyonu mevcut. Bu sayede hangi işlemden (DELETE, UPDATE, INSERT) önce/sonra (AFTER/BEFORE) ne yapılmasını istediğimizi emredebiliyoruz.
İkinci ilginç ve yeni kelime "NEW". NEW yeni eklenen satırı referans ediyor. Bu sayede yeni satırın istediğiniz özelliğine ulaşabiliyorsunuz. Silmelerde "NEW" yerine "OLD" kullanıldığını da ekleyeyim.
İşte hepsi bu kadar, bu trigger yaratıldıktan sonra, her yorum eklenişinde sizin programlamanız gereken kısım otomatik olarak veritabanı tarafından halledilecektir.
İlk alıştırma olarak, bu örnekte basitçe bir eklediğimiz "count"u yeniden saymayı deneyebilirsiniz. Her eklenişte ve silinişte aslında en mantıklısı yeniden tüm o yazıya ait yorumları saymaktır, ama ben kolaya kaçıyorum
tirigırların dez avantajlarıda var; olay ve tablo bazında sadece bir tirigır kullanabilirsiniz, ayrıca bu tirigırada birden fazla olay ekleyemezsiniz