Translate

Sunday, August 7, 2016

trigger pada database



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