trigger pada database
Oracle, sama dengan RDBMS modern
lainnya, juga menyediakan database trigger, yang nantinya akan banyak digunakan
pada aturan-aturan bisnis.. Database trigger adalah group PL/SQL yang
dieksekusi ketika SQL statemen (DELETE, UPDATE atau INSERT) dijalankan pada
tabel. Kita dapat menggunakan database trigger
melakukan perintah-perintah berikut :
-
menjalankan
keamanan data yang baik
-
mengganti
nilai sebuah kolum berdasarkan nilai dari kolom lain pada sebuah tabel atau
tabel yang berbeda.
-
Melakukan
validasi yang kompleks pada nilai sebuah kolom, misalnya harus membandingkan
perbedaan nilai sebuah kolom dengan nilai kolom dari tabel yang berbeda.
I.1 7.1 Membuat Trigger
Pada Oracle CREATE TRIGGER membuat /
mengganti sebuah trigger ketika sebuah event telah terdapat pada sebuah tabel.
Sintaks dari CREATE TRIGGER :
CREATE [ or REPLACE ] TRIGGER nama_trigger {BEFORE | AFTER}
even_trigger
ON nama_tabel
[FOR EACH ROW]
[WHEN (kondisi)]
PL/SQL
block
Keterangan :
nama_trigger : Nama trigger yang akan
dibuat
even_trigger : INSERT, UPDATE atau DELETE
nama_tabel : nama dari tabel
tempat trigger akan dijalankan
FOR
EACH ROW : opsional, ketika digunakan, akan mengakibatkan trigger
berpengaruh terhadap setiap baris
Kondisi : kondisi
optional dari Boolean, ketika TRUE
berarti membolehkan trigger dijalankan.
PL/SQL
block : PL/SQL block yang dieksekusi ketika trigger dijalankan.
7.2 Statement-level dan Row-level Trigger
Dua klasifikasi dari Trigger :
-
Statement-level
trigger tidak menggunakan FOR EACH ROW untuk membuat CREATE TRIGGER
-
Row-level
trigger menggunakan FOR EACH ROW dalam membuat CREATE TRIGGER.
Statement-level trigger dijalankan
hanya untuk even yang telah bertrigger dan tidak mempunyai akses ke kolom
setiap baris yang mendapat pengaruh dari trigger. Row-level trigger dijalankan
untuk setiap baris yang mendapat efek dari
trigger dan dapat diakses dari original dan kolom baru yang diproses
oleh pernyataan SQL.
Pada Umumnya menggunakan
statement-level trigger untuk memproses informasi tentang pernyataan SQL yang
disebabkan oleh trigger ketika dijalankan., contohnya siapa dan kapan
menjalankannya. Sedangkan menggunakan row-level trigger ketika membutuhkan
untuk mengetahui nilai kolom dari baris yang diimplementasikan pada aturan
bisnis.
I.1.1.1 Referensi Nilai Kolom Pada Trigger
Pada tubuh trigger, row-level
triiger dapat mereferensi pada nilai kolom dari baris yang telah eksis, ketika
trigger dijalankan. Nilai ini bergantung dimana pernyataan SQL menyebabkan
trigger dijalankan.
-
Untuk
INSERT, nilai dapat di-insert-kan yang terkandung dalam: new.column-name,
dimana column-name adalah kolom pada tabel.
-
Untuk
UPDATE statement, nilai original dari kolom terkandung dalam :
-
Old.column-name;
nilai baru untuk kolom baru terkandung dalam :new.column-name.
-
Untuk
DELETE, nilai kolom dari baris akan terhapus terkandung dalam :old.column-name
7.3 Event
dari Trigger
Ketika
membuat trigger, kita harus menspesifikasi even yang mempengaruhi trigger
ketika dijalankan. 3 even yang memungkinkan :
-
Meng-insert-kan
baris baru pada tabel dengan pernyataan INSERT
-
Memodifikasi
baris ( atau bukan baris ) melalui UPDATE
-
Memodifikasi
baris ( atau bukan baris ) melalui DELETE
Dapat dikombinasikan even trigger
tersebut sehingga trigger jalan dengan DELETE atau INSERT atau UPDATE
dieksekusi. Bisa dilihat pada contoh dibawah ini :
SQL> create or replace trigger Block_Trade_After_ALL After
2
insert
or update or delete on Tab1
3
for
each row
4
4
declare
5
5
begin
6
6
insert
into Tab1
7
(col11)
8
values
9
(11);
10
10
end;
11
/
Trigger created
I.1.1.2 BEFORE dan AFTER Triggers
BEFORE row-level trigger dijalankan
sebelum even trigger dieksekusi. Sehingga kita dapat menggunakan BEFORE
row-level trigger untuk memodifikasi nilai baris dan kolom. AFTER row-level
trigger dijalankan setelah terdapat even trigger. Kita tidak dapat memodifikasi
nilai kolom dengan AFTER trigger
I.1.1.3 Trigger Yang Memungkinkan Untuk Tabel
Pada sebuah tabel dapat memiliki 12
tipe trigger
-
6
row-level trigger untuk BEFORE DELETE, BEFORE INSERT, BEFORE UPDATE, AFTER
DELETE, AFTER INSERT, dan AFTER UPDATE
-
6
statement-level trigger untuk BEFORE DELETE, BEFORE INSERT, BEFORE UPDATE,
AFTER DELETE, AFTER INSERT, dan AFTER UPDATE
Karena hanya dapat membuat 12 tipe
trigger untuk tabel bukan berarti dapat melakukan semua. Pada kenyataan harus dipilih ketika
membuat trigger untuk tabel.
7.4 Mengatur
Nilai Kolom dengan Trigger
Salah satu kegunaan trigger ialah
untuk mengeset nilai kolom sebelum SQL dijalankan. Misalnya kita ingin agar
dalam suatu kolom identitas selalu mempunyai bentuk nilai xxxx100xxx maka
sintaksnya :
SQL> create or replace trigger k2_format_nrp_mhs_bfr_ins_upd
2 before
insert or update of nrp on k2_mahasiswa
3
for
each row
4
begin
5
if(:new.nrp)
not like(‘____100___’) then
6
raise_application_error(-20005,’Format
nrp adalah xxxx100xxx’);
7
end
if;
8
end;
I.2 7.5 Cascading Trigger
Dalam
trigger juga terdapat interaksi antara beberapa trigger. Contohnya kita dapat
menjalankan trigger yang berfungsi untuk menjalan trigger yang lainnya. Trigger
yang seperti ini disebut dengan Cascading Trigger. Untuk mengilustrasikan
Cascading trigger dapat dilihat contoh dibawah ini :
create table tab1
(kol1 number)
Create table tab2
(kol2 number)
Create table tab3
(kol3 number)
SQL> select * from tab1;
Kol1
……………
7
SQL> select * from tab2;
Kol2
……………
10
SQL> select * from tab1;
Kol3
……………
13
Untuk tab1, buat a row-level BEFORE
UPDATE trigger yang akan meng-insertkan nilai yang lama dari kolom kol1 tabel
tab1 menuju tab2. Dari tabel tab2 buat row-level BEFORE INSERT trigger yang
akan mengupdate tabel tab3 dan diset nilai dari kol3 untuk nilai baru dari
col2. Akhirnya untuk tab3, buat statement-level AFTER UPDATE trigger yang akan
menginsert baris ke tab3 dengan nilai col3 sama dengan 27.
Jelasnya lihat listing berikut :
SQL> create
or replace trigger tab1_Update_Before before
2
update
on tab1
3
for each
row
4
4
declare
5
5
begin
6
6
insert
into tab2
7
(kol2)
8
values
9
(:old.kol1);
10
10
end;
11
/
Trigger created.
SQL> create
or replace trigger tab1_Update_Before before
2
insert
on tab2
3
for each
row
4
4
declare
5
5
begin
6
6
update
tab3
7
set
8
kol3 =
:new.kol2
9
9 end;
10 /
Trigger created.
SQL> create
or replace trigger tab1_Update_After after
2 update
on tab3
3
3 declare
4
4 begin
5
5 insert into tab3
6 (col3)
7
values
8
values
9
9
end;
10
/
Trigger Created
Sekarang lihat apa yang terjadi
ketika baris tab1 diupdate ? seperti yang akan kita lihat dilisting dibawah ini
perubahannya adalah :
-
tab1,
nilai kol1 terupdate menjadi 8
-
tab 2,
trigger Tab1_Update_Before ter-insert baris baru dengan nilai dari kol1:7.
-
Pada
tab3, trigger Tab2_Insert_before dijalankan setelah nilai baris baru dari tab2
dan set dari nilai kol3 menjadi sama dengan nilai yang di-insertkan pada
tab2:7. Ketika tab3 ter-update, trigger Tab3_update_Before ter-insert baris
lainnya pada tab3 dengan nilai 27.
Listingnya dapat dilihat :
SQL> update
tab1
2
set col1
= 8;
1 row updated.
SQL> select
* from tab1;
Kol1
----------------
8
SQL> select
* from tab2;
Kol2
----------------
10
7
SQL> select
* from tab3;
Kol3
----------------
7
27
I.2.1.1.1.1.1.1
VII.6
Dropping, Enabling, dan Disabling Trigger
Kita dapat men-drop trigger dengan
sintaks sebagai berikut :
DROP TRIGGER nama_trigger
Variable nama_trigger ialah nama
dari trigger yang akan di-drop
Contohnya: untuk men-drop UPDATE
BEFORE trigger on table tab 1, maka
perintah SQLnya dapat dilihat sebagai berikut :
SQL> drop
trigger tab1_Update_Before
Trigger
dropped.
Kadang, melakukan drop trigger
terlalu berlebih, jika kita hanya ingin membuat trigger agar tidak aktif
sewaktu-waktu, kita dapat menutup atau menghentikan trigger sampai diperlukan
lagi. Untuk menghentikan trigger sewaktu-waktu, dapat digunakan ALTER TRIGGER,
sintaksnya :
ALTER TRIGGER nama_trigger DISABLE;
Variable nama_trigger ialah nama
dari trigger yang akan dihentikan.
Contoh :
SQL> drop
trigger tab1_Update_Before disable;
Trigger
altered.
Untuk menjalankan atau menghidupkan
trigger, gunakan sintaks berikut
ALTER TRIGGER nama_trigger ENABLE;
Variabel nama_trigger adalah trigger
yang akan dihidupkan kembali.
Contohnya : kita dapat menjalankan
kembali trigger tab1_Update_Before.
SQL>alter
trigger tab1_Update_Before enable;
Trigger
altered.
No comments:
Post a Comment
silahkan membaca dan berkomentar