MySQL'de Trigger Kullanımı

Merhaba,

Bu yazımda mysql de trigger kullanımından bahsedeceğim.

Aslında nasıl anlatacağıma tam karar veremedim. Sanırım en iyisi bir örnek üzerinden anlatmak olacak.

Diyelim ki büyük bir sistem kodluyorsunuz. Bu sistem içinde arama diye bir kısım var. 

Bu arama işlemi çok farklı  sonuçlar getirecek. Farklı tablolardan farklı içerikleri alarak kullanıcıya gösterecek.

Bu işlem için UNION kullanılabilir. Fakat tablo sayısı ve içerik artmaya başladıktan sonra sorguda bir yavaşlama olacaktır. 

Düşünsenize 5 - 6 adet tablodan UNION ile veri çekiyorsunuz.

Bu çok mantıklı bir çözüm yolu gelmiyor. 

Sanırım burada yapılabilecek en iyi şey yeni bir tablo oluşturmak ve arama işleminde kullanacağız tablolardaki her CRUD işleminden sonra bir TRIGGER ile bu tabloya aktarmak.

Biraz karışık gelmiş olabilir. Hemen basit bir örnek ile detaylandıralım.

  • Haberleri tuttuğumuz bir tablomuz olsun.
    • Haberler tablomuzda, haber_id, haber_baslik,  haber_link gibi sütunlarımız bulunsun
  • Arama işlemi yapmak için ise
    • arama adında başka bir tablo oluşturalım.
    • arama_id, arama_haber_id, arama_haber_baslik, arama_haber_link gibi sütunlara sahip olsun.

 

Şimdi gelelim en güzel kısma. Biz bir haber eklediğimiz zaman otomatik olarak arama tablosuna da eklenmesini isteyelim. Yazacağımız trigger aşağıdaki gibidir. 
 

DELIMITER  $$

CREATE  TRIGGER  haber_ekle_trigger

AFTER INSERT ON  haberler

FOR EACH ROW 

BEGIN 

    INSERT INTO   arama

                                           SET   arama_haber_id  = NEW.haber_id, 

                                                     arama_haber_baslik = NEW.haber_baslik,   

                                                     arama_haber_link  = NEW.haber_link; 

END$$;

DELIMITER  ;

 

Şimdi yukarıdaki kodları biraz açalım.

Mysql'de trigger oluşturmak için DELIMITER  yazıp ardından bir boşluk bırakıp $$ işaretlerini yazıyoruz. Aslıdan burada başlangıcımızı belirtiyoruz. 

Ardından CREATE TRIGGER ile haber_ekle_trigger adında bir trigger oluşturuyoruz. 

AFTER INSERT ON haberler satırı ile haberler tablosuna her insert yapıldığında komutunu veriyoruz.

FOR EACH ROW adından  da anlaşılabileceği gibi her bir satır için

BEGIN ile başlıyoruz. 

 

  INSERT INTO   arama

                                           SET   arama_haber_id  = NEW.haber_id, 

                                                     arama_haber_baslik = NEW.haber_baslik,   

                                                     arama_haber_link  = NEW.haber_link; 

 

arama tablosuna, eleman ekleme işlemi gerçekleştiriyoruz. 

Buradaki NEW parametresi, adından da anlaşılacağı üzere haberler tablosuna her yeni eklemedeki değerleri işaret eder. Yeni haber_id 'yi  arama_haber_id'ye atıyoruz mesela..

Sanırım anlaşılmıştır. 

 

----------------------------------------------------------------------

 

Geçelim güncelleme işlemine. Diyelim ki haberler tablosundaki içerik güncellendi. O zaman ne yapacağız. Bir trigger ile bu işi çözeriz aslında. :)

 

DELIMITER  $$

CREATE  TRIGGER   haber_guncelle_trigger 

 AFTER UPDATE  ON  haberler 

FOR EACH ROW

BEGIN

    IF 

                   NEW.haber_baslik   !=   OLD.haber_baslik       OR        NEW.haber_link   !=   OLD.haber_link
   
    THEN
    
                      UPDATE     arama  SET   

                                                            arama_haber_baslik  =  NEW.haber_baslik,
                                                            arama_haber_link       = NEW.haber_link
                                        
                                                         WHERE
                                                                        arama_haber_id = OLD.haber_id;
     

   END IF;

END$$;

DELIMITER 

 

 

Şimdi gelelim yukarıdaki kodları açıklamaya. 

Zaten IF ifadesine kadar anlamışsınızdır diye tahmin ediyorum. haber_guncelle_trigger adında bir trigger oluşturuyoruz. Ne zaman? haberler tablosu her UPDATE olduğunda.

Şimdi karışık gelecek kısım IF içerisi olabilir. Aslında o da basit. 

NEW ile OLD 'u anlatmaya gerek yoktur sanırım. Eski başlık ile yeni başlık  ve eski haber linki ile yeni haber linki karşılaştırılıyor. 

Bunlardan birtanesi bile aynı değil ise arama tablomuzu güncelliyoruz.

 

----------------------------------------------------------------------

 

Şimdi gelelim silmeye. Sistemi yöneticek kişi haberi silmiş olabilir. Biz aramalarda bu haberi gösterirsek olmaz değil mi? Eğer düzgün kod yazdıysak devamlı 404 NOT FOUND hatasına düşeriz ( ! )

O zaman başlayalım silme işlemi için bir trigger yazmaya.

 

DELIMITER $$

CREATE TRIGGER   haber_sil_trigger

AFTER DELETE   on  haberler 

FOR EACH ROW 

BEGIN

    DELETE   FROM    arama WHERE     arama_haber_id  =   OLD.haber_id; 
    
 END$$;
 
 DELIMITER  ;

 

 

Sanırım kod kendini anlatıyor. 

Bir trigger tanımlıyoruz. haberler tablosundan her bir içerik silindikten "sonra",   arama  tablosundan da bu içeriği siliyoruz.

 

Bu arada belirtmeden geçmeyeyim. Ben bu işlemleri haberler tablosunda yapılması gerekenleri yaptıktan sonra arama tablosuna aktarıyorum. Siz isterseniz habler tablosunda işlem yapmadan hemen önce de yaptırabilirsiniz. 

Bunun için kullanmanız gereken sözcük BEFORE :)) 

Mesela silme işlemini örnek olarak yazalım. 
 

DELIMITER $$

CREATE TRIGGER   haber_sil_trigger

BEFORE  DELETE   on  haberler 

FOR EACH ROW 

BEGIN

    DELETE   FROM    arama WHERE     arama_haber_id  =   OLD.haber_id; 
    
 END$$;
 
 DELIMITER  ;


 

Evet, hepsi bu kadar.

Ben kaçar..

 

 

 

1293 Görüntülenme

Yorum Yap