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.
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.
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.
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.
Melihat
dan Menghapus Trigger yang Sudah Dibuat
Untuk
melihat TRIGGER kita bisa menggunakan syntax
mysql> show triggers in
lab4;
mysql> drop trigger
<nama_trigger>
Belum ada tanggapan untuk "Perintah SQL part 11"
Post a Comment