Arsip: Triger, Field Scanning dan Looping

 
user image
more 11 years ago

Penjahat

proses loging perubahan field ini bener2 bikin aku penasaran. ada sebuah table, sebut saja namanya bunga. table bunga ini memiliki puluhan fields. setiap kali ada perubahan data pada table bunga akan kita log history perubahannya nya kedalam table tb_log. Metode yg paling pas dapat kita terapkan pakek trigger pada MySql. Trigger event nya adalah AFTER UPDATE. Sebagai ilustrasi dapat aku gambarkan fields dari table bunga [size=18:97dd97dbb2]
guid  int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'primary key nya' ,
field1  int NULL COMMENT 'field yg PeRTama' ,
field2  int NULL COMMENT 'field kedua' ,
field3  int NULL COMMENT 'field ke 3' ,
dan seterusnya....
[/size:97dd97dbb2] sedangkan table tb_log [size=18:97dd97dbb2]
guid  int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'primary key nya' ,
id  int NULL COMMENT 'key relasi' ,
date  datetime NULL COMMENT 'tanggal perubahan',
history  varchar(150) NULL COMMENT 'keterangan' 
[/size:97dd97dbb2] maksudnya adalah jika kita lakukan perubahan pada salah satu field, misal field1 pada table bunga, maka history nya akan kita log di table tb_log Ilustrasi - nilai field1 yang sebelumnya 25 kita ubah menjadi 30 maka output pada tb_log nya jadi gini [size=18:97dd97dbb2]

guid id date        history
1    1  15/09/2009  Terjadi perubahan field yg pertama dari 25 menjadi 30
[/size:97dd97dbb2] solusi awal dapat kita pertimbangkan triger berikut (kita asumsikan udah dalam FOR EACH ROW BEGIN ...END) [size=18:97dd97dbb2]

IF NEW.field1 <> OLD.field1 THEN
  SET @PERUBAHAN = 'field yg PeRTama';
  SET @DARI_INI = OLD.field1;
  SET @JADI_INI = NEW.field1;
  INSERT INTO tb_log (id, date, history) VALUES (OLD.guid, NOW(), CONCAT('Terjadi perubahan ', @PERUBAHAN, ' dari ', @DARI_INI, ' menjadi ', @JADI_INI));
END IF
kemudian field2, field3 dan seterusnya....
[/size:97dd97dbb2] Triger diatas memang berjalan mulus tanpa hambatan. tapi masalahnya ini sangat gak efektif kalo kita punya 20 field atau lebih pada table bunga kita harus mendefinisikan IF .. THEN ... END IF sebanyak field yg kita punya, membosankan sekali. nah ini yang bikin aku penasaran.... sebenarnya akan lebih efektif kalo pakek metode looping. yg aku belum tau adalah, apakah ada pada MySql fungsi atau apapun sebutannya yg dapat melakukan looping dengan men-scan property nya field logika pada delphi kira-kira kayak gini (bukan syntax sebenarnya alias ngarang) [size=18:97dd97dbb2]
for U := 0 to Fields.count - 1 do
begin
  if New.Field[U].value <> Old.Field[U].value then
  begin
    Perubahan := Old.Field[U].comment;
    Dari_Ini := New.Field[U].value;
    Jadi_Ini := Old.Field[U].value;
    WriteLog(OLD.guid, Now, 'Terjadi perubahan '+Perubahan+' dari '+Dari_Ini+' mejadi '+Jadi_Ini);
  end;
end;
[/size:97dd97dbb2] that's all. brapapun jumlah field kita kodenya ya tetep segitu. Any idea ????
user image
more 11 years ago

mas_kofa

kalo emang si bunga adalah anak nya MySql, bukan kah si bapak (MySql) sudah mempunyai catatan riwayat hidup (aktifitas) nya si bunga secara detail yang tersimpan dalam sertifikat *.log yang ada rumah bapaknya (server).... MINAL AIDZIN WALFAIDZIN
user image
more 11 years ago

Penjahat

oh gitu ya, aku kok gak tau ya. pasti hoby baru bapaknya bunga ini nulis diary hehehe.... tapi begini mbak mas kofa, eh jadi nggak enak manggil nya :D *.log apapun itu adalah bukan yg kita inginkan. karena history nya bunga yg diinginkan adalah history yg dapat kita kreasikan formatnya dan kita baca dari sisi client, bukan server. analoginya seperti ini : jadi panjang nih.... memasak nasi (atau lebih tepatnya beras kali ya) dengan menggunakan priok (atau apa itu namanya), biasanya kita akan dapat 3 hasil output. 1. nasi, kandungan karbohidratnya tinggi, dan itu makanan pokok kita. 2. tajin, kalo dikasi sedikit gula rasanya enak kayak susu. banyak mengandung vitamin B. biasanya dijadikan alternatif kalo harga susu melambung. 3. kerak nasi(bs jawa intep). Adalah nasi yg kering dan hampir hangus yg terdapat di dasar priok. Nah, kalo mbak mas kofa pernah jalan-jalan di Madiun, disana ada pedagang kerak nasi(intep), sebut saja namanya mbok Supilah. Keraknya mbok Supilah ini dikemas dengan plastik dan digantung di atas etalasi kakilimanya, bentuknya besar kayak cobek. Ada rasa pedas, ada rasa manis, ada rasa gurih. mmmmhh jadi lapar nih. Kita semua yakin keraknya mbok Supilah ini dihasilkan atau diciptakan dengan sengaja oleh mbok Supilah, supaya dapat di bentuk sedemikian rupa dan dikreasikan sehingga terciptalah kerak nasi dengan berbagai pilihan rasa yang enak dan nikmat rasanya. Keraknya mbok Supilah bukanlah hasil efek samping dari dia masak nasi tadi pagi. Walaupun setiap pagi mbok Supilah ini selalu masak nasi bikin sarapan buat si Parjo anak bungsunya yg masih SD. :lol: Intinya. kita mau bikin kerak mirip punya mbok Supilah yg gurih-gurih pedas itu.:D bukan kerak hasil side effect yg pait.:( Thread tag = [nasi, beras, priok, cobek, pedas, gurih, kerak] jadi semakin lapar, SELAMAT BUKA PUASA :wink: :D
user image
more 11 years ago

mas_kofa

untuk memudahkan mbok supilah (TQuery / TTable), mbok supilah perlu menikah / kawin agar mendapatkan anak (bikin Class Turunan dari TQuery tsb), biar anak (turunan) nya saja yang membikin intip (atau membantunya) sehingga mbok supilah bisa kosentrasi membuat sarapan si Parjo anak sulungnya....
user image
more 11 years ago

Penjahat

hehehe... mbak mas kofa ini ngasi solusi kok semakin menjauh sih :) acara kita bikin intip ini kan gak pake compiler. tapi pake query sql. coba dibaca lagi postinganku yg paling atas. Pasti kemarin-kemarin bacanya mode patas=on ya. :D coba baca pelan-pelan aja, kalo perlu sambil dicoba. Kalo pake kompiler sih kukira kita gak ada kesulitan. Misal pake Dephi, tinggal kita manfaatkan aja event AfterInsert, AfterUpdate atau AfterPost. nah, disini yg menarik kita mau bikin intip pake Triger pada MySql. Tujuannya supaya apapun dan siapapun (baik Delphi, PHP, Navicat dan aplikasi-aplikasi mysql client lain) yg sengaja atau tidak, meng-insert atau meng-update si bunga, maka......jreng.... kunfayakun...intip itu langsung tercipta. :wink: enak to, mantep to, jangan tambah jauh solusinya nanti tak gendong lo :lol: Kita cuma membahas MySql. dan lebih sempit lagi Trigger-nya MySql. Ini hanya makanannya para Es-Ki-El-ler, so para jago-jago Sql, share dong pendapatnya. Oh ya, keliatannya kendala utama adalah di MySql nggak ada Array.
more ...
  • Pages:
  • 1
Share to
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com