Trigger
adalah suatu objek database yang merupakan aksi atau prosedur yang dilakukan
jika terjadi perubahan pada row data suatu table. Trigger tidak dapat menjadi
bagian dari temporary table atau view.
Beberapa
contoh penggunaan trigger yang sangat berguna adalah jika kita ingin melakukan
kalkulasi tertentu yang tidak perlu "diketahui" aplikasi luar,
mencatat aktivitas operasi table misalkan untuk kepentingan change data capture (CDC),
dan lain-lain.
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
Keterangan :
- trigger_name : nama trigger.
- trigger_time : kapan kita mengeksekusi trigger, apakah sebelum atau sesudah perubahan pada row data table. Jadi pilihannya adalah AFTER atau BEFORE.
- trigger_event : merupakan event atau peristiwa yang menyebabkan trigger dilakukan. Pilihan event tersebut adalah INSERT, UPDATE, DELETE.
- tbl_name : nama table.
- trigger_body : statement-statement perintah SQL yang akan dilakukan. Jika perintahnya lebih dari satu maka gunakan dalam blok statement BEGIN ... END.
- Jika DEFINER dispesifikasikan maka kita memutuskan trigger tersebut dijalankan hanya oleh user tertentu (dalam format penulisan user@host). Jika tidak dispesifikasikan, maka user yang melakukan perubahan (CURRENT_USER) adalah pilihan default.
Karena
trigger digunakan pada saat terjadi perubahan row data, maka kita perlu
referensi ke row sebelum dan sesudah perubahan. Untuk ini ada dua alias yang
berfungsi untuk hal tersebut yaitu OLD dan NEW.
Sesuai
namanya, OLD digunakan untuk referensi sebelum perubahan dan NEW untuk
referensi sesudah perubahan.
Berikut adalah contoh penggunaan
trigger untuk event setelah penghapusan (AFTER DELETE) pada table "tr_penjualan"
- database phi_minimart. Langkah yang
akan kita lakukan adalah sebagai berikut :
- Kita
akan membuat satu table audit dengan nama "tr_penjualan_hapus"
yang berisi row-row yang dihapus dari table "tr_penjualan"
dengan tambahan dua field, yaitu tanggal penghapusan (tgl_perubahan)
dan user MySQL yang melakukan hal tersebut (nama_user).
Berikut adalah perintahnya :
USE phi_minimart;
CREATE TABLE `tr_penjualan_hapus` LIKE `tr_penjualan`;
ALTER TABLE `tr_penjualan_hapus` ADD
(
`tgl_perubahan` DATETIME,
`nama_user` VARCHAR(200)
);
CREATE TABLE `tr_penjualan_hapus` LIKE `tr_penjualan`;
ALTER TABLE `tr_penjualan_hapus` ADD
(
`tgl_perubahan` DATETIME,
`nama_user` VARCHAR(200)
);
- Tahap
berikutnya adalah membuat trigger yang akan melakukan populasi data yang
dihapus dari "tr_penjualan" ke table
"tr_penjualan_hapus".
Berikut adalah perintahnya :
DELIMITER |
CREATE TRIGGER hapus_tr_penjualan AFTER DELETE
ON tr_penjualan FOR EACH ROW
BEGIN
INSERT INTO tr_penjualan_hapus
( tgl_transaksi,
kode_cabang,
kode_kasir,
kode_item,
kode_produk,
jumlah_pembelian,
tgl_perubahan,
nama_user
)
VALUES
( OLD.tgl_transaksi,
OLD.kode_cabang,
OLD.kode_kasir,
OLD.kode_item,
OLD.kode_produk,
OLD.jumlah_pembelian,
SYSDATE(),
CURRENT_USER
);
END;
|
CREATE TRIGGER hapus_tr_penjualan AFTER DELETE
ON tr_penjualan FOR EACH ROW
BEGIN
INSERT INTO tr_penjualan_hapus
( tgl_transaksi,
kode_cabang,
kode_kasir,
kode_item,
kode_produk,
jumlah_pembelian,
tgl_perubahan,
nama_user
)
VALUES
( OLD.tgl_transaksi,
OLD.kode_cabang,
OLD.kode_kasir,
OLD.kode_item,
OLD.kode_produk,
OLD.jumlah_pembelian,
SYSDATE(),
CURRENT_USER
);
END;
|
DELIMITER ;
- Setelah
trigger di atas kita buat, sekarang saatnya kita melakukan pengujian. Coba
hapus tiga row data dari table "tr_penjualan" dan lihat
efeknya di table "tr_penjualan_hapus".
Jalankan perintah berikut :
DELETE FROM tr_penjualan LIMIT 3;
SELECT * FROM tr_penjualan_hapus;
SELECT * FROM tr_penjualan_hapus;
Terlihat pada gambar di atas 3 row
yang dihapus telah "pindah" ke table "tr_penjualan_hapus"
dengan tambahan informasi waktu penghapusan dan user yang menghapus.
4. Selesai.
Tidak ada komentar:
Posting Komentar