Basis Data Part 9: Trigger MySQL

Dodit Suprianto
5 min readNov 28, 2021

--

Trigger adalah serangkaian tindakan yang dijalankan secara otomatis saat operasi perubahan tertentu dilakukan pada tabel tertentu.

Trigger dapat dieksekusi ketika Anda menjalankan salah satu pernyataan MySQL berikut di atas tabel: INSERT, UPDATE, dan DELETE dan dapat dipanggil sebelum atau sesudah Event.

Contoh penggunaan Trigger:

  • Menerapkan aturan bisnis
  • Meng-validasi data masukan
  • Menghasilkan nilai unik untuk baris yang baru dimasukkan dalam file berbeda.
  • Menulis ke file lain untuk tujuan audit trail
  • Replikasi data ke file yang berbeda untuk mencapai konsistensi data

Manfaat menggunakan pemicu dalam bisnis:

  • Pengembangan aplikasi lebih cepat. Karena database menyimpan Trigger, Anda tidak perlu mengkodekan tindakan Trigger ke dalam setiap aplikasi database.
  • Penegakan aturan bisnis secara global. Tentukan Trigger sekali, lalu gunakan kembali untuk aplikasi apa pun yang menggunakan database.
  • Perawatan lebih mudah. Jika kebijakan bisnis berubah, Anda hanya perlu mengubah program trigger yang sesuai, bukan setiap program aplikasi.
  • Meningkatkan kinerja di lingkungan client/server. Semua aturan berjalan di server sebelum hasilnya kembali.

Jenis Pemicu di MySQL

Kita dapat mendefinisikan maksimum enam jenis tindakan atau peristiwa dalam bentuk trigger:

  • Before Insert: Ini diaktifkan sebelum penyisipan data ke dalam tabel.
  • After Insert: Ini diaktifkan setelah penyisipan data ke dalam tabel.
  • Before Update: Ini diaktifkan sebelum pembaruan data dalam tabel.
  • After Update: Ini diaktifkan setelah pembaruan data dalam tabel.
  • Before Delete: Ini diaktifkan sebelum data dihapus dari tabel.
  • After Delete: Diaktifkan setelah penghapusan data dari tabel.

Saat kami menggunakan pernyataan yang tidak menggunakan kueri INSERT, UPDATE, atau DELETE untuk mengubah data dalam tabel, pemicu yang terkait dengan pemicu tidak akan dipanggil.

Sintak Trigger

CREATE TRIGGER trigger_name    
(AFTER | BEFORE) (INSERT | UPDATE | DELETE)
ON table_name FOR EACH ROW
BEGIN
--variable declarations
--trigger code
END;

Seabagai contoh, pertama buat dulu table dumy bernama dumy_stock_tb dengan field barang_id, nama_barang, stock. Dengan script di bawah ini:

CREATE TABLE penjualan_db.dumy_stock_tb (
barang_id CHAR(10) NULL,
nama_barang varchar(35) NULL,
stock INTEGER UNSIGNED NULL
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;

Kemudian kita bermain sedikit dengan store procedure sambil mengulang materi sebelumnya.

Tujuan store procedure adalah menduplikat seluruh baris barang_id dan nama_barang dari tabel barang_tb ke dalam tabel dumy_stock_tb. Triknya adalah membaca seluruh isi tabel barang_tb secara berulang, kemudian satu per satu baris yang terbaca di-INSERT-kan ke tabel dumy_stock_tb.

Berikut baris data barang_tb yang saya miliki dan akan kita duplikat ke tabel dumy_stock_tb:

Sedangkan baris tabel dumy_stock_tb masih kosong:

Sekarang buat Store Procedure dengan nama duplikat_data_sp sebagai berikut:

use penjualan_db;drop procedure if exists duplikat_data_sp;delimiter $$create procedure duplikat_data_sp()
begin
-- deklarasi variabel lokal yang dibutuhkan pada tabel dummy
declare vbarang_id char(10);
declare vnama_barang varchar(35);
declare vstock int unsigned default 10; -- stok dibuat 10 semua

declare done int default 0;

-- kursor adalah penunjuk baris tabel
declare kursor cursor for select barang_id, nama_barang from penjualan_db.barang_tb;

-- sebagai penanda bahwa penelusuran baris data selesai
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- aktifasi kursor
open kursor;

-- penelusuran baris tabel dimulai,
-- dan dilakukan perulangan sampai baris terakhir
cursorloop:loop
-- jika done = true artinya penelusuran berakhir
if done = true then
leave cursorloop;
end if;

-- proses pembacaan baris data tabel barang_tb satu per satu
fetch kursor into vbarang_id, vnama_barang;

-- setiap kali membaca baris data dari barang_tb, maka otomatis akan di-insert
-- ke dalam tabel dumy_stock_tb. Dimana field diperoleh dati tabel barang_tb
insert into dumy_stock_tb(barang_id, nama_barang, stock)
values(vbarang_id, vnama_barang, vstock);

end loop cursorloop;

-- penelusuran dihentikan
close kursor;

end$$
delimiter ;

Setelah dieksekusi dengan perintah Alt+X akan dihasilkan procedure duplikat_data_sp:

Sekarang kita coba untuk memanggail procedure duplikat_data_sp untuk membuktikan apakah duplikasi data dari tabel barang_tb ke tabel dumy_stock_tb sukses di duplikasi, ingat seharusnya semua stok untuk semua barang saya set 10:

use penjualan_db;
call duplikat_data_sp();
select * from dumy_stock_tb;

Gambar di atas menunjukkan bahwa kita sukses menduplikasi. Good Job!!!

Berikutnya, kita mencoba membuat sebuah TRIGER dari tabel dumy tersebut.

Skenario sederhananya adalah ketika kita menjual barang (terjadi pada tabel penjualan) maka otomatis stok pada tabel dumy akan berkurang. => Menjadi salah satu soal UAS

Untuk saat ini kita cukup membuat TRIGGER yang berkaitan dengan tabel dumy_stock_tb. Sebagai berikut:

use penjualan_db;-- hapus trigger jika pernah ada
DROP TRIGGER IF EXISTS trig_stok_tb;
delimiter $$-- bentuk trigger baru
CREATE TRIGGER trig_stok_tb
before insert ON penjualan_detil_tb
FOR EACH row
begin
-- meng update data stok ketika terjadi penjualan
-- dengan barangid tertentu
update dumy_stock_tb
set stock = stock - new.jumlah -- new mereference ke kolom jumlah tabel penjualan_detil_tb
where barang_id = new.barang_id; -- new mereference ke kolom barang_id tabel penjualan_detil_tb
end$$
delimiter ;

setelah dieksekusi dengan perintah ALT+X akan diperoleh TRIGGER baru seperti berikut:

Ok kita akan membuktikan apakah TRIGGER dapat bekerja atau tidak. Kita asumsikan bawah setiap kali terjadi penjualan maka stok pada tabel dumy_stock_tb akan berkurang.

Skrip di bawah ini saya coba dengan penjualan 1 pcs untuk tiga item barang (b1, b2, b3 dan b4).

Perhatikan bahwa posisi stok pada tabel dumy_stock_tb akan berkurang satu, yang semula 10 menjadi 9 untuk barang-barang tertentu sesuai dengan item barang yang dijual.

use penjualan_db;insert into penjualan_header_tb (penjualan_id, tanggal, kustomer_id) 
values ('xyz', '2021-12-28', '1');
-- penjualan_detil_id tidak diisi artinya dibuat otomatis
insert into penjualan_detil_tb (penjualan_id, barang_id, jumlah, harga) values ('xyz', 'b1', 1, 10000);
insert into penjualan_detil_tb (penjualan_id, barang_id, jumlah, harga) values ('xyz', 'b2', 1, 20000);
insert into penjualan_detil_tb (penjualan_id, barang_id, jumlah, harga) values ('xyz', 'b3', 1, 30000);
insert into penjualan_detil_tb (penjualan_id, barang_id, jumlah, harga) values ('xyz', 'b4', 1, 40000);
-- menampilkan perubahan stok pada tabel dumy_stock_tb
-- setelah mendapat perlakuan TRIGGER
select * from dumy_stock_tb
order by stock asc;

Demikian implementasi TRIGGER, kalian bisa berkreasi untuk kasus-kasus berbeda sesuai dengan masalah yang dihadapi.

Silahkan berlatih terus untuk mengasah intuisi kalian dalam memprogram database.

--

--

Dodit Suprianto

I am interested in IoT, especially cyber security on the IoT platform, develop functional edge computing, explore machine learning to solve IoT problems