PL/SQL – Triggers – SMK Wahidin Arjawinangun

Triggers adalah program-program yang disimpan, yang secara otomatis dieksekusi atau dipicu ketika terjadi beberapa peristiwa. Triggers sebenarnya ditulis untuk dieksekusi sebagai respons terhadap salah satu dari peristiwa-peristiwa berikut:

  1. Pernyataan manipulasi database (DML) (DELETE, INSERT, atau UPDATE)
  2. Pernyataan definisi database (DDL) (CREATE, ALTER, atau DROP)
  3. Operasi database (SERVERERROR, LOGON, LOGOFF, STARTUP, atau SHUTDOWN)

Triggers dapat didefinisikan pada tabel, tampilan, skema, atau database dengan mana peristiwa tersebut terkait.

Manfaat Triggers Triggers dapat ditulis untuk tujuan-tujuan berikut:

  1. Menghasilkan nilai kolom turunan secara otomatis.
  2. Menegakkan integritas referensial.
  3. Pencatatan peristiwa dan penyimpanan informasi mengenai akses tabel.
  4. Audit.
  5. Replikasi sinkron tabel.
  6. Memaksa otorisasi keamanan.
  7. Mencegah transaksi yang tidak valid.

Triggers dapat memberikan fleksibilitas dan kemampuan untuk mengotomatisasi sejumlah tugas penting dalam database, seperti menghitung nilai kolom turunan, mengamankan integritas data, dan melacak peristiwa yang terjadi pada tabel.

Membuat Triggers

CREATE [OR REPLACE ] TRIGGER trigger_name  
{BEFORE | AFTER | INSTEAD OF }  
{INSERT [OR] | UPDATE [OR] | DELETE}  
[OF col_name]  
ON table_name  
[REFERENCING OLD AS o NEW AS n]  
[FOR EACH ROW]  
WHEN (condition)   
DECLARE 
   Declaration-statements 
BEGIN  
   Executable-statements 
EXCEPTION 
   Exception-handling-statements 
END; 

Deskripsi

  • CREATE [OR REPLACE] TRIGGER nama_trigger – Membuat atau menggantikan trigger yang ada dengan nama_trigger.
  • {BEFORE | AFTER | INSTEAD OF} – Ini menentukan kapan trigger akan dieksekusi. Klause INSTEAD OF digunakan untuk membuat trigger pada tampilan.
  • {INSERT [ATAU] | UPDATE [ATAU] | DELETE} – Ini menentukan operasi DML.
  • [OF nama_kolom] – Ini menentukan nama kolom yang akan diperbarui.
  • [ON nama_tabel] – Ini menentukan nama tabel yang terkait dengan trigger.
  • [REFERENCING OLD AS o NEW AS n] – Ini memungkinkan Anda merujuk nilai baru dan lama untuk berbagai pernyataan DML, seperti INSERT, UPDATE, dan DELETE.
  • [FOR EACH ROW] – Ini menentukan trigger tingkat baris, yaitu, trigger akan dieksekusi untuk setiap baris yang terpengaruh. Jika tidak, trigger akan dieksekusi hanya sekali saat pernyataan SQL dieksekusi, yang disebut trigger tingkat tabel.
  • WHEN (kondisi) – Ini memberikan kondisi untuk baris-baris di mana trigger akan diaktifkan. Klausul ini hanya valid untuk trigger tingkat baris.

Contoh

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+ 

Program berikut membuat trigger tingkat baris untuk tabel customers yang akan diaktifkan untuk operasi INSERT, UPDATE, atau DELETE yang dilakukan pada tabel CUSTOMERS. Trigger ini akan menampilkan perbedaan gaji antara nilai lama dan nilai baru.

CREATE OR REPLACE TRIGGER display_salary_changes 
BEFORE DELETE OR INSERT OR UPDATE ON customers 
FOR EACH ROW 
WHEN (NEW.ID > 0) 
DECLARE 
   sal_diff number; 
BEGIN 
   sal_diff := :NEW.salary  - :OLD.salary; 
   dbms_output.put_line('Old salary: ' || :OLD.salary); 
   dbms_output.put_line('New salary: ' || :NEW.salary); 
   dbms_output.put_line('Salary difference: ' || sal_diff); 
END; 
/ 

Output

Trigger created.

Berikut adalah beberapa poin yang perlu dipertimbangkan di sini:

  • Referensi OLD dan NEW tidak tersedia untuk trigger tingkat tabel, sebaliknya Anda dapat menggunakannya untuk trigger tingkat rekaman.
  • Jika Anda ingin melakukan kueri pada tabel yang sama dalam trigger, maka Anda harus menggunakan kata kunci AFTER, karena trigger hanya dapat melakukan kueri pada tabel atau mengubahnya lagi setelah perubahan awal diterapkan dan tabel berada dalam keadaan konsisten.
  • Trigger di atas ditulis sedemikian rupa sehingga akan diaktifkan sebelum operasi DELETE, INSERT, atau UPDATE apa pun pada tabel. Namun, Anda dapat menulis trigger Anda untuk satu atau beberapa operasi, misalnya BEFORE DELETE, yang akan diaktifkan setiap kali rekaman dihapus menggunakan operasi DELETE pada tabel.

Triggering a Trigger

Mari kita lakukan beberapa operasi DML pada tabel CUSTOMERS. Berikut adalah contoh pernyataan INSERT yang akan membuat catatan baru dalam tabel.

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (7, 'Kriti', 22, 'HP', 7500.00 ); 

Ketika sebuah rekaman dibuat dalam tabel CUSTOMERS, trigger yang telah dibuat, display_salary_changes, akan diaktifkan dan akan menampilkan hasil berikut.

Old salary: 
New salary: 7500 
Salary difference:

Karena ini adalah rekaman baru, gaji lama tidak tersedia, dan hasil di atas akan menjadi null. Mari kita lakukan satu operasi DML lagi pada tabel CUSTOMERS. Pernyataan UPDATE akan mengubah rekaman yang sudah ada dalam tabel.

UPDATE customers 
SET salary = salary + 500 
WHERE id = 2; 

Ketika sebuah rekaman diubah dalam tabel CUSTOMERS, trigger yang telah dibuat, display_salary_changes, akan diaktifkan dan akan menampilkan hasil berikut:

Old salary: 1500 
New salary: 2000 
Salary difference: 500 

Sumber https://www.tutorialspoint.com/plsql/plsql_triggers.htm

Leave a Reply

Your email address will not be published. Required fields are marked *

v77slot