Trigger
a. MEMBUAT TRIGGER
b. BEFORE TRIGGER
c. AFTER TRIGGER
d. MELIHAT TRIGGER YANG SUDAH DIBUAT
TRIGGER
Trigger adalah sebuah objek database yang
diasosiasikan dengan sebuah tabel. Trigger diaktifkan ketika sebuah event
terjadi pada tabel yang diasosiasikan. Tabel yang diasosiasikan dengan trigger
haruslah sebuah tabel yang permanen dan bukan temporary tabel.
1. Membuat Trigger
Trigger
bisa dibuat dengan syntax sbb :
CREATE
TRIGGER <trigger_name>
<trigger_time> <trigger_event>
ON
<table>
FOR EACH ROW <trigger_body statements>
Pada
sintaks di atas, trigger_name adalah
nama dari trigger yang akan kita buat.
Trigger_time adalah saat aktivasi trigger. Parameter
trigger_time dapat berisi BEFORE atau AFTER, yang menandakan apakah aktivasi
trigger dilakukan sebelum atau sesudah terjadi perubahan pada tabel.
Trigger_event menunjukkan jenis statement yang
mengaktifkan trigger.
Trigger_event dapat didefinisikan sebagai
salah satu dari:
·
INSERT:
trigger diaktifkan ketika sebuah baris baru ditambahkan ke tabel, sebagai
contoh melalui statement INSERT, LOAD DATA, atau REPLACE.
·
UPDATE:
trigger diaktifkan ketika sebuah baris dimodifikasi, sebagai contoh melalui
statement UPDATE.
·
DELETE:
trigger diaktifkan ketika sebuah baris dihapus, melalui statement DELETE dan
REPLACE. Namun demikian, DROP TABLE dan TRUNCATE TABLE tidak mengaktifkan
trigger DELETE
Tidak boleh ada dua buah trigger yang sama
pada sebuah tabel yang memiliki trigger_time dan trigger_event yang sama.
Sebagai contoh, kita tidak dapat membuat dua buah BEFORE UPDATE trigger pada
satu buah tabel yang sama, namun kita dapat membuat trigger BEFORE UPDATE dan
AFTER UPDATE untuk satu tabel yang sama.
trigger_body merupakan definisi statement
yang dijalankan ketika sebuah trigger diaktifkan. Jika ada beberapa statement
yang ingin dijalankan, statement-statement tersebut dapat didefinisikan di
antara BEGIN … AND.
Keyword OLD dan NEW dapat digunakan untuk
mereferensi nilai sebelum dan sesudah trigger dilakukan. Sebagai contoh
OLD.nama_kolom menunjukkan nilai kolom sebelum data tersebut dihapus atau
diupdate, sedangkan NEW.nama_kolom menunjukkan nilai kolom sebuah data yang
akan dimasukkan atau nilai kolom data setelah diupdate.
2. BEFORE TRIGGER
Berikut adalah contoh trigger yang
dijalankan sebelum data dimasukkan ke dalam sebuah tabel.
mysql> DELIMITER #
mysql> CREATE TRIGGER sebelum_insert
BEFORE INSERT ON pegawai FOR EACH ROW
BEGIN
IF NEW.gaji IS NULL OR
NEW.gaji = 0
THEN
SET NEW.gaji =
500000;
ELSE
SET NEW.gaji = NEW.gaji + 100000;
END
IF;
END
#
Query OK, 0 rows affected (0.23 sec)
Mysql>
DELIMITER ;
Dalam
TRIGGER diatas adalah salah satu contoh trigger yang akan dijalankan sebelum
sebuah even dipanggil (BEFORE INSERT). Dalam trigger ini akan mengganti
nilaigaji jika gaji yang di-INSERT-kan bernilai NULL atau 0 dan akan
menambahkan nilai 100rb jika kita masukkan selain NULL dan 0.
Berikut
contoh masukkan data setelah didefinisikan trigger :
INPUT
NILAI NULL atau 0
mysql>
insert into pegawai values('PEG-1017','Astuti','Kudus','Staff Junior',0);
Query OK,
1 row affected (0.05 sec)
mysql>
select * from pegawai;
+----------+-----------------------+-------------+-----------------+---------+
| nip | nama_peg | alamat_peg | jabatan | gaji |
+----------+-----------------------+-------------+-----------------+---------+
| PEG-1001 | Soeharto
Mangundirejo | Yogyakarta | C.E.O | 9000000 |
| PEG-1002 | Felix
Nababan | Medan | Manager | 8000000 |
| PEG-1003 | Olga
Syahrini | Jakarta | Kepala Unit | 6000000 |
| PEG-1004 | Chelsea
Olivia | Bandung | Kepala Unit | 6000000 |
| PEG-1005 | Tuti
Wardani | Jawa Tengah |
Supervisor | 4500000 |
| PEG-1006 | Budi
Drajat | Malang | Supervisor |
4500000 |
| PEG-1007 | Bambang
Pamungkas | Kudus | Staff Senior | 3000000 |
| PEG-1008 | Ely
Oktafiani | Yogyakarta | Staff Senior | 3000000 |
| PEG-1009 | Rani
Wijaya | Magelang | Staff Senior | 3000000 |
| PEG-1010 | Rano
Karno | Solo | Staff Junior | 2000000 |
| PEG-1011 | Rahmadi
Sholeh | Yogyakarta | Staff Junior | 2000000 |
| PEG-1012 | Ilham
Ungara | Jakarta | Staff Junior | 2000000 |
| PEG-1013 | Endang Melati | Madiun | Staff Junior | 2000000 |
| PEG-1014 | Donny
Damara | Makasar | Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem | Yogyakarta | Tenaga Kontrak |
500000 |
| PEG-1016 | Djono | Yogyakarta | Tenanga Kontrak | 1000000 |
| PEG-1017 | Astuti | Kudus | Staff Junior |
500000 |
+----------+-----------------------+-------------+-----------------+---------+
17 rows
in set (0.00 sec)
INPUT DENGAN NILAI
mysql> insert into pegawai
values('PEG-1018','Puspito','Magelang','Staff Junior',
Query OK, 1 row affected (0.03 sec)
mysql> select * from pegawai;
+----------+-----------------------+-------------+-----------------+---------+
|
nip | nama_peg | alamat_peg | jabatan | gaji |
+----------+-----------------------+-------------+-----------------+---------+
|
PEG-1001 | Soeharto Mangundirejo | Yogyakarta
| C.E.O | 9000000 |
|
PEG-1002 | Felix Nababan |
Medan | Manager | 8000000 |
|
PEG-1003 | Olga Syahrini |
Jakarta | Kepala Unit | 6000000 |
|
PEG-1004 | Chelsea Olivia |
Bandung | Kepala Unit | 6000000 |
|
PEG-1005 | Tuti Wardani | Jawa
Tengah | Supervisor | 4500000 |
|
PEG-1006 | Budi Drajat |
Malang | Supervisor | 4500000 |
|
PEG-1007 | Bambang Pamungkas |
Kudus | Staff Senior | 3000000 |
|
PEG-1008 | Ely Oktafiani |
Yogyakarta | Staff Senior | 3000000 |
|
PEG-1009 | Rani Wijaya |
Magelang | Staff Senior | 3000000 |
|
PEG-1010 | Rano Karno |
Solo | Staff Junior | 2000000 |
|
PEG-1011 | Rahmadi Sholeh |
Yogyakarta | Staff Junior | 2000000 |
|
PEG-1012 | Ilham Ungara | Jakarta
| Staff Junior | 2000000 |
|
PEG-1013 | Endang Melati |
Madiun | Staff Junior | 2000000 |
|
PEG-1014 | Donny Damara |
Makasar | Tenaga Kontrak | 1000000 |
|
PEG-1015 | Paijem |
Yogyakarta | Tenaga Kontrak |
500000 |
|
PEG-1016 | Djono |
Yogyakarta | Tenanga Kontrak | 1000000 |
|
PEG-1017 | Astuti |
Kudus | Staff Junior |
500000 |
| PEG-1018 | Puspito | Magelang | Staff Junior | 1100000 |
+----------+-----------------------+-------------+-----------------+---------+
18 rows in set (0.00 sec)
Namun demikian, kita tidak dapat mengupdate
tabel yang sama dengan tabel yang diasosiasikan dengan trigger menggunakan
trigger.
Mysql> DELIMITER #
mysql> CREATE TRIGGER
before_update BEFORE UPDATE ON pegawai FOR EACH ROW
BEGIN
UPDATE pegawai SET
gaji=gaji+(NEW.gaji - OLD.gaji) WHERE nip=NEW.nip;
END
#
Query OK, 0 rows affected
(0.03 sec)
mysql> DELIMITER ;
mysql> UPDATE pegawai
SET gaji = 2000000 WHERE nip="PEG-1017";
ERROR 1442 (HY000): Can't update table
'pegawai' in stored function/trigger because it is already used by statement
which invoked this stored function
/trigger.
3. AFTER TRIGGER
Berikut adalah
contoh trigger yang dijalankan setelah update dilakukan terhadap tabel
Untuk mencobanya kita buat dulu table
pencatat, nanti di table pencatat ini akan kita buat syntax untuk mencatat
perubahan yang terjadi.
mysql>
create table pencatat(catatan varchar(50));
Query
OK, 0 rows affected (0.48 sec)
mysql>
delimiter #
kita buat TRIGGERnya untuk
mencatat perubahan yang terjadi
mysql>
CREATE TRIGGER trigger_cat AFTER UPDATE ON pegawai FOR EACH ROW
BEGIN
INSERT INTO pencatat
VALUES(concat('akun',NEW.nip,'dari
',OLD.gaji,'to',NEW.gaji));
END
#
Query OK, 0 rows affected (0.17
sec)
mysql>
delimiter ;
Kita rubah nilai dari gaji yang ada
mysql> UPDATE pegawai SET
gaji=gaji+200000;
Query
OK, 18 rows affected (0.09 sec)
Rows
matched: 18 Changed: 18 Warnings: 0
mysql>
select * from pencatat;
+---------------------------------------+
|
catatan |
+---------------------------------------+
|
akun PEG-1001 dari 9000000 to 9200000 |
|
akun PEG-1002 dari 8000000 to 8200000 |
|
akun PEG-1003 dari 6000000 to 6200000 |
|
akun PEG-1004 dari 6000000 to 6200000 |
|
akun PEG-1005 dari 4500000 to 4700000 |
|
akun PEG-1006 dari 4500000 to 4700000 |
|
akun PEG-1007 dari 3000000 to 3200000 |
|
akun PEG-1008 dari 3000000 to 3200000 |
|
akun PEG-1009 dari 3000000 to 3200000 |
|
akun PEG-1010 dari 2000000 to 2200000 |
|
akun PEG-1011 dari 2000000 to 2200000 |
|
akun PEG-1012 dari 2000000 to 2200000 |
|
akun PEG-1013 dari 2000000 to 2200000 |
|
akun PEG-1014 dari 1000000 to 1200000 |
|
akun PEG-1015 dari 500000 to 700000 |
|
akun PEG-1016 dari 1000000 to 1200000 |
|
akun PEG-1017 dari 500000 to 700000 |
|
akun PEG-1018 dari 1100000 to 1300000 |
+---------------------------------------+
18 rows
in set (0.00 sec)
TRIGGER
diatas akan dieksekusi setelah perintah UPADATE dijalankan.
4. Melihat dan Menghapus Trigger yang Sudah
Dibuat
Untuk
melihat TRIGGER kita bisa menggunakan syntax
mysql> show triggers in lab4;
mysql> drop trigger <nama_trigger>