Trigger MySQL ::
March 8, 2010 29 Comments
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$$ |
pada trigger di atas setiap kali perubahan dilakukan terhadap tabel COBA maka secara otomatis
tabel COBA2 akan dipengaruhi / terpengaruh.
Pembuatan trigger ini dapat digunakan untuk berbagai keperluan, selamat mencoba…..!
NB :: TULISKAN sytax tersebut pada syntax mysql // sql
Jangan lupa untuk memberikan komentar anda. terima kasih.
Daftar PUSTAKA ::
http://mysql.com
http://aryanto165.com/
http://achmatim.net/
Semoga Ilmu kali ini bermanfaat :: diaz ::


siipp kereeenn makasih yaa,, sangat membantu dalam pengerjaan Tugas Akhir saya,,semoga kebaikan selalu tercurah untuk anda, aminn
itu buat di sqlserver ato mysql?
pas di jalanin di sqlserver error ya
iya Mas :: ini di MySQL , tapi klo gak salah sie, bahasanya sama :-/ tapi blumnyoba si di SQLserver :: terima kasi sharingnya
CREATE TRIGGER name ON Mhs
AFTER UPDATE AS
INSERT INTO mtkul VALUES (‘CB001′,’Character Building’)
CREATE TRIGGER name
[BEFORE|AFTER] [INSERT|UPDATE|DELETE]
ON tablename
FOR EACH ROW statement
formatnya lain mas, td saya coba di sql server
ia mas, diperhatikan beda di penulisann statementnya
ada begin || end >> di Mysql
bisa ga, dalam satu trigger itu untuk proses insert, update, dan delete, dan ada hasil yang beda-beda untuk masing-masing proses?
sekalian juga nanya kalo misalkan satu trigger itu juga bisa berlaku untuk beberapa tabel, misalkan kalo delete di satu tabel, di 2 tabel lain yg berelasi terhapus juga, itu bisa g mas?
kalo bisa, tlg dkasi contoh kodenya..
panjang ne, maap klo ngrepotin…
tlg dijawab y, makasih..
tentu saja Bisa :
Jadi dalam 1 Table bisa di berikan maksimal 6 Triger ::
1. After -> insert ::
2. After -> update ::
3. After -> delete ::
4. Before -> insert ::
5. Before -> update ::
6. Before -> delete ::
——————————————
Nah :: itu bisa diisikan banyak releasion ke banyak table ::
Ini Contoh dari triger After -> Update di MySQL :: dimana di direlasikan secara bersamaan update table barang dengan percabangan IF :: dan Insert ke table backup :: (kurang ‘DELETE’ aja kan)
——————————————
create trigger ubahUpdate
after update on coba for each row
begin
if new.tra_code=’MB’ THEN
update `mbarang` set = qty + old.qty where no_barang = old.no_barang ;
end if;
if new.tra_code=’KB’ THEN
update `mbarang` set = qty – new.qty where no_barang = new.no_barang ;
end if;
insert into `mfaktur2backup` (`no`,`id`,`nama`) values (NULL,old.id,old.nama);
end
——————————————
nah :: semoga membantu
atau Contoh sederhanya seperti ini ::
—————————————
CREATE TRIGGER `ubahupdate` After UPDATE on `komentar` for EACH ROW begin
update `isiblog` set `body` = Id + old.Id where Id = old.Id;
update `isiblog2` set `body` = Id + new.Id where Id = new.Id;
delete from `isiblog` where Id = 1;
insert into `isiblog` (`Id`,`title`,`body`) values (NULL,’sapi’,'kijang’);
end;
—————————————
NB :: sbagai sharing karna ane sendiri sering salah ::
Trigger menggunakan key sensitive dimana tulisan FIELD harus sama persis :: terus setiap syntaq MySQL antara begin dan end harus di akhiri tanda ‘;’
Semoga Membantu
wah, cukup jelas ,itu juga bisa dikasi if ternyata toh.
yoi ….
mau tanya nie temen2…klo setelah server di nyalakan, bisa nggak yach tabel A terisi tanggal secara otomatis tapi tidak menggunakan aplikasi, jd pake fungsi2 mysql.
thx sebelumnya
ya. saya ngak tau ni jawaban bisa memuaskan anda apa ngak
jadi misalkan anda menggunakan OS windows
buat file dengan extensi .bat dan isikan script berikut : insertotomatis.bat
nah kemudian jalankan pada startup windows
kalo pada Linux ya sama saja ,tapi dengan ekstensi .h dan jalankan juga pada start UP.
dan baca Lanjutannnya DISINI untuk LINUX
harap ini jawaban cukup tepat buat pertanyaan anda :: soalnya tetap pake program dasar dari OS ::
INGAT.. syntax diatas menggunakan syntax mysql dasar, dapat dirubah sesuai dengan nama table, dan sesuaikan bentuk Fieldnya.
use NAMA_TABLE .
Hati hati pada saat mengedit REGEDIT
makasih mas,tutorialnya mudah banget dipahami.Saya mo tanya misalkan dibuat trigger untuk insert data baru, kemudian setelah itu update kolom tertentu pada tabel yang sama caranya gimana ya..?misalkan,tabel pinjaman, insert NoKas keluar,NoAnggota,Pinjaman,BungaPinjaman trus langsung update field jumlahbunga (Pinjaman * bungaPinjaman)…Makasih jawabannya
hehe.. saya sudah coba untuk membuat pemicu trigger pada tabel sendiri ->
dan tidak bisa-> namun serasa itu tidak effisiendan itu tidak perlu… dan mungkin dari pihak mysqlnya sendiri tidak memperkenankan kita membuat trigger pada tabel ini(it) sendiri.namun jangan kuatir, mungkin anda dapat menggunakan dan membuat PRocedure sendiri pada mysql sehingga anda dapat menyelesaikan permasalahan yang anda buat, di SINI ::
http://diazscript.wordpress.com/2010/07/05/membuat-procedure-sederhana-pada-mysql/
anda hanya tinggal mengganti insert into menjadi call name_proceduer(values)..
namun sebenarnya mungkin anda dapat mengatasinya di program / aplikasi yang anda buat yang dikoneksikan pada MySQL. karna langkah itu lebih effisien
ya, moga moga aja ada saran tambahan dari Pembaca Lain.
oke terimakasi
salam diaz
wiiiidiiiiihhhh gak ngerti…..
Mas mau tanya, Cara konekin dari trigger MYSQL ke SQL Server gmn ya?
kl di Oracle kan ada DBLINK, di SQL Server ada Linked Server,
Kl di MySQL caranya gmn ya?? MySQL sy install di Centos
Terima kasih atas perhatian dan bantuannya
Salam,
Yudi
eh gimana sih caranya bikin TRIGGER BEFORE UPDATE tapi action didalamnya mengupdate field lain selain yang diupdate. misalnya kaya gini
update holiday set life = 5, wind=0 where player = ‘nova’;
CREATE DEFINER=`root`@`localhost` TRIGGER `fun`.`BF_Holiday` BEFORE UPDATE ON fun.holiday FOR EACH ROW
BEGIN
SET NEW.wind = 10;
END;
pas saya coba ternyata field wind tersebut tetap tidak bisa terupdate
mungkin ini bisa membantu
CREATE DEFINER=`root`@`localhost` TRIGGER `fun`.`BF_Holiday` BEFORE UPDATE ON fun.holiday FOR EACH ROW
BEGIN
update holiday set wind=10 where `player`<>`new.player` ;
END;
Nb : penulisan “<>” bacanya tidaksamadengan
mungkin maksut anda “Field lain” adalah “record lain”

tapi ada baiknya jika Field player adalah query Uniqe atau primary key
atau mungkin kita bisa menambahkan field lain seperti ID/nomor
terimakasih
terus kembangkan pendidikan bersama
mau tanya,,saya menggunakan dua database..yang satu di server a dan satunya di server b. gimana caranya koneksi ke server b dari server a menggunakan trigger. terimakasih.
mungkin Link ini bisa membantu
saya rasa mysql belum support dblink .
namun bisa mengguanakn driver odbc
http://www.idevelopment.info/data/Oracle/DBA_tips/Heterogeneous_Services/HETERO_2.shtml
bisa gak yo trigger mysql buat insert di lain host?//
itu dia, berbeda seperti oracle yang support dengan dblink(akeses host lain), mysql yang dasarnya masih gratis ini belum mendukung dblink tersebut, namun konon ada yg digabungkan dengan menggunakan driver odbc.
Makasih buat ilmunya… sangat bermanfaat
sama.. sama.. kembangkan terus pendidikan
saya pakai triger untuk update stok barang…aplikasi Vfp&mysql (myisam)
sewaktu dites di singgle user (lokal) semua sudah benar (stok ok)… cuman sewaktu banyak yang menggunakan ada beberapa barang yang stoknya kacau….
mungkin itu ada kesalahan disetiap relasinya :: bisa digambarkan struktur relasi antar table, mungkin rekan rekan disini bisa membantu.
mantabbbbbek…. lumayan dapet pencerahan
terima kasih….
lumayan buat referensi ngajar….
ngajar dimana mbak