Anda di halaman 1dari 4

1 / 4

Database Kelas Server cosmas @ 2008


DI KTAT
TRI GGER
(dalam diktat ini materi mengacu ke MySQL)
Oleh : Cosmas Haryawan
Trigger ?
Trigger adalah sebuah obyek dalam database yang berupa prosedur yang merespon setiap kali
terdapat proses modifikasi pada tabel
Proses modifikasi berupa: Insert, Update dan delete
Bentuk Umum
CREATE
TRIGGER trigger_name trigger_time trigger_event
ON table_name
FOR EACH ROW
[BEGIN]
trigger_statement
[END]
Catatan :
BEGIN END digunakan jika trigger_statement lebih dari satu baris
Trigger_name
Nama dari trigger, mengikuti aturan penamaan identifier
Trigger_time
Kapan waktu trigger terjadi
Berisi pilihan [BEFORE | AFTER]
BEFORE
Trigger dijalankan sebelum terjadinya proses dari statemen yang memicu trigger
AFTER
Trigger dijalankan sesudah terjadinya proses dari statemen yang memicu trigger
Trigger_event
Operasi / statement yang menyebabkan dijalankannya / memicu trigger
Pilihan isian [INSERT | UPDATE | DELETE]
INSERT
trigger dijalankan saat ada baris baru diisikan ke dalam tabel, misal melalui statement
INSERT, LOAD DATA, REPLACE
UPDATE
trigger dijalankan saat ada baris yang dimodifikasi, misal melalui statement UPDATE
DELETE
trigger dijalankan saat ada baris yang dihapus dari tabel, misal melalui statement DELETE
Table_name
Nama tabel yang mengalami operasi INSERT | UPDATE | DELETE sehingga memicu trigger
Tabel harus berupa tabel fisik, tidak boleh TEMPORARY tabel atau berupa VIEW
Trigger_Statement
Statement yang dijalankan saat trigger terpicu
Bisa berupa perintah SQL atau suatu Store Procedured / PL -SQL
Pada Trigger_Statement, apabila dibutuhkan pengaksesan data dari Table_name bisa digunakan
alias : OLD dan NEW
OLD adalah data sebelum dilakukan perubahan, misalnya sebelum UPDATE
NEW adalah data setelah dilakukan perubahan, misalnya setelah UPDATE
Contoh Penggunaan Trigger:
Akan dibuat dua buah tabel, tabel pertama adalah tabel nilai, sedangkan tabel kedua adalah ta bel Log
untuk mencatat kalau terjadi perubahan atau penghapusan isi tabel nilai
2 / 4
Database Kelas Server cosmas @ 2008
CREATE TABLE nilai (nim char(10), nilai char(1));
CREATE TABLE lognilai (ket varchar(50), nim char(10), nilai_lama char(1),
nilai_baru char(1));
Pembuatan Trigger saat terjadi Update
CREATE TRIGGER logUpd
AFTER UPDATE ON nilai
FOR EACH ROW
insert into lognilai
values ('Update Nilai', OLD.nim, OLD.nilai, NEW.nilai);
Pembuatan Trigger saat terjadi Delete
CREATE TRIGGER logDel
AFTER DELETE ON nilai
FOR EACH ROW
insert into lognilai
values ('Penghapusan Nilai',OLD.nim, OLD.nilai, '');
Pengisian Tabel Nilai
mysql> insert into nilai (nim, nilai) values
-> ('001','A'),('002','B'),('003','D'),('004','B');
mysql> select nim,nilai from nilai;
+------+-------+
| nim | nilai |
+------+-------+
| 001 | A |
| 002 | B |
| 003 | D |
| 004 | B |
+------+-------+
Karena tidak ada trigger saat insert maka isi logNilai saat ini masih kosong
mysql> select * from lognilai;
Empty set (0.00 sec)
Tes Trigger untuk Proses Update
mysql> update nilai set nilai = 'C' where nim = '002';
Karena terjadi Update, maka akan memicu / mentrigger untuk mengeksekusi logUpd
mysql> select * from logNilai;
+--------------+------+------------+------------+
| ket | nim | nilai_lama | nilai_baru |
+--------------+------+------------+------------+
| Update Nilai | 002 | B | C |
+--------------+------+------------+------------+
Tes Trigger Untuk Proses Delete
mysql> delete from nilai where nim = '004';
Karena terjadi Delete, maka akan memicu / mentrigger untuk mengeksekusi logDel
mysql> select * from logNilai;
3 / 4
Database Kelas Server cosmas @ 2008
+-------------------+------+------------+------------+
| ket | nim | nilai_lama | nilai_baru |
+-------------------+------+------------+------------+
| Update Nilai | 002 | B | C |
| Penghapusan Nilai | 004 | B | |
+-------------------+------+------------+------------+
Contoh Lain:
Akan dibuat simulasi potongan proses penjualan.
Dibuat 2 buah tabel yaitu : DJ UAL (detail jual) dan tabel BARANG
CREATE TABLE djual
(nojual char(10), kodebrg char(5), qty int, hjual float);
CREATE TABLE barang
(kodebrg char(5), namabrg varchar(30), stok int);
Skenario
Saat ada penjualan, maka akan ditambahkan (INSERT) baris baru di tabel DJ UAL, diharapkan
penambahan ini akan otomatis mengurangi stok di tabel barang
Diasumsikan tabel barang sudah berisi data :
+---------+---------+------+
| kodebrg | namabrg | stok |
+---------+---------+------+
| 001 | tas | 2 |
| 002 | buku | 5 |
| 003 | pensil | 1 |
+---------+---------+------+
Pembuatan Trigger
Untuk MySQL, dikarenakan di dalam trigger akan digunakan tanda semicolon (;) maka delimiter
untuk sementara dirubah menggunakan pipe ( | )
mysql> DELIMITER |
mysql> CREATE TRIGGER minStok
-> AFTER INSERT ON djual FOR EACH ROW
-> BEGIN
-> update barang set stok = stok - NEW.qty
-> where kodebrg = NEW.kodebrg;
-> END;
-> |
mysql> DELIMITER ;
Tes trigger Saat I nsert di djual
Diisikan 2 buah data di DJ UAL
mysql> insert into djual
-> (nojual,kodebrg,qty,hjual) values ('00001','001',1,2000);
mysql> insert into djual
-> (nojual,kodebrg,qty,hjual) values ('00001','002',2,5000);
Hasil
mysql> select * from djual;
+--------+---------+------+-------+
| nojual | kodebrg | qty | hjual |
+--------+---------+------+-------+
| 00001 | 001 | 1 | 2000 |
| 00001 | 002 | 2 | 5000 |
+--------+---------+------+-------+
2 rows in set (0.03 sec)
4 / 4
Database Kelas Server cosmas @ 2008
mysql> select * from barang;
+---------+---------+------+
| kodebrg | namabrg | stok |
+---------+---------+------+
| 001 | tas | 1 |
| 002 | buku | 3 |
| 003 | pensil | 1 |
+---------+---------+------+
3 rows in set (0.00 sec)
Contoh Trigger dengan I F
Skenario : akan dibuat tabel pegawai, kemudian diberikan f asilitas cek pengisian gaji dengan aturan :
kalau pengisian gaji < 100000 maka gaji akan dianggap 100000, sedangkan kalau pengisian melebihi
5000000 maka gaji akan dianggap 5000000
CREATE TABLE pegawai (npp char(10), nama char(30), gaji int);
Buat Trigger
mysql> delimiter |
mysql> CREATE TRIGGER cekgaji
-> BEFORE INSERT ON pegawai
-> FOR EACH ROW
-> BEGIN
-> if NEW.gaji < 100000 THEN
-> SET NEW.gaji = 100000;
-> elseif NEW.gaji > 5000000 THEN
-> SET NEW.gaji = 5000000;
-> end if;
-> END;
-> |
Tes Trigger
mysql> insert into pegawai (npp,nama,gaji) values
-> ('A001','TOTOK',50000),
-> ('B001','TITIK',3000000),
-> ('C001','TATAK',8000000);
Query OK, 3 rows affected (0.09 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from pegawai;
+------+-------+---------+
| npp | nama | gaji |
+------+-------+---------+
| A001 | TOTOK | 100000 |
| B001 | TITIK | 3000000 |
| C001 | TATAK | 5000000 |
+------+-------+---------+
3 rows in set (0.00 sec)
Untuk Menghapus trigger :
DROP TRI GGER trigger_name
Pada trigger statement juga bisa digunakan perintah PL/SQL seperti IF, WHILE, dll
Namun apabila menjadi kompleks akan lebih baik kalau perintah PL/SQL tadi dijadikan Stored
Procedured yang dipanggil dari Trigger tsb
Terlihat untuk data barang :
TAS (kode : 001) yang stok sebelumnya 2,
otomatis berubah menjadi 1 (terjual 1)
BUKU (kode : 002) yang stok sebelumnya 5,
otomatis berubah menjadi 3 (terjual 2)

Anda mungkin juga menyukai