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)