MySQL’de Trigger Kullanımı

Bu makalede sizlerle MySQL’de trigger’ların nasıl kullanıldığını ve amacını konuşacağız. Eğer MySQL’de neden trigger kullanmalıyım sorusuna cevap arıyorsanız kendinize şu soruyu sormanız gerek. Herhangi bir insert, update ya da delete işleminden sonra bir işlem yaptırmak ister miydiniz? Benim anlatacağım senaryoda, posts adında bir tablom olsun. Bu tabloda makalelerimi tutuyorum. Ve makaleyi güncellediğimde, eski versiyonunu revisions tablosuna post id’si ile birlikte kaydetmek istiyorum.

İşte tam olarak bu aşamada bir trigger yazmamız gerek tabi eğer bu işlemi mysql’de çözmek istiyorsak. Yok arkadaş ben PHP’de if ($insert) ise o zaman şuraya $db->query() yazarım diyorsan o senin ameleliğin olur, bir şey diyemem ????

Şimdi gelelim bu trigger’ları oluşturmak nasıl oluyor. Temel anlamda bir trigger’ın ihtiyacı olan syntax şudur;

DELIMITER $$
CREATE TRIGGER [trigger_adi] [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON [tablo_adi]
    FOR EACH ROW 
        BEGIN
            -- işlemler
        END$$
DELIMITER ;

Burada DELIMITER $$ ve kısımları, mevcut delimiter’ı $$ ile değiştirmemizi yarıyor. Çünkü defualt olarak ; (noktalı virgül) olduğundan biz trigger içinde herhangi bir noktalı virgül kullanınca kodlar patlıyor. Bu yüzdendir ki bir bütün olarak yorumlanması için delimiter’ı değiştirip $$ yapıyoruz ve END kısmının bitişine noktalı virgül yerine $$ koyuyoruz.

Şimdi gelelim bizim senaryoya. Tablomuz posts tablosuydu ve kolonlarımız id, title ve content olsun. Birde revisions diye bir tablom vardı aynı şekilde id, post_id, title, content, created_at kolonlarına sahip olsun. Şimdi ben posts tablosunda bir veri güncellendiğinde, eski halini revisions tablosuna kaydedecek bir trigger yazmak istiyorum. Nasıl yazarım?

DELIMITER $$
CREATE TRIGGER after_post_update AFTER UPDATE ON posts
    FOR EACH ROW 
        BEGIN
            IF NEW.title != OLD.title OR NEW.content != OLD.content THEN
                INSERT INTO revisions SET post_id = OLD.id, title = OLD.title, content = OLD.content;
            END IF;
        END$$
DELIMITER ;

Burada OLD ve NEW diye anahtarlar gördünüz. Eğer INSERT için trigger yazıyorsak sadece NEWUPDATE için yazıyorsak OLD ve NEWDELETE için yazıyorsak sadece OLD anahtarlarını kullanarak eski ve yeni değerlere ulaşabiliyoruz. Yani trigger’daki OLD.title, update olmadan önceki title değerini, NEW.title update olduktan sonraki title değerini temsil ediyor. Dolayısı ile biz trigger’da şunu yaptık, eğer eski başlık yeni başlıktan farklı ise ya da eski içerik yeni içerikten farklı ise o zaman revisions tablosuna bunu kaydet.

Mevcut trigger’ları görmek isterseniz şu komutu kullanabilirsiniz;

SHOW TRIGGERS;

Oluşturduğunuz trigger’ı kaldırmak için ise;

DROP TRIGGER [trigger_adi]

“MySQL’de Trigger Kullanımı” için 3 yorum

  1. Merhaba Hocam,

    Sade ve faydalı bir paylaşım olmuş. Teşekkür ederim. Benim sormak istediğim şey ise trigger nerede kullanıp nerede kullanmamız gerektiği konusunda. Nasıl kullanırsak faydalı olur, nerede zarar olur? Teşekkürler.

    1. ben soru cevap sitesinde, soru güncellendikten sonra onun revizyonlarını tutmak için trigger’ı kullanıyordum. Bu gibi durumlarda kullanabilirsiniz, sizi ekstra kod yazma zahmetinden kurtarır 🙂

      1. Ben trigger’ı başvuru aldığım bir sistemde başvuru analizlerini tutarken kullanıyorum. Başvuru bilgileri bir tabloda, analiz için bir başka tabloda da gün bilgilerini if kontrolü yapıp varsa artır yoksa ekle mantığı ile kullanıyorum. Bir de başvuru yapan kişinin statü durumu değişince başka bir tabloya o kişinin datasını taşımada kullanıyorum. Mesela başvuru yapan kişi aday kabul edilirse, statü aday olarak update edilince o kişinin kaydını başvurudan aday tablosuna aynen alıp, başvuru tablosundan kendisini sildiriyorum. Php de bağlan, kontrol et, sil güncelle için her seferinde iletişim git geli yapmak yerine tek bir komut yollayıp gerisini MySQL e bırakıyorum. Bu da cevap sürelerini gözle görülür bir şekilde artırıyor.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir