Ne kadar uzun zamandır yazmadığımı farkedince, kendime çeki düzen verip işe yarayacak bir tutorial yazayım dedim. Hem de birçok kişinin bir zamanlar MySQL'i ezik bulma nedeniyle ilgili. 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.
Bunları boşverip, işe başlayalım:
TRIGGER NEDİR? İ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:

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 ü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.
-
DELIMITER |
-
CREATE TRIGGER mytrigger AFTER INSERT ON comments
-
FOR EACH ROW BEGIN
-
UPDATE posts SET count = count + 1 WHERE id = NEW.parent_id;
-
END;
-
| 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 ![]()
Kategori?



Made on a
maalesef hostumda 4.x versiyonu var. Deneyebilmem localde mümkün ama kullanılacak birşey geliştiremiyorum
tirigırz, tirigırz...
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.
Bazen baş ağrısına sebebiyet veren ama doğru yerde doğru şekilde kullanıldığındaysa harikalar yaratan, benim aklımı kaybetmemi sağlayan triggerlar. ayrıca javamın belirttiğinden farklı dezevantajları da vardır.
mysql dedinmi kaçacaksın, beni hayatımdan bezdiren mysql trigger yazımı oldukça karışık mssql bu onularda daha başarılı kanımca yada ben onda rahat yazıyorum
MySQL'de trigger ve SP kullanımı karmaşık olduğu gibi, faydaları da diğer veritabanlarına oranla çokta fazla değil.
Kendi araştırmalarımda, bazı yabancı forumlarda MySQL'de stored procedure ya da trigger kullanma gafletine düşmüş geliştiricilerin haykırışlarıyla dolu epey konu görmüştüm
Güzeldir kendileri aslında, dendiği gibi gerekli yerlerde ve gerçekten yapıya hakim olunduğunda sizi bir çok zahmetten kurtarabilecek bişeydir trigger denilen abimiz. bende kod yazmanın keyfini katlatırlar kendileri ihtiyacım olduğunda ...
MySql bilmiyorum şahsen ama trigger abime laf ettirmem ona göre
Ben hep MSSQL kullandım ama yukarıdaki örnekten çıkarabildiğim şey şu ki: MySQL ile trigger yazmak daha kolay! Özellikler OLD ve NEW çok güzel.
Bu arada Burcu hanım "farkedince" kelimesini "farketince" şeklinde yazdığınızı "farkettiniz" mi? Belki "farketmeden" yazmışsınızdır ama ben bunu yazdıktan sonra "farkedersiniz".
hahah nası farkettin sen onu yahu ..
evet new ve old benimde çok hoşuma gitti ama ondan daha güzeli , AFTER BEFORE anahtarları çok güzel...
Bakalım 2008 modelinde sql server'ın bu anlamda yenilikler olacak mı ?
rp, teşekkür ederim hemen düzelttim.
Aslında trigger hayranı değildirim, pek fazla da kullanmam. Özellikle mysql'de bazı durumlarda çok baş ağrıtıcı olabiliyor. Bazı kısıtlamaları var ayrıca, SELECT yapamıyoruz bunların içinde
Aslında select için fonksiyon yazıp bu fonksiyonu çağırsak trigger'da
Bilişimde çare tükenmez 
Bildiğim kadarıyla mysql'de fonksiyonlarda ve triggerlarda yapacabileceğiniz şeylerin sınırı aynı. Yani bu durumda fonksiyonlarda da select yapamıyoruz.
#
CREATE TRIGGER mytrigger AFTER DELETE ON comments
#
FOR EACH ROW BEGIN
#
UPDATE posts SET count = count - 1 WHERE id = NEW.parent_id;
#
END;
-

buda yorum sildiginizde , count'u 1 eksilten kod
m00dy, silerken artık OLD kelimesini seçiyoruz.
MySQL sevmiyorum; zira RDBMS olarak değil, oyuncak web veritabanı olarak görüyorum MySQL'i. Bence web için harika; ama çok karmaşık web siteleri ya da "gerçek" programlar için, doğru dürüst bir RDBMS lazım. Mesela, Postgresql, open source olarak. Firebird'den emin değilim. Ayrıca, benchmarklar da şişirme. Biraz Gentoo'cuların "abi tüm dağıtımlardan 50 kat hızlı çalışıyor icabında" gibi,zekadan uzak önermelerine benziyor Mysql'in uçtuğunu iddia etmek.
Evet 5+dan sonrası belki blog, forum vs için zevkli olabilir ama maddi kısıt varsa postgresql gibi bir sanat eseri vardır. Hatta bir ara MySQL community'nin çıkmasıyla yeni versiyonların kısıtlı olarak dağıtılımı yapılacağı söylemi vardı. Herkes postgresql'e döner diye sevinç yaşanmıştı ama öyle birşey olmadı.
bence sallapati yorumlar yapmamak lazim. oyuncak veritabani dediginiz bu veritabani, dunyanin veritabani olarak en ciddi yuku barindiran sitelerinden biri olan facebook'u ta$iyor.
millet olarak cok ragbet goreni sevmeme, di$lama gibi bir anlayi$imiz var. konumuzla alakali olmasada bu tip konular tv8 de el ustunde tutulan $ahan'in atv ye gectikten sonra ta$lanmasina benziyor.
Google aramalarında Mysql Trigger kelimesinde ilk sırada çıkıyor siten :p
Yazı için teşekürler,
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
Bu adresten daha detaylı bilgiyi bulmak mümkün.
MySQL 5.0 İLE PROCEDURE yazmak için önereceğin herhangibir kod kitabı varmı