Navigation | Trigger

Trigger

DEFINISI
Trigger adalah blok PL/SQL yang disimpan dalam database dan dijalankan secara implisit sebagai respon terhadap perubahan yang telah ditentukan dalam database.
Perintah DML seperti INSERT, UPDATE, dan DELETE adalah pemicu umum terjadinya trigger. Operasi DDL seperti ALTER dan DROP juga dapat memicu dijalankannya trigger.

FUNGSI DAN KELEBIHAN
Fungsi dan kelebihan penggunaan trigger antara lain:
•Memperbaiki integritas data dengan membuat integrity constraint yang kompleks yang mana tidak mungkin ditangani oleh sintaks pembutan tabel.
•Memvalidasi transaksi data.
•Memperbaiki keamanan database dengan menyediakan audit yang lebih kompleks mengenai informasi perubahan database dan user siapa yang melakukan perubahan.

SINTAKS
CREATE [OR REPLACE] TRIGGER [user.]nama_trigger
{BEFORE | AFTER | INSTEAD OF}
{DELETE | INSERT | UPDATE [OF nama_kolom [, nama_kolom] …]}
[OR {DELETE | INSERT | UPDATE [OF column [, column] …]}]…
ON [user.]{nama_tabel | nama_view}
[{REFERENCING {OLD [AS] old_value | NEW [AS] new_value} …]
FOR EACH {ROW | STATEMENT} [WHEN (condition)]
PL/SQL_BLOCK

Nama trigger sebaiknya dengan jelas mencerminkan tabel yang diaplikasikan. Perintah DML trigger, status before/after, dan apakah row level atau statement level.
misalnya trigger BEFORE UPDATE dengan row level pada tabel KARYAWAN dapat diberi nama bef_upd_row_karyawan.

TIPE TRIGGER

a. Row-level and Statement-level Trigger
Row-level and Statement-level trigger merupakan pembagian trigger berdasarkan jumlah aksinya.
Row-level trigger dieksekusi untuk setiap row yang dimanipulasi pada suatu transaksi. Dengan kata lain, row-level trigger mengerjakan trigger action satu kali untuk setiap row yang sedang dimanipulasi. Penerapan trigger ini ditunjukkan oleh adanya klausa FOR EACH ROW.
Statement-level trigger dieksekusi satu kali pada suatu transaksi, tanpa memperhatikan jumlah row yang terlibat. Misalnya, jika terdapat suatu transaksi yang menginsertkan 1000 row ke tabel, maka statement-level trigger hanya akan dieksekusi sekali saja.

b. Before and After Trigger
Karena trigger dipicu oleh suatu kejadian (event), maka eksekusinya bisa diatur apakah sebelum atau sesudah event tersebut.
Before trigger menjalankan trigger action sebelum event atau statement pemicu berlangsung. Oleh karena itu, trigger ini cocok digunakan untuk mendeteksi bilamana event boleh dilanjutkan maupun tidak. After trigger menjalankan trigger action setelah event terjadi.

Kita mungkin akan berhubungan dengan data lama (old) dan data baru (new) yang terjadi dalam transaksi. Dalam trigger, dikenal istilah alias atau referensi, yaitu sejenis variabel yang menyimpan nilai dari suatu kolom dalam tabel. Alias terbagi menjadi dua, yaitu:
:old → variabel yang menyimpan nilai lama kolom sebelum trigger dieksekusi.
:new → variabel yang menyimpan nilai baru kolom setelah trigger dieksekusi.
Untuk statement INSERT, alias yang digunakan hanya :new saja, yaitu untuk menyimpan nilai yang akan dimasukkan ke dalam tabel. Untuk UPDATE, alias yang digunakan adalah :new dan :old, sedangkan untuk DELETE, hanya alias :old saja, yaitu untuk menyimpan nilai yang akan dihapus.

Alias dituliskan di depan nama kolom yang bersangkutan. Penulisannya adalah seperti :new.nama_kolom dan :old.nama_kolom.

c. Instead of Trigger
Instead of trigger hanya diperuntukkan bagi view dan diaktivasi jika terjadi perubahan pada base table (tabel asli). Trigger ini tidak dapat menggunakan UPDATE OF nama_kolom maupun BEFORE dan AFTER trigger.

Tipe-tipe trigger di atas dapat dikombinasikan menjadi 14 macam :
1. BEFORE INSERT row
2. BEFORE INSERT statement
3. AFTER INSERT row
4. AFTER INSERT statement
5. BEFORE UPDATE row
6. BEFORE UPDATE statement
7. AFTER UPDATE row
8. AFTER UPDATE statement
9. BEFORE DELETE row
10. BEFORE DELETE statement
11. AFTER DELETE row
12. AFTER DELETE statement
13. INSTEAD OF row
14. INSTEAD OF statement

BATASAN
Dalam penggunaannya, trigger memiliki batasan sebagai berikut:
• Tidak dapat menggunakan perintah ROLLBACK dan COMMIT.
• Tidak dapat memanggil fungsi dan prosedur yang memiliki ROLLBACK dan COMMIT.
• Tidak dapat diimplementasikan pada kolom suatu tabel yang memiliki constraint, jika pada akhirnya akan menyebabkan pelanggaran constraint.

MENGUBAH STATUS TRIGGER
Pada saat diciptakan, trigger berstatus aktif (enable). Kita dapat mengubah status trigger dengan perintah-perintah berikut:
• ALTER TRIGGER nama_trigger DISABLE
Sintaks tersebut digunakan untuk menonaktifkan trigger yang dibuat.
• ALTER TABLE nama_tabel DISABLE ALL TRIGGER
Syntax tersebut digunakan untuk menonaktifkan semua trigger yang ada pada suatu tabel.
• ALTER TRIGGER nama_trigger ENABLE
• ALTER TABLE nama_tabel ENABLE ALL TRIGGER
• DROP TRIGGER nama_trigger
Syntax tersebut digunakan untuk menghapus trigger yang telah dibuat.
CASCADING TRIGGER (trigger berantai)
Suatu trigger bisa memicu dijalankannya trigger lain, sehingga terjadi operasi trigger berantai. Misalnya operasi insert suatu tabel memiliki trigger yang memicu trigger pada tabel lain, kemudian trigger pada tabel terakhir ini dapat memicu trigger tabel lain juga. Dalam cascading operation seperti ini, dapat terjadi kesalahan ORA-04091 atau table is mutating. Hal ini disebabkan karena ada trigger action yang mencoba melakukan operasi DML terhadap tabel yang sedang dimodifikasi dalam suatu transaksi. Kesalahan seperti ini juga dapat disebabkan karena trigger action memiliki statement yang memodifikasi kolom-kolom primary, foreign, atau unique key.

Untuk menghindari kesalahan seperti ini, maka trigger harus dimodifikasi agar tidak melakukan pengaksesan tabel yang sedang digunakan.

REFERENSI
[1] Situmorang, F. 2004. Menguasai Database Server dan Pemrograman Oracle 9i. Jakarta: PT Elex Media Komputindo.
[2] X-OERANG Technology. 2004. Pemrograman Menggunakan Oracle Developer. Yogyakarta: Andi.
[3] Tim Asisten Teknik Informatika II. 2004. Modul Praktikum Teknik Informatika II.

Filed by moroncoder at May 3rd, 2007 under Uncategorized



Leave a comment