Monday, 11 October 2010

Dari Pengalaman, Bapak ane yang ditantangin sama pesaing-nya masalah database Pengguna POSTGREE and ORacle, hah.. enak Saja dia jelek jelekin database dbf[foxpro] and mysql[SQL], kata-nya mysql dan dbf tidak bisa menggunakan Trigger :: aku si mesem aja [ dengan pandangan Licik ] :: haha.. pasti orang ini ngak pernah megang Mysql // dbf . atau bisanya main kandang sendiri [ POSTGREE || ORACLE ].
[MySQL]
Memang Sie selama ini pada MySQL yang free terdengar rumor tentang keterbatasan pada Fitur fiturnya – tapi tidak untuk TRIGGER.
Trigger merupakan sekumpulan perintah atau sintaks yang akan secara otomatis dijalankan jika terjadi operasi tertentu dalam tabel atau view. Trigger digunakan untuk memanggil satu atau beberapa perintah SQL secara otomatis sebelum atau sesudah terjadi proses INSERT, UPDATE atau DELETE dari suatu tabel. Sebagai contoh misalnya kita ingin menyimpan id pelanggan secara otomatis ke tabel ‘log’ sebelum menghapus data di tabel pelanggan. Ataupun kita akan Secara otomatis merekam semua aktivitas MySQL yang gagal membuat Record Baru yang diakibatkan terputusnya Koneksi.
Trigger sering digunakan, antara lain untuk:
• Melakukan update data otomatis jika terjadi perubahan. Contohnya adalah dalam sistem penjualan, jika dientri barang baru maka stock akan bertambah secara otomatis.
• Trigger dapat digunakan untuk mengimplementasikan suatu sistem log. Setiap terjadi perubahan, secara otomatis akan menyimpan ke tabel log.
• Trigger dapat digunakan untuk melakukan validasi dan verifikasi data sebelum data tersebut disimpan.
Beberapa Contoh Metode Trigger yang saya Gunakan :
CREATE TRIGGER awalreport BEFORE INSERT ON `faktur2` FOR EACH ROW
BEGIN
INSERT INTO TABLE_ERROR ( NO_FAKTUR,USER,TANGGAL,BEFORE,AFTER ) VALUES ( new.no_faktur, new.user,sysdate(),'1','0' );
END ;
NAh.. hal itu difungsikan untuk mencatat smua aktifitas sebelum insert record pada table faktur2, ke dalam table_error ::: KEMUDIAN
CREATE TRIGGER akhirreport AFTER INSERT ON `faktur2` FOR EACH ROW
BEGIN
UPDATE TABLE_ERROR SET after = 1 WHERE no_faktur = new.no_faktur ;
END ;
Hal ini difungsikan jika row record benar benar sudah masuk, maka FIELD after akan terisi angka 1, dan algoritmapun selesai.
Buat apasih pake Triger segala , kan meskipun tanpa pencatatan kedalam TABLE_ERROR pun program kita akan berjalan dengan baik ??
Betul,meskipun tanpa pencatatan tambahan dengan trigerpun pun program kita sudah berjalan dengan baik, namun, bagaimana dengan FAKTOR XXX, APA ITU ?? banyak, seperti :: mati lampu, tiba tiba server ngeHank, dan bahkan sampai kesalahan USER dalam menjalankan Aplikasi, BUKANNYA HAL ITU TIDAK BERPENGARUH BESAR ?? Betul, bagi kita para develop tentu bukan masalah besar, namun BAGI KONSUMEN / PENGUNA APLIKASI itu akan berdampak BESAR.
seperti : tiba tiba saat di STOK OPNAM, hmm… data tidak sama / valid. DIMANA LETAK KESALAHANNYA ??? Gak tau, hehe.. dengan TABLE_ERROR, ada sedikit pencerahan, mungkin ada FAKTUR yang sudah entrykan , tapi tanpa sengaja tidak masuk karena kesalahan KONEKSI dan sebagainya.
Terus, buat apa Lagi ya, hehe.. ini pemikiran tambaan dari metode Triger yang saya gunakan ::
CREATE TRIGGER curangubah BEFORE UPDATE ON `faktur2` FOR EACH ROW
BEGIN
INSERT INTO TABLE_CURANG ( NO_FAKTUR,USER,TANGGAL,QTY_LAMA,QTY_BARU ) VALUES ( new.no_faktur, new.user,sysdat(),old.qty,new.qty );
END ;
CREATE TRIGGER curangdelete BEFORE DELETE ON `faktur2` FOR EACH ROW
BEGIN
INSERT INTO TABLE_CURANG ( NO_FAKTUR,USER,TANGGAL,QTY_LAMA ) VALUES ( new.no_faktur, new.user,sysdat(),old.qty );
END ;
AH.. ini apa Lagi, malah gak masuk akal, Masak setiap ubah atau delete record aja perlu dicatat !!
hehe.. iya. bagi kita update dan delete merupakan hal yang biasa. nah, tapi bagaimana Keamana program kita dari para hacker iseng yang main delete / update [ ingat , hacker dapat difungsikan oleh orang dalam yang ingin bermain curang untuk mengambil keuntungan ]. Tentu hal ini sangat berguna bila ada orang dalam yang dengan sengaja [ Terutama orang dalam ] merubah data dan tentu saja dengan niat buruk, karena dari hasil surfei [duh pake surfei segala] Kecurangan dan pembobola data hmir 80 % didalangi dan disponsori oleh orang dalam untuk mendapatkan keuntungan individuaal .. Haha.. jadi ketahuankan , kapan dia merubah, delete, dengan user siapa dia melakuka, dan tentusaja data lama masih bisa diselamatkan.
Metode ini sangat berguna di aplikasikan pada program yang berurusan dengan STOK barang, Gudang, dan MANY[cie..duit].
Adapun beberapa dokumentasi yang saya search dari mysql-manual :::
Membuat Trigger Baru
Berikut ini bentuk umum perintah untuk membuat triggers:
CREATE TRIGGER name
[BEFORE|AFTER] [INSERT|UPDATE|DELETE]
ON tablename
FOR EACH ROW statement
Keterangan dari bentuk umum perintah membuat trigger:
• name, Nama trigger mengikuti peraturan penamaan variabel / identifier dalam MySQL
• [BEFORE | AFTER] digunakan untuk menentukan kapan proses secara otomatis akan dieksekusi, sebelum atau sesudah proses.
• [INSERT | UPDATE | DELETE] digunakan untuk menentukan event (proses) yang dijadikan trigger (pemicu) untuk menjalankan perintah-perintah di dalam triggers.
• tablename, merupakan nama tabel dimana trigger berada.
• statement, merupakan sekumpulan perintah atau query yang akan secara otomatis dijalankan jika event / proses yang didefinisikan sebelumnya aktif.
Statement atau perintah dalam trigger dapat berupa satu perintah saja, dan dapat juga beberapa perintah sekaligus. Jika terdapat beberapa perintah dalam trigger, maka gunakan perintah BEGIN dan END untuk mengawali dan mengakhiri perintah.
Di dalam statement trigger, kita dapat mengakses record tabel sebelum atau sesudah proses dengan menggunakan NEW dan OLD. NEW digunakan untuk mengambil record yang akan diproses (insert atau update), sedangkan OLD digunakan untuk mengakses record yang sudah diproses (update atau delete).
Berikut ini contoh trigger yang akan mencatat aktivitas ke tabel log setiap terjadi proses insert ke tabel pelanggan:
DELIMITER $$

CREATE TRIGGER penjualan.before_insert BEFORE INSERT ON penjualan.pelanggan
FOR EACH ROW BEGIN
INSERT INTO `log` (description, `datetime`, user_id)
VALUES (CONCAT('Insert data ke tabel pelanggan id_plg = ', NEW.id_pelanggan), now(), user());
END;
$$

DELIMITER ;
Menghapus Trigger
Untuk menghapus trigger, dapat menggunakan perintah DROP TRIGGER dengan diikuti dengan nama tabel dan nama triggernya. Berikut ini bentuk umum dan contoh perintah untuk menghapus trigger.
Bentuk umum dan contoh menghapus trigger:
DROP TRIGGER tablename.triggername;
Contoh menghapus trigger bernama ‘before_insert’ yang ada di tabel pelanggan.
DROP TRIGGER penjualan.before_insert;
Nah.. diatas adalah penjabaran secara singkat padat dan tak jelas mengenai Metode Trigger yang saya gunakan, namu bila anda pengguna awal dari trigger, mungkin tulisan dibawah lebih dapat membatu anda ::
Sebagai contoh: penghapusan satu tabel akan memicu suatu trigger untuk menghapus pada tabel yang lain yang telah ditunjuk terlebih dahulu. dibawah ini saya berikan satu contoh penggunaan trigger pada database MySQL.
Sebagai contoh kita siapkan terlebih dahulu sebuah database dan tabel yang akan diuji coba seperti dibawah ini:
create database mytrigger;

create table coba (
kode varchar(5) not null,nama varchar(35) not null,
primary key (kode))

create table coba2 (
kode varchar(5) not null,nama varchar(35) not null,
primary key (kode))

create table tran (
kode varchar(5) not null,
kodetran varchar(5),jumlah double,
primary key nkode (kode,kodetran))
Kemudian buatlah sebuah trigger dengan kode seperti dibawah ini:
delimiter $$

create trigger auto_insert_coba2
before insert on coba for each row
begin
insert into coba2 (kode,nama) values (NEW.kode,NEW.nama);
end$$

create trigger auto_update_coba2
before update on coba for each row
begin
update coba2 set nama=NEW.nama where kode=NEW.kode;
end$$

create trigger auto_delete_coba2
before delete on coba for each row
begin
delete from coba2 where kode=OLD.kode;
delete from tran where kode=OLD.kode;
end$$