Wiki Sayfaları
PHP
MySQL
MySQL ile CDC (Change Data Capture)
Curl ile Sitelere Login Olmak
Resim Upload Sınıfı
PHP+MySQL sistemler için üye giriş-çıkış-kayıt
MySQLde Türkçeleştirme Operasyonu
Apache mod_geoip kurulumu ve PHP Kullanımı
Ülke + Şehir + İl Posta Kodu görüntüleme ip tabalı | PHP
Belirli bir değer okuyana kadar ekleme yapmak
Bugün ve X gün arasında doğanları listeleme | MySQL
Basit MySQL Sorguları
Curl Site Check
PHP Class Turetme Örneği
Recursive PHP
PHP ile Dosya İşlemleri
PHP FTP Fonksiyonları
PHP 5.3 Deprecated FunctionsSon Aktiviteler
yeni bir wiki sayfası oluşturdu utf8 general - utf8 turkish
7 ay önce
7 ay önce
yeni bir wiki sayfası oluşturdu if(5==$deger) yada if ($deger==5)
7 ay önce
7 ay önce
bu wiki sayfasına yorum yaptı.
8 ay önce
8 ay önce
yeni bir wiki sayfası oluşturdu mysql int(11) ile int(3) arasındaki fark
8 ay önce
8 ay önce
yeni bir wiki sayfası oluşturdu PHPExcel kütüphanesi __autoload çakışması
8 ay önce
8 ay önce
Paylaş
MySQL ile CDC (Change Data Capture)
Etiketler: mysql cdc cdc Change Data Capture trigger
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
Yeni Sayfa Oluştur
Tartışma
ya da

