Oracle Tutorial Pemicu PL/SQL: Daripada Menggabungkan [Contoh]
Apa itu Pemicu di PL/SQL?
PEMICU adalah program tersimpan yang dijalankan Oracle mesin secara otomatis ketika Pernyataan DML seperti menyisipkan, memperbarui, menghapus dijalankan pada tabel atau beberapa peristiwa terjadi. Kode yang akan dieksekusi jika ada pemicu dapat ditentukan sesuai kebutuhan. Anda dapat memilih peristiwa yang memicu pemicunya dan waktu eksekusinya. Tujuan dari trigger adalah untuk menjaga integritas informasi pada database.
Manfaat Pemicu
Berikut ini adalah manfaat pemicu.
- Menghasilkan beberapa nilai kolom turunan secara otomatis
- Menegakkan integritas referensial
- Pencatatan peristiwa dan penyimpanan informasi pada akses tabel
- Audit
- Syncreplikasi tabel yang mengerikan
- Memaksakan otorisasi keamanan
- Mencegah transaksi tidak valid
Jenis Pemicu di Oracle
Pemicu dapat diklasifikasikan berdasarkan parameter berikut.
- Klasifikasi berdasarkan waktu
- SEBELUM Pemicu: Ini diaktifkan sebelum peristiwa yang ditentukan terjadi.
- AFTER Trigger: Ini dipicu setelah peristiwa yang ditentukan terjadi.
- BUKAN Pemicu: Tipe khusus. Anda akan belajar lebih banyak tentang topik selanjutnya. (hanya untuk DML)
- Klasifikasi berdasarkan tingkat
- Pemicu tingkat PERNYATAAN: Ini diaktifkan satu kali untuk pernyataan peristiwa yang ditentukan.
- Pemicu tingkat ROW: Ini diaktifkan untuk setiap catatan yang terpengaruh dalam peristiwa tertentu. (hanya untuk DML)
- Klasifikasi berdasarkan Acara
- Pemicu DML: Ini dipicu ketika peristiwa DML ditentukan (INSERT/UPDATE/DELETE)
- Pemicu DDL: Dipicu ketika peristiwa DDL ditentukan (CREATE/ALTER)
- Pemicu DATABASE: Ini diaktifkan ketika peristiwa database ditentukan (LOGON/LOGOFF/STARTUP/SHUTDOWN)
Jadi setiap pemicu adalah kombinasi dari parameter di atas.
Cara Membuat Pemicu
Di bawah ini adalah sintaks untuk membuat pemicu.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> [BEFORE | AFTER | INSTEAD OF ] [INSERT | UPDATE | DELETE......] ON<name of underlying object> [FOR EACH ROW] [WHEN<condition for trigger to get execute> ] DECLARE <Declaration part> BEGIN <Execution part> EXCEPTION <Exception handling part> END;
Penjelasan Sintaks:
- Sintaks di atas menunjukkan pernyataan opsional berbeda yang ada dalam pembuatan pemicu.
- BEFORE/ AFTER akan menentukan waktu acara.
- MASUKKAN/PERBARUI/LOGON/BUAT/dll. akan menentukan peristiwa yang pemicunya perlu diaktifkan.
- Klausa ON akan menentukan objek mana yang valid untuk peristiwa yang disebutkan di atas. Misalnya, ini akan menjadi nama tabel tempat peristiwa DML dapat terjadi jika terjadi Pemicu DML.
- Perintah “UNTUK SETIAP ROW” akan menentukan pemicu level ROW.
- Klausa WHEN akan menentukan kondisi tambahan di mana pemicu perlu diaktifkan.
- Bagian deklarasi, bagian eksekusi, bagian penanganan pengecualian sama dengan bagian lainnya Blok PL/SQL. Bagian deklarasi dan bagian penanganan pengecualian bersifat opsional.
: BARU dan : Klausa LAMA
Dalam pemicu tingkat baris, pemicu diaktifkan untuk setiap baris terkait. Dan terkadang diperlukan untuk mengetahui nilai sebelum dan sesudah pernyataan DML.
Oracle telah menyediakan dua klausa di pemicu tingkat RECORD untuk menampung nilai-nilai ini. Kita dapat menggunakan klausa ini untuk merujuk pada nilai lama dan baru di dalam badan pemicu.
- :BARU – Ini menyimpan nilai baru untuk kolom tabel/tampilan dasar selama eksekusi pemicu
- :OLD – Ini menyimpan nilai lama kolom tabel/tampilan dasar selama eksekusi pemicu
Klausa ini harus digunakan berdasarkan peristiwa DML. Tabel di bawah ini akan menentukan klausa mana yang valid untuk pernyataan DML mana (INSERT/UPDATE/DELETE).
MEMASUKKAN | UPDATE | DELETE | |
---|---|---|---|
:BARU | SAH | SAH | TIDAK SAH. Tidak ada nilai baru dalam kasus penghapusan. |
:TUA | TIDAK SAH. Tidak ada nilai lama dalam kotak sisipan | SAH | SAH |
BUKAN Pemicu
“INSTEAD OF trigger” adalah jenis trigger khusus. Jenis ini hanya digunakan dalam trigger DML. Jenis ini digunakan saat peristiwa DML apa pun akan terjadi pada tampilan kompleks.
Perhatikan contoh di mana tampilan dibuat dari 3 tabel dasar. Jika ada kejadian DML yang dikeluarkan melalui tampilan ini, hal tersebut akan menjadi tidak valid karena data diambil dari 3 tabel berbeda. Jadi dalam hal ini BUKAN trigger yang digunakan. Pemicu INSTEAD OF digunakan untuk mengubah tabel dasar secara langsung alih-alih mengubah tampilan untuk peristiwa tertentu.
Contoh 1: Dalam contoh ini, kita akan membuat tampilan kompleks dari dua tabel dasar.
- Tabel_1 adalah tabel kosong dan
- Tabel_2 adalah tabel departemen.
Kemudian kita akan melihat bagaimana pemicu INSTEAD OF digunakan untuk mengeluarkan pernyataan detail lokasi UPDATE pada tampilan kompleks ini. Kita juga akan melihat bagaimana :NEW dan :OLD berguna dalam pemicu.
- Langkah 1: Membuat tabel 'emp' dan 'dept' dengan kolom yang sesuai
- Langkah 2: Mengisi tabel dengan nilai sampel
- Langkah 3: Membuat tampilan untuk tabel yang dibuat di atas
- Langkah 4: Perbarui tampilan sebelum pemicu
- Langkah 5: Pembuatan pemicu alih-alih
- Langkah 6: Perbarui tampilan setelah pemicu
Langkah 1) Membuat tabel 'emp' dan 'dept' dengan kolom yang sesuai
CREATE TABLE emp( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager VARCHAR2(50), dept_no NUMBER); / CREATE TABLE dept( Dept_no NUMBER, Dept_name VARCHAR2(50), LOCATION VARCHAR2(50)); /
Penjelasan Kode
- Baris kode 1-7: Pembuatan tabel 'emp'.
- Baris kode 8-12: Pembuatan tabel 'departemen'.
Keluaran
Tabel Dibuat
Langkah 2) Sekarang karena kita telah membuat tabelnya, kita akan mengisi tabel ini dengan nilai sampel dan Pembuatan Tampilan untuk tabel di atas.
BEGIN INSERT INTO DEPT VALUES(10,‘HR’,‘USA’); INSERT INTO DEPT VALUES(20,'SALES','UK’); INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN'); COMMIT; END; / BEGIN INSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30); INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ; INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10); COMMIT; END; /
Penjelasan Kode
- Baris kode 13-19: Memasukkan data ke dalam tabel 'dept'.
- Baris kode 20-26: Memasukkan data ke dalam tabel 'emp'.
Keluaran
Prosedur PL/SQL selesai
Langkah 3) Membuat tampilan untuk tabel yang dibuat di atas.
CREATE VIEW guru99_emp_view( Employee_name:dept_name,location) AS SELECT emp.emp_name,dept.dept_name,dept.location FROM emp,dept WHERE emp.dept_no=dept.dept_no; /
SELECT * FROM guru99_emp_view;
Penjelasan Kode
- Baris kode 27-32: Pembuatan tampilan 'guru99_emp_view'.
- Baris kode 33: Menanyakan guru99_emp_view.
Keluaran
Tampilan dibuat
NAMA KARYAWAN | DEPT_NAME | LOKASI |
---|---|---|
Zzz | HR | Amerika Serikat |
YYY | PENJUALAN | UK |
XXX | KEUANGAN | JEPANG |
Langkah 4) Pembaruan tampilan sebelum pemicu.
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’; COMMIT; END; /
Penjelasan Kode
- Baris kode 34-38: Perbarui lokasi “XXX” menjadi 'FRANCE'. Hal ini menimbulkan pengecualian karena Pernyataan DML tidak diizinkan dalam tampilan kompleks.
Keluaran
ORA-01779: tidak dapat mengubah kolom yang dipetakan ke tabel yang tidak mempertahankan kunci
ORA-06512: di jalur 2
Langkah 5)Untuk menghindari kesalahan saat memperbarui tampilan pada langkah sebelumnya, pada langkah ini kita akan menggunakan “bukan pemicu”.
CREATE TRIGGER guru99_view_modify_trg INSTEAD OF UPDATE ON guru99_emp_view FOR EACH ROW BEGIN UPDATE dept SET location=:new.location WHERE dept_name=:old.dept_name; END; /
Penjelasan Kode
- Baris kode 39: Pembuatan INSTEAD OF trigger untuk acara 'UPDATE' pada tampilan 'guru99_emp_view' di tingkat ROW. Ini berisi pernyataan pembaruan untuk memperbarui lokasi di tabel dasar 'dept'.
- Baris kode 44: Pernyataan pembaruan menggunakan ':NEW' dan ': OLD' untuk menemukan nilai kolom sebelum dan sesudah pembaruan.
Keluaran
Pemicu Dibuat
Langkah 6) Pembaruan tampilan setelah pemicu alih-alih. Sekarang kesalahan tidak akan muncul karena "pemicu alih-alih" akan menangani operasi pembaruan tampilan kompleks ini. Dan saat kode telah dijalankan, lokasi karyawan XXX akan diperbarui menjadi "Prancis" dari "Jepang".
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT; END; /
SELECT * FROM guru99_emp_view;
Penjelasan Kode:
- Baris kode 49-53: Pembaruan lokasi “XXX” ke 'FRANCE'. Ini berhasil karena pemicu 'INSTEAD OF' telah menghentikan pernyataan pembaruan aktual yang terlihat dan melakukan pembaruan tabel dasar.
- Baris kode 55: Memverifikasi catatan yang diperbarui.
Keluaran:
Prosedur PL/SQL berhasil diselesaikan
NAMA KARYAWAN | DEPT_NAME | LOKASI |
---|---|---|
Zzz | HR | Amerika Serikat |
YYY | PENJUALAN | UK |
XXX | KEUANGAN | PRANCIS |
Pemicu Majemuk
Pemicu gabungan adalah pemicu yang memungkinkan Anda menentukan tindakan untuk masing-masing dari empat titik waktu dalam satu badan pemicu. Empat titik waktu berbeda yang didukungnya adalah seperti di bawah ini.
- SEBELUM PERNYATAAN – tingkat
- SEBELUM BARIS – tingkat
- SETELAH BARIS – tingkat
- PERNYATAAN SETELAH – tingkat
Ini menyediakan fasilitas untuk menggabungkan tindakan untuk waktu yang berbeda ke dalam pemicu yang sama.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> FOR [INSERT | UPDATE | DELET.......] ON <name of underlying object> <Declarative part> BEFORE STATEMENT IS BEGIN <Execution part>; END BEFORE STATEMENT; BEFORE EACH ROW IS BEGIN <Execution part>; END EACH ROW; AFTER EACH ROW IS BEGIN <Execution part>; END AFTER EACH ROW; AFTER STATEMENT IS BEGIN <Execution part>; END AFTER STATEMENT; END;
Penjelasan Sintaks:
- Sintaks di atas menunjukkan pembuatan pemicu 'COMPOUND'.
- Bagian deklaratif umum untuk semua blok eksekusi di badan pemicu.
- Keempat blok waktu ini dapat berada dalam urutan apa pun. Tidak wajib untuk memiliki keempat blok waktu ini. Kita dapat membuat pemicu COMPOUND hanya untuk timing yang diperlukan.
Contoh 1: Dalam contoh ini, kita akan membuat pemicu untuk mengisi kolom gaji secara otomatis dengan nilai default 5000.
CREATE TRIGGER emp_trig FOR INSERT ON emp COMPOUND TRIGGER BEFORE EACH ROW IS BEGIN :new.salary:=5000; END BEFORE EACH ROW; END emp_trig; /
BEGIN INSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30); COMMIT; END; /
SELECT * FROM emp WHERE emp_no=1004;
Penjelasan Kode:
- Baris kode 2-10: Pembuatan pemicu gabungan. Ini dibuat untuk level timing SEBELUM ROW untuk mengisi gaji dengan nilai default 5000. Ini akan mengubah gaji ke nilai default '5000' sebelum memasukkan catatan ke dalam tabel.
- Baris kode 11-14: Masukkan catatan ke dalam tabel 'emp'.
- Baris kode 16: Memverifikasi catatan yang dimasukkan.
Keluaran:
Pemicu dibuat
Prosedur PL/SQL berhasil diselesaikan.
EMP_NAME | EMP_TIDAK | GAJI | MANAGER | DEPT_NO |
---|---|---|---|---|
CCC | 1004 | 5000 | AAA | 30 |
Mengaktifkan dan Menonaktifkan Pemicu
Pemicu dapat diaktifkan atau dinonaktifkan. Untuk mengaktifkan atau menonaktifkan pemicu, pernyataan ALTER (DDL) perlu diberikan untuk pemicu yang menonaktifkan atau mengaktifkannya.
Di bawah ini adalah sintaks untuk mengaktifkan/menonaktifkan pemicu.
ALTER TRIGGER <trigger_name> [ENABLE|DISABLE]; ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;
Penjelasan Sintaks:
- Sintaks pertama menunjukkan cara mengaktifkan/menonaktifkan pemicu tunggal.
- Pernyataan kedua menunjukkan cara mengaktifkan/menonaktifkan semua pemicu pada tabel tertentu.
Kesimpulan
Dalam bab ini, kita telah mempelajari tentang trigger PL/SQL dan kelebihannya. Kita juga telah mempelajari berbagai klasifikasi dan mendiskusikan BUKAN pemicu dan pemicu KOMPAK.