Trigger MySQL ::


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 ::
Trigger MySQL ::

35 thoughts on “Trigger MySQL ::

  1. therikat says:

    siipp kereeenn makasih yaa,, sangat membantu dalam pengerjaan Tugas Akhir saya,,semoga kebaikan selalu tercurah untuk anda, aminn

    1. diazscript says:

      iya Mas :: ini di MySQL , tapi klo gak salah sie, bahasanya sama:-/ tapi blumnyoba si di SQLserver :: terima kasi sharingnya

  2. dony says:

    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

  3. dion says:

    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..

    1. diazscript says:

      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

      1. diazscript says:

        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

  4. dar says:

    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

    1. diazscript says:

      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

      mysql --user=root --password=123456 -e "use tree;insert into tree values(Null,'sapi',100)"

      nah kemudian jalankan pada startup windows

      masuk pada regedit kemudian ikuti langkah dibawah ini :
      HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run
      Pilih menu Edit > New > String Value dengan nama insertotomatis misalnya.
      Klik ganda pada value tersebut dan masukkan path tempat program tersebut terinstall
      (C:\insertotomatis.bat)

      kalo pada Linux ya sama saja ,tapi dengan ekstensi .h dan jalankan juga pada start UP.

      #!/bin/bash
      mysql --user=root --password=123456 -e "use tree;insert into tree values(Null,'sapi',100)"

      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

  5. ramdan says:

    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

    1. diazscript says:

      hehe.. saya sudah coba untuk membuat pemicu trigger pada tabel sendiri -> dan tidak bisa -> namun serasa itu tidak effisien dan 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 ::
      https://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😀

  6. Yudi says:

    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

  7. nirwan says:

    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

    1. diazscript says:

      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😀

  8. lina says:

    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.

    1. fendiaz says:

      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.

  9. ndebolando says:

    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….

    1. fendiaz says:

      mungkin itu ada kesalahan disetiap relasinya :: bisa digambarkan struktur relasi antar table, mungkin rekan rekan disini bisa membantu.

  10. mamak says:

    Mohon pencerahannya, bisa tidak kita trigger di table yang sama, jadi klo kita melakukan update (before update), dia melakukan delete atas record yang ada pada table yang sama dengan syarat id nya sama :

    delimiter $$
    CREATE TRIGGER Employee_Trigger
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
    delete from users where username=new.username;
    END$$

    1. fendiaz says:

      Maaf.. dengan brat hati saya nyatakan blom bisa…
      Kita tunggu saja upfate dr mysql..

      Karena klo pada 1 tabel.. akan terjadi perulangan yg g kunjung heenti

  11. mau tanya,..saya punya data dalam .txt yang isinya seperti ini,

    IP MacAddress OS
    xxxx1 yyyyyyyyy ubuntu
    xxxx2 yyyyyyyyy Windows
    xxxx3 yyyyyyyyy ubuntu
    xxxx4 yyyyyyyyy Mac

    untuk menginput data tersebut ke database saya gunakan metode load data pada SQL,.

    karena datanya akan selalu diupdate. bagaimana agar bisa diketahui total pengguna ubuntu, windows dan os lainnya setiap kali update selain itu bagaimana agar data yang telah diupdate juga masih bisa dipanggil lagi

    yang diinginkan 1 :
    OS total
    ubuntu 3
    Windows 2
    Mac 1

    yang diinginkan 2 :

    tanggal : 1 agustus 2012

    IP MacAddress OS
    xxxx1 yyyyyyyyy ubuntu
    xxxx2 yyyyyyyyy Windows
    xxxx3 yyyyyyyyy ubuntu
    xxxx4 yyyyyyyyy Mac

    tanggal : 3 agustus 2012

    IP MacAddress OS
    xxxx1 yyyyyyyyy ubuntu
    xxxx2 yyyyyyyyy Windows
    xxxx3 yyyyyyyyy ubuntu
    xxxx4 yyyyyyyyy Mac
    xxxx5 yyyyyyyyy windows

    mohon pencerahaannya?

    1. fendiaz says:

      anda seorang database analist bukan ?

      jika memang ia,

      pasti anda akan membuat tabel sendiri yang akan merecord dan memasukkan setiap transaksi, (buka mengupdate , tapi insert )

      dengan field (no,tanggal,ip,mac address, os)
      sehingga jika tabel pertama anda terupdate, dia akan tetap menyimpan data 2 yg lama tanpa dihapus.

      tapi kalau memang anda ingin mempertahankan tabel pertama anda,
      jadi, ada dua tabel ya, table anda dengan field (IP,Macaddr,OS) dan tabel saya (no,tanggal,ip,mac address, os),

      nah skarang trigernya ::

      CREATE TRIGGER `ubahtabelanda` After UPDATE on `tabelanda` for EACH ROW begin

      insert into `tabelsaya` (`no`,`tanggal`,`ip`,`mac address`, `os`) values (NULL,’00-00-000’, old.ip , old.mac address , old.os );

      end;

      nah…. bagaimana mengetahui jumlah total pengunjung ::
      tentu saja menggunakan SUM pada tabel saya, menggunakan filter2 sesuai keinginan anda…

  12. Dananx says:

    Masih boleh tanya om..hehehe.
    saya buat trigger muncul error seperti:
    #1235 – This version of MySQL doesn’t yet support ‘multiple triggers with the same action time and event for one table’

    memang saya pernah buat trigger dua kali, masalahnya sya lupa nama trigger yg saya buat sebelumnya, sehingga saya buat lagi muncul error tsb, dan saya drop tidak bisa..

    bagaimana cara menghapus trigger yg sudah pernah dibuat tapi tidak tau nama triggernya supaya trigger yg baru bisa dipakai dan tidak muncul error tsb? Trima kasih banyak Om..

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s