Trigger (Tetikleyici) Nedir ? Nasıl Kullanılır ?

Çarşamba, Mart 04, 2015 kustemura 0 Yorum

Bu yazımda TRIGGER'ları MYSQL kullanarak inceleyeceğiz.
INSERT , UPDATE , DELETE işlemlerinin gerçekleşmesi halinde devreye girebilen STORED PROCEDURE(SAKLI YORDAM) yapısıdır.Hassas verilerin değişiminin veritabanında kayıtlarını tutmayı , gerek eski haline getirmek ,gerek ise oluşan durumlara göre belirlediğimiz işlemleri yapabilmemizi sağlar.

TRIGGER çalışmaya başlamadan önce bir TRANSACTION açılır.TRANSACTION konusuna burada detaylı olarak girmiyorum.Fakat temel bir şekilde kullanımı şu şekilde gerçekleşiyor.Eğer TRIGGER bloğunda bir ROLLBACK  var ifadesi çalıştırılırsa oluşan durumlarda son işlem geçersiz olur ve yapılan işlemler eski haline dönderilir , eğer yok ise otomatik olarak COMMIT yapılır ve işlem gerçekleştirilir.Bunu şöyle örnekleyelim ; örneğin bir ATM'den birisine para transferi yapıyorsunuz,para hesabınızdan düştü fakat gönderdiğiniz kişinin hesabına para ulaşmadı.İşte bu durumlarda TRANSACTION devreye giriyor ve yaptığı kontrol ile parayı sizin hesabınıza tekrar yatırıyor.


  • INSERT işleminde sadece NEW kullanılır.
  • UPDATE işleminde hem NEW hem de OLD kullanılır.
  • DELETE işleminde ise sadece OLD kullanılır.

Syntax'ı (Yazım Kuralı):


CREATE [ DEFINER={ < kullanici adı >} | CURRENT_USER} ] TRIGGER < trigger adı >
{ BEFORE | AFTER }
{ UPDATE | INSERT | DELETE }
ON < tablo ad >
FOR EACH ROW
BEGIN
..
…
END ; 
Örnek bir uygulama ile daha anlaşılır bir hale getirelim.
Yapılan INSERT ve DELETE işlemlerinde tetiklenecek birer TRIGGER oluşturalım. Bir futbol takımı için mülakat seçimi yapılsın ,  eğer ki jürinin verdiği puanlarla toplamda 85 puanın üzerinde olan kişileri futbol takımına aldığımızı varsayalım.Takım alınan her kişiye otomatik olarak 1-100 arasında takım numaraları verilmektedir.Daha sonra takımdan ayrılanları da belirtelim.


Öncelikle tablolarımızı oluşturuyoruz ;
CREATE TABLE mulakat_listesi (tcno INT NOT NULL,isim VARCHAR(20),soyisim VARCHAR(20),
mulakat_puani INT,PRIMARY(tcno));
Mülakat listesine katılan kişilerin tcno , isim , soyisim ve mülakattan aldıkları puan için mulakat_puani field alanlarını tanımladık.
CREATE TABLE futbol_takimi(takimno INT NOT NULL,ad VARCHAR (20),soyad VARCHAR(30),
tarih TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Futbol takımına seçilecek olan kişiler için futbol_takimi tablosunda her bir kişinin bir takimno , ad , soyad ve tarih field alanlarını tanımladık.
CREATE TABLE ayrilan (ayrilan_isim VARCHAR(20),ayrilan_soyisim VARCHAR(20),
giris_tarih VARCHAR(100),ayrilma_tarih TIMESTAMPS NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Takımdan ayrılanları tutacağımız ayrilan tablosunda ayrilan_isim , ayrilan_soyisim , giris_tarih ve ayrilma_tarih field alanlarını tanımladık.


Ardından TRIGGER'ımızı oluşturuyoruz.

DELIMITER $$

CREATE TRIGGER takima_girmek
 BEFORE INSERT ON mulakat_listesi
  FOR EACH ROW
   BEGIN
    IF(NEW.mulakat_puani>85) THEN
     INSERT INTO futbol_takimi (takimno,ad,soyad) VALUES  ((FLOOR(RAND()*100)),NEW.isim,NEW.soyisim);
    END IF;
   END;$$ 
Burada yapmış olduğumuz şey , eğer seçmelerde mülakat puanı 85'ten yüksek olan bir kişi var ise  bu kişinin bilgilerini alıp , 1 ile 100 arasında bir takım numarası verip , futbol takımı tablosuna eklemek.Bu TRIGGER'ı oluşturup çalıştırdığımızda sistem bizim yerimize TRIGGER koşulunu sağlayan durumda bu işlemleri gerçekleştirecektir.
DELIMITER $$


CREATE TRIGGER ayrilma_islemi
 AFTER DELETE ON futbol_takimi
  FOR EACH ROW
   BEGIN
    INSERT INTO ayrilan (ayrilan_isim,ayrilan_soyisim,giris_tarih)
    VALUES(OLD.ad,OLD.soyad,OLD.tarih);
   END;$$
Burada ise eğer takımdan ayrılan olursa bu kişinin adını , soyadını takıma giriş tarihini ve çıkış tarihini ayrılan tablosuna ekliyor.

0 yorum :