Trigger
- Trigger adalah objek di dalam database yang berasosiasi dengan suatu tabel.
- Trigger akan diaktivasi ketika tabel tersebut dikenai event tertentu.
- Event merupakan suatu kejadian yang menimpa tabel, bisa berupa penambahan, perubahan maupun penghapusan data.
Sebelum lebih lanjut membahas trigger, ada baiknya kita siapkan dulu tabel khusus untuk operasi trigger nantinya.
USE buku_db;
CREATE TABLE histori_buku(
buku_isbn CHAR(13),
buku_judul VARCHAR(75),
penerbit_id CHAR(4),
buku_tglterbit DATE,
buku_jmlhalaman INT,
buku_deskripsi TEXT,
buku_harga DECIMAL(10, 0),
aksi varchar(6),
aksi_tgl DATE
);
Alasan Menggunakan Trigger
Beberapa alasan kita menggunakan trigger adalah:
- Trigger dapat memvalidasi data yang akan dimasukkan maupun yang akan digunakan untuk melakukan perubahan data.
- Trigger dapat memperoleh nilai lama dari baris data yang dihapus atau dirubah (misalnya untuk pencatatan histori data suatu tabel).
- Trigger dapat mengolah nilai kolom pada tabel lain.
Selain ketiga manfaat di atas, Trigger juga dapat meringankan kode di bagian aplikasi atau stored procedure yang dikembangkan. Kita tidak perlu menulis kode program di dalam aplikasi untuk melakukan validasi data.
Konsep Trigger
Beberapa konsep yang perlu diketahui dan dipahami tentang trigger yaitu:
- Trigger adalah objek database yang berisi kumpulan perintah SQL yang akan dieksekusi atau diaktivasi ketika suatu event terjadi.
- Dalam satu database, kita dapat mendefinisikan lebih dari satu trigger. Setiap trigger harus memiliki nama yang unik.
- Trigger harus berasosiasi dengan tabel tertentu sebagai pemicu trigger untuk menentukan kapan trigger yang bersangkutan akan dieksekusi.
- Trigger memiliki event:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
- Trigger memiliki referensi
NEW
danOLD
.
Daftar Event untuk Aktivasi Trigger
Event | Keterangan |
---|---|
BEFORE INSERT |
Trigger diaktivasi sebelum data ditambahkan ke dalam suatu tabel. |
AFTER INSERT |
Trigger diaktivasi setelah data ditambahkan ke dalam suatu tabel. |
BEFORE UPDATE |
Trigger diaktivasi sebelum data dalam suatu tabel diubah. |
AFTER UPDATE |
Trigger diaktivasi setelah data daalam suatu tabel diubah. |
BEFORE DELETE |
Trigger diaktivasi sebelum data dihapus daru suatu tabel. |
AFTER DELETE |
Trigger diaktivasi setelah data dihapus dari suatu tabel. |
Membuat Trigger
Format pembuatan trigger adalah
CREATE TRIGGER [nama_trigger]
[BEFORE | AFTER]
[INSERT | UPDATE | DELETE]
ON [nama_tabel]
FOR EACH ROW
BEGIN
[badan trigger]
END
DELIMITER $$
CREATE TRIGGER tr_ai_buku
AFTER INSERT
ON BUKU
FOR EACH ROW
BEGIN
INSERT INTO histori_buku VALUES (
new.buku_isbn,
new.buku_judul,
new.penerbit_id,
new.buku_tglterbit,
new.buku_jmlhalaman,
new.buku_deskripsi,
new.buku_harga,
'INSERT',
CURRENT_DATE()
);
END $$
Penjelasan Kode
- Perintah di atas akan membuat trigger
tr_ai_buku
yang akan diaktivasi setiap kali user memasukkan baris data baru ke dalam tabelbuku
. - Trigger tersebut akan memasukkan data baru ke dalam tabel
histori_buku
, nilainya diambil dari data yang baru saja dimasukkan ke dalam tabelbuku
. - Untuk mengambil nilai dari data yang baru dimasukkan menggunakan referensi
new
seperti padanew.buku_isbn
. 'INSERT'
digunakan untuk mengisi jenis aksi yang dilakukan oleh user.CURRENT_DATE()
berfungsi untuk mengisi nilai kolom berisi tanggal saat proses memasukkan data.- Perintah
DELIMITER $$
berfungsi untuk menentukan bahwa tanda$$
akan digunakan sebagai pembatas berakhirnya pembuatan kode trigger.
Memeriksa Pengaruh Trigger
Untuk memeriksa pengaruh daripada trigger, sekarang kita coba memasukkan sampel data ke dalam tabel buku.
INSERT INTO buku VALUES(
'999-11555-2-2',
'Microsoft Excell',
'PB04',
'2009/02/07',
200,
NULL,
60000
);
buku
dan ada data baru di tabel histori_buku
. Mari kita cek.
Referensi Trigger : NEW-OLD
Referensi NEW
dan OLD
berguna untuk mengambil:
- nilai-nilai yang akan dimasukkan ke dalam tabel (melalui perintah
INSERT
) - nilai-nilai yang akan digunakan untuk mengubah data (melalui perintah
UPDATE
), atau - nilai-nilai dari satu baris data yang telah dihapus (melalui perintah
DELETE
).
Sebagai contoh:
Jika perintah di atas dieksekusi maka MySQL akan menyimpan nilai-nilai tersebut ke dalam referensi NEW
. Dengan demikian new.penerbit_id
akan bernilai PB06
dan new.penerbit_nama
akan bernilai INFORMATIKA
.
Contoh lagi
- Pada perintah
UPDATE
, referensiNEW
berfungsi untuk menyimpan nilai-nilai yang akan digunakan untuk melakukan perubahan. - Nilai lama yang akan ditimpa dapat diakses menggunakan referensi
OLD
. new.penerbit_nama
bernilaiInformatika Bandung
, sedangkanold.penerbit_nama
bernilaiINFORMATIKA
.
Contoh lagi
- Ketika perintah tersebut dieksekusi, maka referensi
OLD
akan menyimpan nilai-nilai dari baris data yang dihapus. - Maka
old.penerbit_id
bernilaiPB06
.
Kesimpulan
- Referensi
NEW
akan menyimpan data baru pada prosesINSERT
danUPDATE
- Referensi
OLD
akan menyimpan data lama pada prosesUPDATE
danDELETE
- Baik referensi
NEW
maupunOLD
bisa diakses dengan formatnew.[nama_kolom]
atauold.[nama_kolom]
contohnew.penerbit_nama
atauold.penerbit_nama
Menghapus Trigger
Untuk menghapus trigger kita bisa menggunakan perintah DROP TRIGGER
dengan format
Mari kita coba
Sebenarnya kita bisa juga menghapus trigger tanpa mencantumkan nama databasenya, asalkan saat ini kita sedang mengaktifkan/ menggunakan databasenya.
Hak Akses Trigger
- Untuk bisa membuat dan menghapus trigger kita perlu memiliki hak akses
SUPER
. - Jika di dalam trigger kita menggunakan referensi
NEW
danOLD
, maka kita perlu memiliki hak akses tambahan yaitu:UPDATE
, agar bisa mengisi nilai kolom dengan perintahSET NEW.[nama_kolom] = [nilai]
,SELECT
, agar bisa menggunakan referensiNEW.[nama_kolom]
Batasan Trigger
Kita sudah tahu bahwasanya menggunakan trigger dapat membantu pekerjaan kita, namun kita perlu tahu juga bahwasanya trigger juga memiliki beberapa batasan berikut.
- Kita tidak dapat menggunakan perintah
CALL
(perintah untuk mengeksekusi stored procedure), - Kita tidak dapat melakukan transaksi, semisal
COMMIT
danROLLBACK
, - Kita tidak dapat membuat trigger untuk tabel temporari.
Implementasi Trigger
- Untuk memberikan kasus yang lebih nyata, kita akan mencoba membuat beberapa trigger sesuai dengan database yang sedang kita kelola yaitu
buku_db
. - Kita akan membuat trigger
AFTER UPDATE
danAFTER DELETE
yang bertujuan untuk mencatat setiap perubahan data dan penghapusan data pada tabelbuku
, nantinya catatan tersebut disimpan di tabelhistori_buku
Trigger AFTER UPDATE
Membuat trigger tr_au_buku
yang akan diaktivasi setiap kali user mengubah data pada tabel buku
.
DELIMITER $$
CREATE TRIGGER tr_au_buku
AFTER UPDATE
ON buku
FOR EACH ROW
BEGIN
DECLARE isbn CHAR(13);
DECLARE judul VARCHAR(75);
DECLARE penerbit_id CHAR(4);
DECLARE tgl_terbit DATE;
DECLARE jml_halaman INT;
DECLARE deskripsi TEXT;
DECLARE harga DECIMAL(10,0);
-- Mengisi nilai isbn
IF new.buku_isbn IS NULL THEN
SET isbn = old.buku_isbn;
ELSE
SET isbn = new.buku_isbn;
END IF;
-- mengisi nilai judul
IF new.buku_judul IS NULL THEN
SET judul = old.buku_judul;
ELSE
SET judul = new.buku_judul;
END IF;
-- mengisi nilai penerbit_id
IF new.penerbit_id IS NULL THEN
SET penerbit_id = old.penerbit_id;
ELSE
SET penerbit_id = new.penerbit_id;
END IF;
-- mengisi nilai tgl_terbit
IF new.buku_tglterbit IS NULL THEN
SET tgl_terbit = old.buku_tglterbit;
ELSE
SET tgl_terbit = new.buku_tglterbit;
END IF;
-- mengisi nilai jml_halaman
IF new.buku_jmlhalaman IS NULL THEN
SET jml_halaman = old.buku_jmlhalaman;
ELSE
SET jml_halaman = new.buku_jmlhalaman;
END IF;
-- mengisi nilai deskripsi
IF new.buku_deskripsi IS NULL THEN
SET deskripsi = old.buku_deskripsi;
ELSE
SET deskripsi = new.buku_deskripsi;
END IF;
-- mengisi nilai harga
IF new.buku_harga IS NULL THEN
SET harga = old.buku_harga;
ELSE
SET harga = new.buku_harga;
END IF;
-- memasukkan data ke dalam tabel histori_buku
INSERT INTO histori_buku
VALUES (
isbn,
judul,
penerbit_id,
tgl_terbit,
jml_halaman,
deskripsi,
harga,
'UPDATE',
CURRENT_DATE()
);
END $$
Trigger AFTER DELETE
Membuat trigger tr_ad_buku
yang akan diaktivasi setiap kali user mengubah data pada tabel buku.
DELIMITER $
CREATE TRIGGER tr_ad_buku
AFTER DELETE
ON buku
FOR EACH ROW
BEGIN
INSERT INTO histori_buku VALUES(
old.buku_isbn,
old.buku_judul,
old.penerbit_id,
old.buku_tglterbit,
old.buku_jmlhalaman,
old.buku_deskripsi,
old.buku_harga,
'DELETE',
CURRENT_DATE()
);
END $$
Sebagai percobaan, sekarang kita coba mengubah data pada tabel buku
.
UPDATE buku
SET penerbit_id = 'PB05',
buku_jmlhalaman = 254,
buku_harga = 64000
WHERE
buku_isbn = '999-11555-2-2';
Selanjutnya, kita coba menghapus data dari tabel buku
.
Harusnya ada tambahan 2 baris data pada tabel histori_buku
. Sekarang mari kita cek.
Trigger BEFORE INSERT
- Kali ini kita juga akan membuat trigger yang berfungsi melakukan validasi sebelum data dimasukkan ke dalam tabel
buku
. - Sebagai contoh, kita ingin memastikan bahwa kolom
buku_jmlhalaman
harus lebih besar dari 149, dan jika nilainya sama atau lebih kecil, maka MySQL server akan menolak untuk memasukkan baris data tersebut.
DELIMITER $$
CREATE TRIGGER tr_bi_buku
BEFORE INSERT
ON buku
FOR EACH ROW
BEGIN
IF new.buku_jmlhalaman <= 149 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Tidak bisa menambah buku, jumlah halaman terlalu sedikit.';
END IF;
END $$
Untuk membuktikan pengaruh trigger tersebut, sekarang kita coba tambahkan data buku baru.
INSERT INTO buku VALUES(
'999-11555-2-3',
'Microsoft Publisher',
'PB04',
'2021/02/07',
100,
NULL,
6000
);
Hasilnya? 😎