Eyl 13   MySQL ve Triggerlar

Tags Kategori? Veritabanı

AraçlarNe 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:

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.

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 :D

Yorum Ekleyin ↓

Required Adınız (gerekli)
Required Email (görüntülenmeyecek - gerekli)
Blog / Website? (varsa)

KISA BİR NOT: Lütfen yorumlarıza özen gösterin, tartışma yaratmak için provake edilmiş yorumları silmekten büyük bir zevk aldığımızı unutmayın. Fikrinizi bağırın ama onun arkasında durabilcek gerekçeleriniz olsun. - Bir dost...

19 Yorum ↓

Farklı bakış açılarının var olduğu bir dünyayı destekleyen bir blog olarak bize fikir hocalığı yapmaktan kaçınmamanızı ve yazmaya değer bulduklarınızın altına birşeyler eklemeyi unutmamanızı yürekten diliyoruz.
  •  Add karma Subtract karma +0
    1. save a life @ [13/09/2007]

    maalesef hostumda 4.x versiyonu var. Deneyebilmem localde mümkün ama kullanılacak birşey geliştiremiyorum :evil:

  •  Add karma Subtract karma +0
    2. javam @ [13/09/2007]

    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. :?

  •  Add karma Subtract karma +0
    3. Hüseyin Arkın @ [13/09/2007]

    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.

  •  Add karma Subtract karma +0
    4. Tan @ [14/09/2007]

    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 :o

  •  Add karma Subtract karma +0
    5. Berker PEKSAĞ @ [14/09/2007]

    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 :)

  •  Add karma Subtract karma +0
    6. Hakan @ [14/09/2007]

    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 8O

  •  Add karma Subtract karma +0
    7. rp @ [14/09/2007]

    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".

  •  Add karma Subtract karma +0
    8. hakan @ [14/09/2007]

    hahah nası farkettin sen onu yahu .. :D

    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ı ?

  •  Add karma Subtract karma +0
    9. Burcu @ [14/09/2007]

    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 :?

  •  Add karma Subtract karma +0
    10. Tan @ [14/09/2007]

    Aslında select için fonksiyon yazıp bu fonksiyonu çağırsak trigger'da :roll: Bilişimde çare tükenmez :D

  •  Add karma Subtract karma +0
    11. Hüseyin Arkın @ [15/09/2007]

    Bildiğim kadarıyla mysql'de fonksiyonlarda ve triggerlarda yapacabileceğiniz şeylerin sınırı aynı. Yani bu durumda fonksiyonlarda da select yapamıyoruz.

  •  Add karma Subtract karma +0
    12. m00dy @ [19/09/2007]

    #
    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
    :P :P :P :P :P :P :P :P :P :P

  •  Add karma Subtract karma +0
    13. Burcu @ [4/11/2007]

    m00dy, silerken artık OLD kelimesini seçiyoruz. :D

  •  Add karma Subtract karma +0
    14. barış atasoy @ [26/11/2007]

    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.

  •  Add karma Subtract karma +0
    15. Burcu @ [26/11/2007]

    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ı.

  •  Add karma Subtract karma +1
    16. dunpeal @ [7/12/2007]

    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.

  •  Add karma Subtract karma +2
    17. Tan @ [11/01/2008]

    Google aramalarında Mysql Trigger kelimesinde ilk sırada çıkıyor siten :p

  •  Add karma Subtract karma +2
    18. Orhan DOĞAN @ [25/03/2008]

    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.

  •  Add karma Subtract karma +0
    19. Mustafa @ [30/03/2008]

    MySQL 5.0 İLE PROCEDURE yazmak için önereceğin herhangibir kod kitabı varmı