Trigger adalah sebuah blok PL/SQL yang disimpan dalam database yang secara
otomatis akan teraktivasi ketika terjadi suatu operasi pada sebuah tabel, view, schema,
atau database.
Trigger terdapat 2
jenis :
- Application Trigger
Yang dimana tigger tersebut akan teraktivasi ketika terjadi suatu event pada sebuah aplikasi tertentu - Database Trigger
Yang dimana trigger tersebut akan teraktivasi ketika terjadi suatu data event(operasi DML(INSERT, UPDATE, DELETE) atau system event (logon or shutdowm) pada sebuah schema atau database dan untuk selanjutnya kita akan membahas tentang trigger ini
TRIGGER
TIMING
Terdapat
3 waktu untuk sebuah trigger teraktivasi :
- BEFORE
Dimana sebuah trigger akan teraktivasi sebelum terjadinya proses DML pada tabel - AFTER
Dimana sebuah trigger akan teraktivasi setelah terjadinya proses DML pada tabel - INSTEAD OF
Trigger yang hanya berfungsi pada VIEW dan biasanya digunakan untuk mengUpdate data pada view kompleks
Syntax :
CREATE [OR REPLACE]
TRIGGER trigger_name
timing
event1 [OR event2 OR event3]
ON object_name
[[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
[WHEN (condition)]]
trigger_body
timing
event1 [OR event2 OR event3]
ON object_name
[[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
[WHEN (condition)]]
trigger_body
Contoh :
CREATE OR REPLACE TRIGGER
BEFORE UPDATE ON
BEGIN
RAISE_APPLICATION_ERROR
END;
backup
BEFORE UPDATE ON
employees
BEGIN
RAISE_APPLICATION_ERROR
(-20001,'Tabel Employees Tidak Dapat Dirubah');
END;
Trigger
diatas berfungsi untuk melarang terjadinya proses UPDATE pada tabel employees
dan Ketika kita mencoba untuk mengUpdate tabel employees
UPDATE employees
SET salary = 1000
WHERE employee_id= 100
SET salary = 1000
WHERE employee_id= 100
Hasilnya :
ERROR at line 1:
ORA-20001: Tabel Employees Tidak Dapat Dirubah
ORA-06512: at “HR.BACKUP_SALARY”, line 2
ORA-04088: error during execution of trigger ‘HR.BACKUP_SALARY’
ORA-20001: Tabel Employees Tidak Dapat Dirubah
ORA-06512: at “HR.BACKUP_SALARY”, line 2
ORA-04088: error during execution of trigger ‘HR.BACKUP_SALARY’
Selain contoh diatas
kita juga dapat menspesifikkan pada kolom mana trigger tersebut aktif
Contoh :
CREATE OR REPLACE TRIGGER
backup
BEFORE UPDATE OF SALARY ON
BEGIN
RAISE_APPLICATION_ERROR
END;
BEFORE UPDATE OF SALARY ON
employees
BEGIN
RAISE_APPLICATION_ERROR
(-20001,'Data Salary Pada Tabel Employees Tidak
Dapat Dirubah');
END;
Trigger
diatas akan aktif ketika kita melakukan operasi UPDATE pada Kolom Salary di
Tabel employees.
IF-ELSE TRIGGER
contoh :
CREATE OR REPLACE TRIGGER
BEFORE UPDATE OR DELETE OR INSERT ON
BEGIN
IF UPDATING THEN
RAISE_APPLICATION_ERROR
ELSIF DELETING THEN
RAISE_APPLICATION_ERROR
ELSE
RAISE_APPLICATION_ERROR
END IF;
END;
backup2
BEFORE UPDATE OR DELETE OR INSERT ON
employees
BEGIN
IF UPDATING THEN
RAISE_APPLICATION_ERROR
(-20001, 'Tabel Emp Tidak Dapat DiRubah');
ELSIF DELETING THEN
RAISE_APPLICATION_ERROR
(-20002, 'Tabel Emp Tidak Dapat DiHapus');
ELSE
RAISE_APPLICATION_ERROR
(-20003, 'Tabel Emp Tidak Dapat DITambah');
END IF;
END;
Ketika
kita mencoba menghapus data pada tabel employees
DELETE FROM
WHERE
Employees
WHERE
employee_id = 120;
Hasilnya :
ERROR at line 1:
ORA-20001: Tabel Emp Tidak Dapat DiHapus
ORA-06512: at “HR.BACKUP2″, line 5
ORA-04088: error during execution of trigger ‘HR.BACKUP2′
ORA-20001: Tabel Emp Tidak Dapat DiHapus
ORA-06512: at “HR.BACKUP2″, line 5
ORA-04088: error during execution of trigger ‘HR.BACKUP2′
Contoh Trigger After :
CREATE OR REPLACE TRIGGER
AFTER DELETE OR INSERT OR UPDATE ON
BEGIN
IF DELETING THEN
DBMS_OUTPUT.PUT_LINE ('
ELSIF UPDATING THEN
DBMS_OUTPUT.PUT_LINE ('
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE ('
END IF;
END;
Konfirmasi
AFTER DELETE OR INSERT OR UPDATE ON
Employees
BEGIN
IF DELETING THEN
DBMS_OUTPUT.PUT_LINE ('
Data Telah di Delete
');ELSIF UPDATING THEN
DBMS_OUTPUT.PUT_LINE ('
Data Telah di Update
');ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE ('
Data Telah di Insert
');END IF;
END;
Trigger
diatas akan menampilkan pesan ketika kita melakukan operasi DML(INSERT, UPDATE,
DELETE) pada tabel employees
Alias Di Dalam Trigger
Di dalam
trigger dikenal istilah alias atau referensi, yaitu
sejenis variabel yang menyimpan nilai dari suatu
kolom di dalam tabel. Alias tersebut terbagi menjadi dua yaitu :new dan :old.
Alias :new untuk menyimpan nilai terbaru sedangkan alias :old untuk menyimpan
nilai lama.
Ketersediaan Alias Di
dalam Trigger
- Pada statement UPDATE, terdapat alias
:new dan :old
- Pada statement DELETE, hanya terdapat
alias :old
- Pada statement INSERT, hanya terdapat
alias :new
Contoh :
CREATE OR REPLACE TRIGGER
AFTER UPDATE OF
FOR EACH ROW
BEGIN
INSERT INTO
END
backup_sal
AFTER UPDATE OF
salary
ON employees
FOR EACH ROW
BEGIN
INSERT INTO
backup_salary(emp_id, old_salary, new_salary,
backupdate) VALUES (: old.employee_id, : old.salary, :new.salary,
SYSDATE);
END
;
Trigger
diatas berfungsi untuk memasukkan data employee_id yang lama, salary yang lama,
salary yang baru dan tanggal perubahan ke tabel backup_salary. Trigger tersebut
teraktivasi Ketika kita mengUpdate salary pada Tabel Employees
UPDATE
SET
WHERE
employees
SET
Salary = 2000
WHERE
employee_id = 130;
Maka
secara otomatis, data yang kita UPDATE tersebut sudah terBackup di tabel
backup_salary
Contoh lain:
CREATE OR REPLACE TRIGGER
BEFORE INSERT ON
FOR EACH ROW
BEGIN
IF
RAISE_APPLICATION_ERROR
END IF;
END;
Validasi
BEFORE INSERT ON
Employees
FOR EACH ROW
BEGIN
IF
:new.salary < 2000
THENRAISE_APPLICATION_ERROR
(-20000,'Gaji Minimal $2000');
END IF;
END;
Trigger diatas berfungsi untuk
memastikan kalau data salary pada tabel employees yang dimasukkan minimal
$2000
Membuat Trigger dalam DDL Statement
Pada contoh-contoh sebelumnya
kita telah membuat trigger pada DML statement, pada contoh kali ini kita akan membuat
trigger pada DDL statement.
Trigger yang dapat dipasang pada
DDL stament yaitu DROP, ALTER, dan CREATE
syntax :
CREATE [OR REPLACE]
TRIGGER trigger_name
Timing
[ddl_event1 [OR ddl_event2 OR ...]]
ON {DATABASE|SCHEMA}
trigger_body
Timing
[ddl_event1 [OR ddl_event2 OR ...]]
ON {DATABASE|SCHEMA}
trigger_body
Contoh :
CREATE OR REPLACE TRIGGER
BEFORE DROP ON SCHEMA
BEGIN
RAISE_APPLICATION_ERROR
END;
BackupData
BEFORE DROP ON SCHEMA
BEGIN
RAISE_APPLICATION_ERROR
(-20005,' Tidak diperbolehkan untuk menghapus table
pada schema ini');
END;
Trigger diatas akan mencegah
terjadinya pengeksekusian statement DROP pada schema, untuk lebih memahami
penggunaan trigger di dalam SCHEMA atau DATABASE, silakan baca artikel Trigger di Oracle Part 2
MANAGING TRIGGER
Mengaktifkan TRIGGER
Syntax :
ALTER TRIGGER trigger_name ENABLE
Menonaktifkan Trigger
Syntax :
ALTER TRIGGER trigger_name DISABLE
Mengaktifkan atau
Menonaktifkan Semua Trigger
Syntax :
ALTER TABLE table_name DISABLE | ENABLE
ALL TRIGGERS
ALL TRIGGERS
Menghapus TRIGGER
Syntax :
Tidak ada komentar:
Posting Komentar