Trigger merupakan bentuk khusus dari Stored Procedure (SProc) yang merespon pada event tertentu. Ada 2 bentuk Trigger yaitu (1) DDL Trigger dan (2) DML Trigger. DDL Trigger melakukan proses ketika terjadi perubahan pada struktur database melalui CREATE, ALTER, DROP, dan statement sejenis. DML Trigger merupakan sekumpulan kode yang ditempelkan pada tabel atau view. Tidak seperti SProc, yang dipanggil secara eksplisit, Trigger secara otomatis dijalankan ketika terjadi event pada tabel atau view.
Gambar 1 Trigger dalam database Ada 3 event dalam Trigger, sesuai dengan Gambar 1, yang mengikuti 3 tipe DML pada SQL. Dari ketiga event ini, Trigger juga mampu melakukan hibridisasi, yaitu pencampuran 2 event. Event-event ini antara lain:
Trigger Pemrograman Basis Data pg. 2 1. INSERT Trigger 2. DELETE Trigger 3. UPDATE Trigger Seperti yang dijelaskan sebelumnya bahwa Trigger merespon pada event tertentu dan Trigger menempel pada tabel atau view, maka sintaks untuk membuat Trigger sedikit istimewa dibandingkan sintaks DDL lainnya. Pembuatan Trigger Masih sama seperti database object lainnya, Trigger dibuat, diubah dan dihapus menggunakan perintah DDL. CREATE TRIGGER <nama trigger> ON [<nama schema>.]<nama tabel> [WITH ENCRYPTION] {FOR|AFTER|INSTEAD OF} <[DELETE][,][INSERT][,] [UPDATE]> AS BEGIN <SQL> | <script block> END; -- ALTER TRIGGER <trigger_name> ON [<nama schema>.]<nama tabel|view> [WITH ENCRYPTION] {FOR|AFTER|INSTEAD OF} <[DELETE][,][INSERT][,] [UPDATE]> AS BEGIN <SQL> | <script block> END; -- DROP TRIGGER <nama trigger>; ON Bagian ini digunakan untuk menuliskan pada tabel atau view mana Trigger akan ditempatkan. Trigger Pemrograman Basis Data pg. 3 WITH ENCRYPTION Dengan aktifnya property ini, secara otomatis sistem akan melakukan enkripsi terhadap Trigger. Sehingga tidak ada seorang pun, bahkan sang pembuat, yang dapat melihat kode Trigger. Sebagai tambahan, property ini juga dapat digunakan pada view dan SProc. FOR|AFTER vs INSTEAD OF Trigger terjadi karena event tertentu baik sebelum (INSTEAD OF) maupun setelah (FOR/AFTER) event terjadi. AFTER Trigger dikerjakan setelah data masuk kedalam Trigger, berbeda dengan INSTEAD OF Trigger yang dikerjakan sebelum data di-INSERT- kan. Sehingga ada 2 model data dalam Trigger, yaitu: 1. INSERTED data Data ini diperoleh dari event INSERT. Untuk pengambilan datanya, perhatikan query berikut ini. SELECT * FROM INSERTED; 2. DELETED data Data ini diperoleh dari event DELETE. Untuk pengambilan datanya perhatikan query berikut ini. SELECT * FROM DELETED; Untuk proses UPDATE, tidak ada UPDATED data. Update adalah proses DELETE yang dilanjutkan dengan proses INSERT. Oleh karena itu, dalam kasus UPDATE, perlu dipertimbangkan DELETED sebagai data lama (old value) dan INSERTED sebagai data baru (new value). Dalam beberapa permasalahan, kita harus memanipulasi data setelah kondisi terpenuhi. Misal ketika terjadi transaksi penjualan, maka terjadi penambahan data pada tabel penjualan. No transaksi, untuk alasan integritas data dan keamanan, harus dibangkitkan secara otomatis oleh SQL Server. Jadi ketika user melakukan INSERT INTO, hanya data-data yang terlihat ketika transaksi yang menjadi bagian dari VALUES (misal, nama Trigger Pemrograman Basis Data pg. 4 customer dan barang yang dibeli). Nah, bagaimana cara kita membuat no transaksinya? Belum lagi jika terjadi kesalahan entri yang akan mengakibatkan kerusakan data! INSTEAD OF Trigger memberikan solusi untuk permasalahan ini. Seperti yang telah disebutkan sebelumnya, FOR atau AFTER Trigger merupakan Trigger yang dikerjakan setelah data termanipulasi. Sebaliknya, INSTEAD OF Trigger mampu mengerjakan proses sebelum data masuk kedalam Trigger. Sehingga dapat dilakukan pembangkitan no transaksi. Ketika terjadi sesuatu yang menyebabkan kondisi, sebelum data dientrikan, menjadi FALSE, maka SQL Server melakukan pembatalan transaksi. Alur dari Trigger dapat dilihat pada Gambar 2.
Gambar 2. Alur proses Trigger Trigger Pemrograman Basis Data pg. 5 INSERT|UPDATE|DELETE Bagian ini menspesifikasikan pada event apa Trigger akan dieksekusi. Seperti yang telah disebutkan sebelumnya, event bisa terjadi pada event tunggal atau pun campuran ketiganya. Untuk yang campuran, kita harus menggunakan koma untuk memisah masing-masing event. Sebagai contoh penggunaan Trigger, misal ketika terjadi transaksi penjualan, sistem secara otomatis melakukan pengubahan jumlah saldo yang dimiliki oleh customer. Pengubahan jumlah saldo ini terjadi setelah data transaksi masuk kedalam tabel Penjualan. Perhatikan hasil querynya berikut ini: CREATE TRIGGER tg_ins_for_Penjualan ON Penjualan FOR INSERT AS BEGIN UPDATE Customer SET Saldo=Saldo-INSERTED.TotalJual WHERE CustID=INSERTED.CustID; END; Karena terjadi pada event INSERT, maka trigger mempunyai hak akses kedalam tabel INSERTED. Uji Coba Trigger Kita akan mencoba mencatat semua transaksi yang terjadi pada tabel mahasiswa kedalam log_tr_mhs. Karena tabel ini belum ada, kita akan membuatnya terlebih dahulu menggunakan script berikut: CREATE TABLE log_mhs( logid INT CONSTRAINT PK_log_mhs PRIMARY KEY, nim CHAR(11), jns_dml CHAR(1) CONSTRAINT CK_log_mhs_dml CHECK(jns_dml IN('I', 'U', 'D')), waktu DATETIME ); Trigger Pemrograman Basis Data pg. 6 Untuk setiap proses INSERT dalam tabel mahasiswa, SQL Server akan menyimpan transaksi insert tersebut kedalam tabel log_mhs secara otomatis. CREATE TRIGGER tg_ins_for_mahasiswa ON mahasiswa FOR INSERT AS BEGIN -- buat logid DECLARE @logid INT; SET @logid = (SELECT COUNT(*)+1 FROM mahasiswa);
DECLARE @nim CHAR(11); SELECT @nim=nim FROM INSERTED;
INSERT INTO log_mhs VALUES(@logid, @nim, 'I', GETDATE()); END; Setelah kita buat Trigger-nya, sekarang kita coba untuk mengmasukkan data kedalam tabel mahasiswa. INSERT INTO mahasiswa VALUES('10390102001', 'Rahmat', 'Jl. Gubeng 23', 'Surabaya', 'P', 'B'); Setelah itu, kita coba lihat kedalam tabel log_mhs. SELECT * FROM log_mhs; Hasil: logid nim jns_dml waktu 11 10390102001 I 2011-08-25 14:11:12.610