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

Entries (RSS)