Yükleniyor...

MySQL ile CDC (Change Data Capture)

MySQL ile CDC (Change Data Capture)
mysql-ile-cdc-change-data-capture


Amaç : Tabloda yapılan tüm değişiklikleri satır satır tutmak istiyoruz.

"firmalar" adında bir tablomuz var.

CREATE TABLE `firmalar` (
  `id` int(11) NOT NULL auto_increment,
  `ad` varchar(255) NOT NULL,
  `resim_link` varchar(255) NOT NULL COMMENT 'logo',
  `adres` text NOT NULL,
  `tel1` varchar(30) NOT NULL,
  `tel2` varchar(30) NOT NULL,
  `faks1` varchar(30) NOT NULL,
  `faks2` varchar(30) NOT NULL,
  `web` varchar(255) NOT NULL,
  `vergi_dairesi` varchar(100) NOT NULL,
  `vergino` int(11) NOT NULL,
  `ilgili_kisi` varchar(60) NOT NULL,
  `ilgili_email` varchar(255) NOT NULL,
  `durum` tinyint(4) NOT NULL,
  `iuser` int(11) NOT NULL COMMENT 'insert eder user',
  `idate` datetime NOT NULL COMMENT 'insert tarihi',
  `uuser` int(11) NOT NULL COMMENT 'update eder user',
  `udate` datetime NOT NULL COMMENT 'update tarihi',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8


Tablodaki ek loglama alanları. Bu alanlar ile o satırın insert ve update bilgilerini tutuyoruz. Yani o firmayı kim girdi, ne zaman girdi, kim güncelledi ne zaman güncelledi bilgilerini tutuyoruz.
iuser : insert eden user id
idate : ilk insert edilme tarihi
uuser : son update eder user id
udate : son update edilme tarihi

Peki değişen veriler/alanlar neler onları tutmak için basit çapta bir CDC yapısı oluşturmamız gerek.

Öncelikle değişimleri tutacak olan tablomuzu açalım.
Tabonun adı : arsiv_firmalar

CREATE TABLE `arsiv_firmalar` (
  `id` int(11) NOT NULL auto_increment,
  `firma_id` int(11) NOT NULL,
  `ad` varchar(255) NOT NULL,
  `resim_link` varchar(255) NOT NULL COMMENT 'logo',
  `adres` text NOT NULL,
  `tel1` varchar(30) NOT NULL,
  `tel2` varchar(30) NOT NULL,
  `faks1` varchar(30) NOT NULL,
  `faks2` varchar(30) NOT NULL,
  `web` varchar(255) NOT NULL,
  `vergi_dairesi` varchar(100) NOT NULL,
  `vergino` int(11) NOT NULL,
  `ilgili_kisi` varchar(60) NOT NULL,
  `ilgili_email` varchar(255) NOT NULL,
  `durum` tinyint(4) NOT NULL,
  `iuser` int(11) NOT NULL COMMENT 'insert eder user',
  `idate` datetime NOT NULL COMMENT 'insert tarihi',
  `uuser` int(11) NOT NULL COMMENT 'update eder user',
  `udate` datetime NOT NULL COMMENT 'update tarihi',
  `zaman` datetime NOT NULL COMMENT 'kayit tarihi',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

id : bu alan arşiv tablosunun kendi id alanı olacak, firma id lerini firma_id alanı tutacak.
zaman : değişikliğin yapıldığı zamanı tutacak.

Yapmak istedğimiz iş;
`firmalar` tablosunda yapılan tüm değişikliklerde ilgili satırı olduğu gibi `arsiv_firmalar` tablosuna yazmak.
Bunun için MySQL de bir TRIGGER oluşturuyoruz.

cdc_firmalar_update : Trigger adı.

CREATE TRIGGER cdc_firmalar_update AFTER UPDATE ON firmalar
FOR EACH ROW INSERT
    INTO arsiv_firmalar SET
        firma_id = NEW.id,
        ad = NEW.ad,
        resim_link=NEW.resim_link,
        adres=NEW.adres,  
        tel1=NEW.tel1,
        tel2=NEW.tel2,
        faks1=NEW.faks1,
        faks2=NEW.faks2,
        web=NEW.web,
        vergi_dairesi=NEW.vergi_dairesi,
        vergino = NEW.vergino,
        ilgili_kisi = NEW.ilgili_kisi,
        ilgili_email = NEW.ilgili_email,
        durum = NEW.durum,
        iuser = NEW.iuser,
        idate = NEW.idate,
        uuser = NEW.uuser,
        udate = NEW.udate,
        zaman = NOW();


Bu trigger firmalar tablosuna yapılan her update işlemindne sonra (AFTER UPDATE ON firmalar ) çalışacak ve yeni girilen verileri arsiv_firmalar tablosuna insert edecek.

Diyelim ki firma_id=50 olan kayıt için değişim tutanağını görmek istiyoruz.

SELECT * FROM arsiv_firmalar WHERE firma_id=50 ORDER BY zaman ASC;
Bu sorgu bize 50 nolu firma için yapılan tüm değişiklikleri satır satır gösterecek.


Bu yapıyı tüm talolar için kurarsanız veritabanındaki tüm değişiklikleri kayıt etmiş olursunuz.

AB
06.07.2011
  • SHARE

Tartışma




ya da
CAPTCHA Images