Database Trigger dengan MySQL

A. PENGERTIAN TRIGGER

Trigger jika diartikan secara bahasa sederhana yaitu suatu pemicu, jika secara istilah trigger merupakan prosedur yang berhubungan dengan table, view, skema atau database yang dijalankan secara implicit pada saat terjadi sebuah event. Trigger diaktifkan berdasarkan waktu yang diinginkan. Waktu untuk trigger aktif ini disebut juga dengan istilah Trigger Timing.

Tiga Timing atau Waktu Pengaktifan Trigger

  1. BEFORE: Trigger dijalankan sebelum DML (Data Manipulation Language) event pada tabel.
  2. AFTER: Trigger dijalankan setelah DML event pada tabel.
  3. INSTEAD OF : Trigger dijalankan pada sebuah view.

Tiga Event yang Dimiliki Trigger

  1. INSERT: Mengaktifkan trigger ketika terjadi event insert atau tambah data pada sebuah tabel dalam database.
  2. UPDATE: Mengaktifkan trigger ketika terjadi event update atau ubah data pada sebuah tabel dalam database.
  3. DELETE: Mengaktifkan trigger ketika terjadi event delete atau hapus data pada sebuah tabel dalam database.

    Hasil penulisan dari sebuah Trigger akan menimbulkan efek manipulasi database secara otomatis sesuai dengan yang kita inginkan. Misalnya, ketika melakukan insert atau tambah data baru pada sebuah tabel, maka kita juga dapat melakukan event insert, update, delete dan event lainnya pada tabel yang ada di dalam database secara otomatis.

    B. MENGGUNAKAN TRIGGER

    1. Pembuatan Trigger

    Pernyataan CREATE TRIGGER digunakan untuk membuat trigger, termasuk aksi apa yang dilakukan saat trigger diaktifkan.

    Sintak:
    CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time
      trigger_event ON tbl_name FOR EACH ROW trigger_stmt;
    Keterangan:
    • [DEFINER = { user | CURRENT_USER }] : Definisi user yang sedang aktif, sifatnya opsional
    • trigger_name : Nama trigger
    • trigger_time : waktu menjalankan trigger. Ini dapat berupa BEFORE atau AFTER
    • trigger_event : berupa kejadian yang akan dijalankan trigger
    • tbl_name : Nama tabel yang berasosiasi dengan trigger.
    • trigger_stmt : Statemen (tunggal atau jamak) yang akan dijalankan ketika trigger aktif

    2. Contoh Kasus Penggunaan Trigger

    Sebagai contoh kasus penggunaan trigger adalah mencatat kejadian-kejadian yang terjadi beserta waktunya pada tabel mahasiswa, dan catatan-catatan tadi disimpan dalam tabel yang lain, misal pada tabel log_mahasiswa. Misalkan struktur tabel tbl_mahasiswa dan tabel log_mahasiswa adalah sebagai berikut.

    DESC log_mahasiswa;
    DESC tbl_mahasiswa;

    Setelah mengetahui struktur dari kedua tabel di atas, maka selanjutnya kita akan menampilkan terlebih dahulu isi record sebelumnya pada tabel tbl_mahasiswa dan log_mahasiswa. Berikut ini query untuk menampilkan isi record pada tabel tbl_mahasiswa dan tabel log_mahasiswa.

    SELECT * FROM tbl_mahasiswa;
    SELECT * FROM log_mahasiswa;

    Kemudian buat trigger dengan nama tambah_mahasiswa yang akan melakukan event insert (tambah data) secara otomatis ke tabel log_mahasiswa ketika kita menginputkan data baru pada tabel tbl_mahasiswa.

    CREATE TRIGGER tambah_mahasiswa AFTER INSERT ON tbl_mahasiswa FOR EACH ROW INSERT INTO log_mahasiswa VALUES ('Tambah Data', NOW());

    Keterangan:

    Trigger di atas akan aktif ketika terjadi input data baru pada tabel tbl_mahasiswa. Maka secara otomatis pada tabel log_mahasiswa akan terjadi penambahan data baru juga yang berisi data Tambah Data dan NOW() (merupakan fungsi untuk mengambil tanggal dan waktu pada komputer yang digunakan). Perhatikan tulisan yang tandai garis bawah warna merah pada query. Itu adalah value atau isi record yang akan kita tambahkan pada tabel log_mahasiswa.

    3. Melakuan Uji Coba Pada Trigger yang Dibuat

    Setelah berhasil membuat trigger pada percobaan di atas, maka tidak ada salahnya kita mencoba apakah trigger yang dibuat tersebut sudah dapat berfungsi atau berjalan dengan baik. Berikut ada beberapa langkah dalam uji coba pada trigger.

    1. Pertama-tama kita akan melakukan insert atau tambah data baru pada tabel tbl_mahasiswa.
    INSERT INTO tbl_mahasiswa VALUES ('14010320035', 'Ainul Azmi', 'S1', 'Mataram', 'ainuljoenk21@gmail.com');
    1. Tampilkan tabel tbl_mahasiswa untuk melihat apakah sudah berhasil menambahkan data baru pada tabel tersebut.
    1. Tampilkan kembali tabel log_mahasiswa untuk mengetahui apakah trigger berhasil dijalankan atau tidak.
    Trigger akan dikatakan berhasil jika pada tabel log_mahasiswa terdapat data baru.

    Berikut ini isi record dari tabel log_mahasiswa setelah trigger yang sebelumnya dibuat aktif.

    Setelah melihat isi record dari tabel log_mahasiswa di atas maka dapat disimpulkan bahwa yang telah dibuat tersebut berhasil berjalan dengan baik. Hal ini dikarenakan terdapat record baru disisipkan ke tabel log_mahasiswa sesaat setelah melakukan insert data pada tabel tbl_mahasiswa;

    Agar lebih paham, mungkin perlu ada satu tambahan contoh lagi. Jika pada contoh kasus di atas kita trigger akan aktif ketika melakukan INSERT pada tabel tertentu maka untuk contoh ke dua ini kita akan membuat trigger yang akan aktif ketika melakukan UPDATE pada tabel tertentu.

    • Membuat Trigger dengan menggunakan trigger timing AFTER dan trigger event UPDATE
    • Melakukan perintah UPDATE pada tabel tbl_mahasiswa dengan mengubah salah satu record pada tabel tersebut.
    • Menampilkan kembali tabel tbl_mahasiswa untuk melihat perubahan record setelah dilakukan perintah update.

    Pada record ke-3 telah terjadi perubahan yang sebelumnya alamatnya 'Mataram' menjadi 'Labuhan Jambu'.

    • Menampilkan tabel log_mahasiswa untuk mengetahui apakah ada perubahan pada record setelah trigger diaktifkan.

    Dari contoh diatas dapat disimpulkan bahwa ketika satu record pada tabel tbl_mahasiswa diperbaharui (update), maka secara otomatis tabel log_mahasiswa akan disisipkan satu record, yaitu kejadian ‘Ubah Data’ dan waktu saat record pada tabel tbl_mahasiswa diperbaharui.

    4. Keyword OLD dan NEW Pada Trigger

    Keyword OLD dan NEW Untuk merujuk ke kolom-kolom tabel yang diasosiasikan dengan trigger, kita menggunakan keyword OLD dan NEW. Keyword OLD mengacu pada nilai lama, sedangkan NEW merepresentasikan nilai baru. Di trigger INSERT, kita hanya dapat menggunakan keyword NEW karena tidak ada data lama. Sedangkan keyword OLD hanya dapat digunakan pada trigger event DELETE.

    Keyword NEW

    Salah satu contoh penerapan keyword New yakni pada kasus data stok data barang pada tabel barang. Yang mana jumlah stok dari barang akan bertambah atau berkurang secara otomatis. Berkurang ketika terjadi penjualan barang dan bertambah ketika terjadi pembelian barang.

    Misalkan di dalam database kita memiliki tabel tbl_barang dan tbl_pembelian dengan isi record sebagai berikut.

    • Sebelum membuat trigger, silahkan tampilkan terlebih dahulu isi record yang sudah ada pada tabel tbl_barang dan tbl_pembelian.

    Isi record tabel tbl_barang:

    Isi record tabel tbl_pembelian:

    • Membuat Trigger dengan nama update_stok yang menggunakan trigger timing AFTER dan trigger event UPDATE dan keyword NEW yang berfungsi untuk mengupdate jumlah stok pada tabel barang.
    • Melakukan tambah data pembelian dengan perintah INSERT pada tabel tbl_pembelian.
    • Menampilkan kembali tabel tbl_pembelian untuk mengetahui data sudah berhasil ditambah atau belum.
    • Menampilkan kembali tabel tbl_barang untuk melihat perubahan isi record terutama pada kolom stok setelah dilakukan insert pada tabel tbl_pembelian.
    Pada record dengan kode barang B001 (Teh Botol) telah mengalami perubahan stok yang semula berjumlah 32 serakarang menjadi 62 setelah melakukan input data pembelian barang dengan kode B001 dengan jumlah pembelian sebanyak 30.
    Keyword OLD

    Untuk kasus trigger DELETE, keyword yang bisa digunakan hanya OLD. Seperti yang diketahui bahwa tabel tbl_barang dengan tabel tbl_pembelian memiliki relasi dimana kode_barang merupakan primary key di tbl_barang menjadi foreign key pada tbl_pembelian. Jadi jika pada tbl_barang ada data atau record yang dihapus maka kode_barang yang ada pada tbl_pembelian juga seharusnya ikut terhapus.

    Secara default ketika ada record pada tbl_barang dihapus maka pada tbl_pembelian yang memiliki record kode_barang yang sama dengan kode_barang yang dihapus pada tbl_barang akan berubah nilainya menjadi NULL.

    Agar lebih mudah dipahami silahkan perhatikan contoh yang di bawah ini.

    • Terlebih dahulu tampilkan isi atau record yang ada pada tbl_barang dan tbl_pembelian

    Isi record pada tbl_barang

    Isi record pada tbl_pembelian

    • Kemudian buat trigger dengan event DELETE, timing AFTER dan keyword OLD
    • Menghapus salah satu record yang ada pada tbl_barang. Misalkan hapus record dengan kode_barang B001
    • Menampilkan kembali tbl_barang dan tabel_pembelian setelah melakukan hapus data pada tbl_barang
    Pada gambar di atas terlihat record dengan kode_barang B001 sudah tidak ada. Ini berarti proses penghapusan pada tbl_barang berhasil
    Sama halnya pada tbl_barang, pada tbl_pembelian pun untuk kode_barang B001 juga sudah tidak ada. Ini berarti trigger dengan nama hapus_barang yang berhasil berjalan dengan baik.
    Keyword OLD dan New dalam Satu Trigger

    Khusus untuk operasi UPDATE, kita bisa memanfaatkan keyword NEW maupun OLD dan juga bisa menggunakan keyword OLD dan New dalam satu trigger. Untuk lebih jelas perhatikan contoh di bawah ini.

    • Terlebih dahulu tampilkan data pada tbl_barang dan tbl_pembelian untuk mengetahui isi record yang ada sekarang ini.

    Isi record pada tbl_barang

    Isi record pada tbl_pembelian

    • Setelah itu buat trigger dengan query seperti di bawah ini.
    • Mengubah salah satu data yang ada pada tbl_barang. Misalkan kita akan mengubah kode_barang dari Good Day yang sebelumnya B003 menjadi B005. Silahkan gunakan query di bawah ini.
    • Menampilkan kembali isi record dari tbl_barang dan tbl_pembelian
    Setelah melakukan update data pada tbl_barang, dapat dilihat bahwa barang dengan nama 'Good Day' telah berubah kode_barangnya dari 'B003' menjadi 'B005' baik itu pada tbl_barang maupun pada tbl_pembelian.

    C. TRIGGER KOMPLEKS 

    Keberadaan trigger secara nyata mampu mengatasi berbagai persoalan pelik, misalnya berkaitan dengan integritas atau audit data. Ini tentu sangat masuk akal, karena trigger juga bisa mengandung pernyataan-pernyataan yang kompleks termasuk percabangan, pengulangan, fungsi-fungsi agregat, bahkan kode pemanggilan prosedur. Sebagai ilustrasi sederhana, kita bisa mendefinisikan trigger untuk memeriksa operasi update pada tabel tbl_barang maka pada tabel status_barang akan mengalami penambahan record yakni ketika stok pada tbl_barang adalah 0. Kemudian record akan dihapus jika stok pada tbl_barang tidak sama dengan 0.

    Untuk menjaga ketersedian barang agar selalu ada, maka perlu dilakukan pengecekan pada stok dari dari masing-masing barang yang ada. Secara sederhana kita dapat melakukan pengecekan stok pada suatu sistem penjualan dengan cara membuatkan sebuah tabel dalam database yang akan memberikan informasi tentang barang mana saja yang sudah habis stoknya. Adapun tabel yang dimaksud adalah tabel status_barang.

    Pada contoh kasus di atas, maka tidak dapat diatasi dengan menggunakan trigger yang sebelumnya sudah kita coba. Akan tetapi perlu menggunakan trigger yang lebih kompleks lagi. Misalkan kita memiliki tabel barang dan tabel status barang dengan isi record sebagai berikut.

    Isi record pada tbl_barang
    Isi record pada tabel status_barang

    Silahkan buat trigger dengan nama update_status dengan menggunakan query di bawah ini. Berbeda dengan query pembuatan trigger sebelumnya untuk trigger kompleks dimulai dengan kode DELIMITER // dan di akhir dengan tanda //

    Kemudian kita akan mengubah stok pada barang dengan kode 'B005' menjadi 0.

    Tampilkan kembali tabel status_barang dan tbl_barang.

    Barang dengan kode 'B005' sekarang stoknya telah berubah menjadi 0. Sedangkan pada tbl_status barang terjadi penambahan record baru seperti yang dijukkan oleh gambar di bawah ini.

    Dapat terlihat pada tabel status_barang terdapat penambahan record barus setelah salah satu barang pada tbl_barang di ubah stoknya menjadi 0. Karena pada kode_barang 'B003' yang diubah stoknya jadi 0, maka pada tabel status_barang recordnya bertambah dengan isi record kode_barang = B003 dan Status = Stok Habis

    Kemudian lakukan operasi update kembali dengan kode barang yang sama (B005) ubah stoknya menjadi bukan 0 lagi misalnya stoknya menjadi 28.

    Kemudian tampilkan lagi isi record dari tbl_barang dan status_barang.

    Dapat dilihat pada tbl_barang, barang dengan kode 'B005' telah berubah stoknya dari 0 menjadi 28. Sedangkan pada status_barang, barang dengan kode 'B005' telah terhapus.

    Dari contoh di atas dapat kita lihat bahwa ketika stok pada tabel di update menjadi 0 maka pada tabel status barang akan mengalami operasi INSERT dan ketika di update lagi stoknya menjadi lebih besar dari 0 maka record dengan kode_barang yang sama akan dihapus dari status_barang. 

    Berhubung pembahasan pada artikel sudah terlalu panjang dan akan terasa semakin membosankan untuk dibaca, mungkin akan saya cukupkan dahulu pembahasannya. Dan seperti biasa jika ada dari pembahasan saya di atas ada yang tidak dimengerti silahkan tanyakan pada kolom komentar. See you Next article :)

    • - https://elektro.um.ac.id/wp-content/uploads/2016/05/Modul-6-Trigger.pdf
    • - https://ariv.lecturer.pens.ac.id/Database%202/T13%20-%20Database%20Trigger.pdf
    • - https://pusat-bahasa.info/relo/download/119542039mohriyan-MySQL2.pdf