Modul Basis Data (Trigger)
Modul Basis Data (Trigger)
A. Tujuan
Memahami konsep dasar trigger di dalam basis data.
Memahami implementasi trigger sebagai bentuk respon atas suatu kejadian.
Mampu menyelesaikan kasus-kasus manipulasi data yang kompleks dengan memanfaatkan
trigger.
B. Dasar Teori
1. Trigger
Trigger dapat didefinisikan sebagai himpunan kode (prosedural) yang dieksekusi secara
otomatis sebagai respon atas suatu kejadian berkaitan dengan tabel basis data. Kejadian (event)
yang dapat membangkitkan trigger umumnya berupa pernyataan INSERT, UPDATE dan
DELETE.
Berdasarkan ruang lingkupnya, trigger diklasifikasikan menjadi dua jenis : row trigger dan
statetment trigger. Trigger baris (row) mendefinisikan aksi untuk setiap baris tabel : trigger
pernyataan hanya berlaku untuk setiap pernyataan INSERT, UPDATE dan DELETE.
Umumnya ada dua jenis eksekusi trigger yaitu BEFORE dan AFTER dalam merepresentasikan
waktu eksekusi antara sebelu atau sesudah pernyataan-pernyataan yang berkorespondensi.
Adakalanya trigger dipandang sebagai bentuk spesifik dari stored procedure. Bagaimanapun,
trigger akan dipanggil (secara otomatis) ketika event terjadi, sedangkan stored procedure harus
dipanggil secara eksplisit.
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
trigger_event : berupa kejadian yang akan dijalan trigger
tbl_name : Nama tabel yang berasosiasi dengan trigger
trigger_stmt : Statement yang akan dijalankan
MYSQL tidak mengizinkan multiple trigger dengan waktu aksi dan event yang sama pada satu
tabel yang sama. Misalkan di tabel A sudah didefinisikan trigger AFTER INSERT, maka tidak
boleh mendefinisikan trigger AFTER INSERT lagi, namu AFTER EDIT, AFTER DELETE
atau BEFORE (INSERT, EDIT dan DELETE) bisa diterima.
2. Latihan
Pernyataan di atas memiliki arti untuk mengganti Semester jika Semester yang dimasukkan
bernilai NULL atau 0.
Untuk memcoba hasil trigger coba tambahkan data mahasiswa ke dalam tabel mahasiswa,
dengan kondisi field Semester diisi 0 atau NULL
Periksa hasilnya :
Terlihat bahwa trigger sudah bekerja seperti yang diharapkan, dimana penambahan baru
dengan kondisi Semester 0 atau NULL akan diganti menjadi 1.
Untuk mendapatkan informasi mengenai daftar trigger yang telah terdefinisi, gunakan perintah
SHOW TRIGGERS (tambahkan \G untuk menampilkan data secara vertikal)
SHOW TRIGGERS\G;
Dalam kasus kali ini, kita mengambil kasus koperasi mahasiswa. Untuk mencoba Keyword
OLD dan NEW, buatlah tabel berikut ini :
Ketikkan query berikut untuk pembuatan trigger menggunakan keyword NEW. Trigger ini
bertujuan apabila ada penambahan data pembelian akan mengakibatkan nilai stock barang
bertambah menyesuaikan banyaknya nilai jumlah pembelian.
DELIMITER //
CREATE TRIGGER updateStock
AFTER INSERT ON tbPembelian
FOR EACH ROW BEGIN
UPDATE tbBarangKopMhs
SET stock = stock + NEW.jum_beli
WHERE kd_barang = NEW.kd_barang;
END //
DELIMITER ;
Eksekusi file trigger dengan cara menambahkan data baru pada tbBarangKopMhs
INSERT INTO tbPembelian VALUES
(,kd0004,48);
stock awal
stock setelah
penambahan
Penggunaan keyword OLD bisa digunakan untuk trigger DELETE. Kita akan mendefinisikan
trigger untuk menghapus semua data pembelian manakala data barang yang sesuai
diindikasikan melalui primary key (kd_barang) di tbBarangKopMhs dan foreign key
(kd_barang) di tbPembelian.
Buatlah trigger berikut :
DELIMITER //
CREATE TRIGGER hapusForeign
AFTER DELETE on tbBarangKopMHS
FOR EACH ROW BEGIN
DELETE FROM tbPembelian
WHERE kd_barang = OLD.kd_barang;
END //
DELIMITER ;
Penggunaan trigger UPDATE bisa memanfaatkan keyword NEW maupun OLD. Kita akan
mendefiniskan trigger untuk mengupdate stock barang di Tabel Barang ketika terjadi
perubahan di jumlah beli di Tabel Pembelian.
DELIMITER //
CREATE TRIGGER editStock
AFTER UPDATE ON tbPembelian
FOR EACH ROW BEGIN
UPDATE tbBarangKopMhs
SET stock = stock (NEW.jum_beli OLD.jum_beli)
WHERE kd_barang = NEW.kd_barang;
6.
END //
DELIMITER ;
Trigger Kompleks
Persoalan yang pelik dapat diatasi dengan trigger, karena trigger juga bisa mengandung
pernyataan-pernyataan yang komples termasuk percabangan, perulangan, fungsi agregat,
bahkan pemanggilan prosedur atau fungsi.
Sebagai contoh, kita akan mendifiniskan trigger pada Tabel Barang (tbBarangKopMhs),
Tabel Penjualan (tbPenjualanKopMhs) dan Tabel Detail Penjualan (tbDetailJualKopMhs).
DELIMITER //
CREATE TRIGGER totalSatuan
BEFORE INSERT ON tbDetailJualKopMhs
FOR EACH ROW BEGIN
DECLARE jum INT;
SET jum = (SELECT harga_satuan FROM tbBarangKopMhs WHERE
kd_barang = NEW.kd_barang);
SET NEW.total = NEW.banyak * jum;
END //
DELIMITER ;
2. Trigger juga bisa didefiniskan untuk UPDATE di 2 tabel atau lebih. Kita akan membuat
trigger apabila terjadi penambahan data di Tabel Detail Penjualan (tbDetailJualKopMhs),
maka stock barang di Tabel Barang (tbBarangKopMhs) akan berkurang sesuai dengan
banyaknya jumlah penjualan. Selain itu juga mengupdate total di Tabel Penjualan
(tbPenjualanKopMhs) sesuai dengan jumlah total di Tabel Detail Penjualan
(tbDetailJualKopMhs) dengan syarat id_penjualan yang sama.
DELIMITER //
CREATE TRIGGER updateBarangPenjualan
AFTER INSERT ON tbDetailJualKopMhs
FOR EACH ROW BEGIN
UPDATE tbBarangKopMhs, tbPenjualanKopMhs
SET
tbBarangKopMhs.stock = stock NEW.banyak,
tbPenjualanKopMhs.total = total + NEW.total
WHERE tbBarangKopMhs.kd_barang = NEW.kd_barang
AND tbPenjualanKopMhs.id_penjualan = NEW.id_penjualan;
END //
DELIMITER ;
4. Cobalah eksekusi trigger tersebut dengan melakukan penambahan data baru di Tabel Detail
Penjualan (tbDetailPenjualanKopMhs) dengan id_penjualan yang sudah ada di Tabel
Penjualan (tbPenjualanKopMhs).
Jumlah Penjualan di Tabel Penjualan dengan id_penjualan yg sama juga telah terupdate
Jumlah stock barang di Tabel Barang berkurang sesuai dengan jumlah penjualan
DELIMITER //
CREATE FUNCTION kdOtomatis (nomer INT)
RETURNS VARCHAR(8)
BEGIN
DECLARE kodebaru VARCHAR(8);
DECLARE urut INT;
SET urut = IF(nomer IS NULL, 1, nomer + 1);
SET kodebaru = CONCAT(DP, LPAD(urut, 6, 0));
RETURN kodebaru;
END //
DELIMITER ;
6. Buatlah trigger untuk memanggil function yang telah kita buat sebelumnya.
DELIMITER //
CREATE TRIGGER kodeOtomatis
BEFORE INSERT ON tbPenjualanKopMhs
FOR EACH ROW BEGIN
DECLARE s VARCHAR(8);
DECLARE i INT;
SET i = (SELECT SUBSTRING(id_penjualan, 3, 6) AS Nomer
FROM tbPenjualanKopMhs ORDER BY Nomer DESC LIMIT 1);
SET s =(SELECT kdOtomatis(i));
IF (NEW.id_penjualan IS NULL OR NEW.id_penjualan = )
THEN SET NEW.id_penjualan = s;
SET NEW.tgl_jual = NOW();
END IF;
END //
DELIMITER ;
penjelasan :
SET i = (SELECT SUBSTRING (id_penjualan, 3, 6) AS Nomer FROM
tbPenjualanKopMhs ORDER BY Nomer DESC LIMIT 1
SUBSTRING memotong string di bagian tertentu, jadi substring mengambil nilai dari
char ke-3 sepanjang 6 char. Kemudian Order by nomer desc limit 1 adalah
mendapatkan nilai dari record paling akhir sehingga mendapatkan nilai terbesar.
7. Selanjutnya coba eksekusi trigger yang telah dibuat dengan menambahkan data baru di
Tabel Penjualan (tbPenjualanKopMhs)
C. Tugas
1. Bautlah tabel baru dengan nama : tbNilai, merupakan Tabel Nilai dengan deskripsi
2. Definisikan trigger pada Tabel Nilai, sehingga saat melakukan INSERT dan UPDATE nilai
nilai_angka maka, nilai_huruf akan otomatis menyesuaikan dengan ketentuan yang telah
ditetapkan. Kemudian field ket akan otomatis terisis LULUS atau TIDAK LULUS
apabila nilai_angka dibawah 60 maka diberikan keterangan TIDAK LULUS dan
sebaliknya.
Syarat nilai_huruf :
nilai_angka 80 : A
nilai_angka 70 dan < 80 : B
nilai_angka 60 dan < 70 : C
nilai_angka 50 dan < 60 : D
nilai_angka < 50 : E
3. Buatlah Tabel Log dengan nama : tbLogMhs dengan field user, keterangan dan waktu.
Selanjutnya definisikan triiger di Tabel Mahasiswa (tbMahasiswa) untuk merekam
operasi INSERT, UPDATE dan DELETE.