MySQL'de Trigger (Tetikleme) ve Gelişmiş Log (Kayıt) Tutma Yöntemi

Daha önce yazdığım SQL Server için gelişmiş log tutma yönetiminin MySQL versiyonu ile trigger işlemlerini detaylı bir şekilde ele alalım.

Yeni bir makale ile karşınızdayız. Önceden de belirttiğim üzere SQL Server'da Trigger (Tetikleme) ve Gelişmiş Log (Kayıt) Tutma Yöntemi adlı yazıya istinaden aynı yapının MySQL versiyonu ile ilgili talep geldi. Bunun üzerine kısa bir çalışma hazırlayarak bu konuyu MySQL içinde açığa kavuşturmuş olduk.
Konuya küçük bir giriş yaptıktan sonra kodlama kısmına başlayalım.
Basit düzeyde yapılmış bir öğrenci okul not sistemi üzerinden işleyişi anlatacağım. Öncelikle olarak tablolarımızı oluşturalım.
tblDersler Tablosu
CREATE TABLE tblDersler
(
ders_ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
ders_adi VARCHAR(255),
yil INT,
birinci_sinav_notu INT,
ikinci_sinav_notu INT
)

tblDersler Tablosu Görünümü
MySQL Trigger, Gelişmiş Log

Tablomuzu oluşturduk. Sonrasında log tutacağımız tabloyu da benzer sütunlarla oluşturacağız. Tabi bu noktada birkaç farklılık olacak, tablo üzerinde insert-update-delete vs.. gibi işlemler yapılırken oturum açan kullanıcının bilgilerini de kayıt altına alalım ki istatistiksel olarak da elimizde hatırı sayılır kayıt olmuş olur.
Dersler Log Tablosu
CREATE TABLE tblDersler_Log
(
ders_ID INT,
ders_adi VARCHAR(255),
yil INT,
birinci_sinav_notu INT,
ikinci_sinav_notu INT,
log_ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
log_islem VARCHAR(30),
log_tarih TIMESTAMP NOT NULL DEFAULT NOW(),
log_olusturan VARCHAR(100),
log_ip VARCHAR(20)
)
tblDersler_Log Tablosu
MySQL Trigger, Gelişmiş Log


Insert İşlemini Loglayalım

tblDersler tablosuna bir kayıt (insert) işlemi gerçekleştirelim. Insert işlemi öncesinde bu kaydın kopyasından tblDersler_Log tablosuna da ekleyelim.
tblDersler Tablosuna Insert Öncesi Trigger Yazalım
CREATE TRIGGER trgDersler_Before_Insert BEFORE INSERT ON tblDersler
FOR EACH ROW
BEGIN
 DECLARE ip VARCHAR(20);
 SELECT SUBSTRING_INDEX(host,':',1) INTO ip FROM information_schema.processlist WHERE ID=connection_id();
 INSERT INTO 
 tblDersler_Log 
 (ders_ID, ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu, log_islem, log_tarih, log_olusturan, log_ip)
 VALUES 
 (NEW.ders_ID, NEW.ders_adi, NEW.yil, NEW.birinci_sinav_notu, NEW.ikinci_sinav_notu, 'Insert Öncesi', NOW(), CURRENT_USER(), ip);
END

Oluşan Trigger'ı görsel olarak paylaşalım.
trgDersler_Before_Insert Trigger'ı
MySQL Trigger, Gelişmiş Log

tblDersler tablosuna bir kayıt (insert) işlemi gerçekleştirelim. Insert işlemi sonrasında bu kaydın kopyasından tblDersler_Log tablosuna da ekleyelim.
tblDersler Tablosuna Insert Sonrası Trigger Yazalım
CREATE TRIGGER trgDersler_After_Insert AFTER INSERT ON tblDersler
FOR EACH ROW
BEGIN
  DECLARE ip VARCHAR(20);
  SELECT SUBSTRING_INDEX(host,':',1) INTO ip FROM information_schema.processlist WHERE ID=connection_id();
  INSERT INTO 
  tblDersler_Log 
  (ders_ID, ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu, log_islem, log_tarih, log_olusturan, log_ip)
  VALUES 
  (NEW.ders_ID, NEW.ders_adi, NEW.yil, NEW.birinci_sinav_notu, NEW.ikinci_sinav_notu, 'Insert Sonrası', NOW(), CURRENT_USER(), ip);
END

Oluşan Trigger'ı görsel olarak paylaşalım.
trgDersler_After_Insert Trigger'ı
MySQL Trigger, Gelişmiş Log

Oluşan bu Trigger'ı test etmek için tblDersler tablosuna birkaç veri girelim.
tblDersler Tablosu Insert
INSERT INTO tblDersler
(ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu)
VALUES
('Matematik', 2002, 54, 71)

INSERT INTO tblDersler
(ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu)
VALUES
('Türkçe', 2002, 66, 57)

INSERT INTO tblDersler
(ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu)
VALUES
('İngilizce', 2002, 81, 87)
tblDersler Tablosuna Girilen Değerler
MySQL Trigger, Gelişmiş Log

Insert Sonrası tblDersler_Log Tablo Kayıtları
MySQL Trigger, Gelişmiş Log

Update İşlemini Loglayalım

Bu işlem için şöyle örnek verelim. Girilen bir kaydın birinci_sinav_notu değerini birkaç kez değiştirelim. Değiştirdiğimiz her kaydı ayrı ayrı kayıt olarak tblDersler_Log tablosuna işleyelim.
tblDersler Tablosunda Update Öncesi Loglama Yapalım
CREATE TRIGGER trgDersler_Before_Update BEFORE UPDATE ON tblDersler
FOR EACH ROW
BEGIN
  DECLARE ip VARCHAR(20);
  SELECT SUBSTRING_INDEX(host,':',1) INTO ip FROM information_schema.processlist WHERE ID=connection_id();
  INSERT INTO 
  tblDersler_Log 
  (ders_ID, ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu, log_islem, log_tarih, log_olusturan, log_ip)
  VALUES 
  (OLD.ders_ID, OLD.ders_adi, OLD.yil, OLD.birinci_sinav_notu, OLD.ikinci_sinav_notu, 'Update Öncesi', NOW(), CURRENT_USER(), ip);
END

Oluşan Trigger'ı görsel olarak paylaşalım.
trgDersler_Before_Update Trigger'ı
MySQL Trigger, Gelişmiş Log

tblDersler Tablosunda Update Sonrası Loglama Yapalım
CREATE TRIGGER trgDersler_After_Update AFTER UPDATE ON tblDersler
FOR EACH ROW
BEGIN
  DECLARE ip VARCHAR(20);
  SELECT SUBSTRING_INDEX(host,':',1) INTO ip FROM information_schema.processlist WHERE ID=connection_id();
  INSERT INTO 
  tblDersler_Log 
  (ders_ID, ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu, log_islem, log_tarih, log_olusturan, log_ip)
  VALUES 
  (NEW.ders_ID, NEW.ders_adi, NEW.yil, NEW.birinci_sinav_notu, NEW.ikinci_sinav_notu, 'Update Sonrası', NOW(), CURRENT_USER(), ip);
END

Oluşan Trigger'ı görsel olarak paylaşalım.
trgDersler_After_Update Trigger'ı
MySQL Trigger, Gelişmiş Log

Oluşan trigger'ı test etmek için şöyle yapalım. 2002 yılındaki İngilizce dersinin 81 olan birinci_sinav_notu değerini ilk olarak 44 yapalım. Sonrasında ise 91 olarak güncelleyelim.
tblDersler_Log Tablosu Update Sonrası Kayıtlar
MySQL Trigger, Gelişmiş Log

Delete İşlemini Loglayalım

Bu işlemi ise yanlışlıkla silinen verileri kayıt altına almak için tblDersler_Log tablosuna kayıt edelim.
tblDersler Tablosunda Delete Öncesi Loglama Yapalım
CREATE TRIGGER trgDersler_Before_Delete BEFORE DELETE ON tblDersler
FOR EACH ROW
BEGIN
  DECLARE ip VARCHAR(20);
  SELECT SUBSTRING_INDEX(host,':',1) INTO ip FROM information_schema.processlist WHERE ID=connection_id();
  INSERT INTO 
  tblDersler_Log 
  (ders_ID, ders_adi, yil, birinci_sinav_notu, ikinci_sinav_notu, log_islem, log_tarih, log_olusturan, log_ip)
  VALUES 
  (OLD.ders_ID, OLD.ders_adi, OLD.yil, OLD.birinci_sinav_notu, OLD.ikinci_sinav_notu, 'Delete Öncesi', NOW(), CURRENT_USER(), ip);
END

Oluşan Trigger'ı görsel olarak paylaşalım.
trgDersler_Before_Delete Trigger'ı
MySQL Trigger, Gelişmiş Log

Oluşan bu Trigger'ı test etmek için tblDersler tablosunda ders_ID = 2 olan kaydı silelim.
tblDersler Tablosu Delete
DELETE FROM tblDersler WHERE ders_ID = 2

tblDersler Tablosu Delete Sonrası Kayıtlar
MySQL Trigger, Gelişmiş Log

tblDersler_Log Tablosu Delete Sonrası Kayıtlar
MySQL Trigger, Gelişmiş Log

Görüldüğü gibi yapılan bütün işlemleri basit düzeyde kayıt altına almış olduk.

Yorumlar

  • HTML Meraklısı

    HTML Meraklısı:

    2 hafta önce

    Bana html ile kayıt olup giriş yap diyerek girme ve kullanıcıların listesi lazım. Banlayacağım zaman yada biri şifresini unuttuğu zaman listeden bakıp kişinin kaybettiği şifreyi verebileceğim bir kod lazım
    -1 cevapla
  • Yönetici Yorumu:

    1 hafta önce

    Öncelik ilginiz için teşekkürler. İstediğiniz konuda bir makale hazırlamak biraz zaman alıyor açıkcası. Bu konuda sizler biraz ilerledikten sonra sorunlarınızı bize iletirseniz biz daha fazla yardımcı olmuş oluruz sizlere.

Yorum Yaz

Avatar

REKLAM

DDos Koruma, Botnet Koruma, Layer 7 Saldırı koruması, Sanal sunucu, Vds sunucu

REKLAM

Çizgi Filmler

INSTAGRAM VIDEO İNDİR

Instagram Video İndirme Aracı

EN

  • Popüler
  • Yeni
  • Son Yorum