Professional Documents
Culture Documents
Overviews
Pengertian Trigger
Database triggers adalah prosedur yang tersimpan dalam database dan di aktifkan ketika kondisi tertentu terjadi Dapat digunakan untuk menambah kapabilitas agar database mampu dikostumasi secara sistematis. Sebagai contoh, membuat Trigger yang dapat membatasi perintah DML tertentu pada sebuah tabel dan mengijinkan perintah tertentu pada waktu tertentu juga.
Database triggers dapat digunakan dalam sebuah table, schema, atau database. Cara memicunya ketika:
Perintah DML dieksekusi (INSERT, UPDATE, DELETE) terhadap tabel tertentu. DDL tertentu dieksekusi (contohnya: ALTER, CREATE, DROP) pada sebuah objek pada database atau schema. Event tertentu terjadi pada database (contohnya: STARTUP, SHUTDOWN, SERVERERROR)
10
Options: Event-nya
UPDATE ON bisa juga DELETE ON atau INSERT ON. Dan UPDATE ON dapat juga UPDATE OF ON
11
Resp_dept NUMBER
); CREATE TABLE Emp_tab ( Empno NUMBER NOT NULL, Ename VARCHAR2(10),
Job VARCHAR2(9),
Mgr NUMBER(4), Hiredate DATE, Sal NUMBER(7,2), Comm NUMBER(7,2),
12
CREATE OR REPLACE TRIGGER Print_salary_changes BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab FOR EACH ROW WHEN (new.Empno > 0) DECLARE sal_diff number; BEGIN sal_diff := :new.sal - :old.sal; dbms_output.put('Old salary: ' || :old.sal); dbms_output.put(' New salary: ' || :new.sal); dbms_output.put_line(' Difference ' || sal_diff); END; /
13
14
SELECT COUNT(*) INTO rowcnt FROM Dept_tab WHERE deptno = :n.deptno; IF rowcnt = 0 THEN INSERT INTO Dept_tab (deptno, dept_type) VALUES(:n.deptno, :n.dept_type); ELSE UPDATE Dept_tab SET Dept_tab.dept_type = :n.dept_type WHERE Dept_tab.deptno = :n.deptno; END IF; SELECT COUNT(*) INTO rowcnt FROM Project_tab WHERE Project_tab.projno = :n.projno; IF rowcnt = 0 THEN INSERT INTO Project_tab (projno, prj_level) VALUES(:n.projno, :n.prj_level); ELSE UPDATE Project_tab SET Project_tab.prj_level = :n.prj_level WHERE Project_tab.projno = :n.projno; END IF; END;
15
16
Lakukan perintah:
UPDATE Emp_tab SET Sal = Sal + 1000.0 WHERE Deptno = 20;
17 Perancangan Basis Data - Trigger
18
19
thjvTriggers.java
import java.sql.* import java.io.* import oracle.sql.*
import oracle.oracore.*
public class thjvTriggers { public state void beforeDelete (NUMBER old_id, CHAR old_name) Throws SQLException, CoreException {
stmt.executeUpdate (sql);
stmt.close(); return; } } 20 Perancangan Basis Data - Trigger
Latihan
Menggunakan tabel Penjual(nama, minuman, harga) dan sebuah relasi unary, simpan daftar penjual yang menaikkan harga sebesar Rp.1000. Misal relasi Unary-nya kepada: KumpulanPenjual(nama). CREATE TABLE Penjual( minuman VARCHAR(10), nama VARCHAR(13), harga FLOAT ); CREATE TABLE KumpulanPenjual( nama VARCHAR(13) );
21
Trigger
CREATE OR REPLACE TRIGGER PriceTrig AFTER UPDATE OF price ON Penjual FOR EACH ROW WHEN (new.harga > old.harga + 1000) BEGIN INSERT INTO KumpulanPenjual VALUES(:new.nama); END; /
22
Contoh Lainnya:
CREATE TABLE emp ( empno INT, ename VARCHAR(30), deptno INT, sal FLOAT, comm FLOAT );
CREATE OR REPLACE TRIGGER emp_comm_trig BEFORE INSERT ON emp FOR EACH ROW BEGIN IF :NEW.deptno = 30 THEN :NEW.comm := :NEW.sal * .4; END IF; END; /
23 Perancangan Basis Data - Trigger
Latihan:
INSERT INTO emp VALUES (9005,'ROBERS',30, 3000,NULL); INSERT INTO emp VALUES (9006,'ALLEN',30, 4500,NULL);
EMPNO ENAME DEPTNO SAL COMM ----------------------------------9005 ROBERS 30 3000 1200 9006 ALLEN 30 4500 1800
24
Perintah-nya: RAISE_APPLICATION_ERROR.
Perintah yang mengaktifkan Trigger (insert, update, atau delete) akan dibatalkan.
Contohnya, perintah berikut ini memaksa nilai input harus Person.age >= 0:
CREATE TABLE Person (age INT); CREATE TRIGGER PersonCheckAge AFTER INSERT OR UPDATE OF age ON Person FOR EACH ROW BEGIN IF (:new.age < 0) THEN RAISE_APPLICATION_ERROR(-20000, 'no negative age allowed'); END IF; END; /
25 Perancangan Basis Data - Trigger
Statement-Level Trigger
Ketika operasi insert, update, atau delete operation terjadi pada tabel emp, sebuah record akan ditambahkan ke tabel empauditlog yang mencatat date, user, dan action. Sebelumnya, buat tabel empauditlog table:
Trigger
CREATE OR REPLACE TRIGGER emp_audit_trig AFTER INSERT OR UPDATE OR DELETE ON emp DECLARE v_action VARCHAR2(20); BEGIN IF INSERTING THEN v_action := 'Added employee(s)'; ELSEIF UPDATING THEN v_action := 'Updated employee(s)'; ELSEIF DELETING THEN v_action := 'Deleted employee(s)'; END IF; INSERT INTO empauditlog VALUES (SYSDATE, USER, v_action); END; /
27
Sekarang jalankan:
INSERT INTO emp (empno, ename, deptno) VALUES (9001,'SMITH',50); INSERT INTO emp (empno, ename, deptno) VALUES (9002,'JONES',50); UPDATE emp SET ename = 'SMITH BROWN' WHERE empno=9001; DELETE FROM emp WHERE empno IN (9001, 9002); SELECT TO_CHAR(AUDIT_DATE,'DD-MON-YY HH24:MI:SS') AS "AUDIT DATE", audit_user, audit_desc FROM empauditlog ORDER BY 1 ASC; AUDIT DATE -----------------08-FEB-08 09:43:02 08-FEB-08 09:43:02 08-FEB-08 09:43:02 08-FEB-08 09:43:02
28
Viewing Defined Triggers Untuk melihat Trigger yang tersimpan, gunakan perintah: SELECT * FROM USER_TRIGGERS[/DBA_TRIGGERS ] WHERE TABLE_NAME = MY_TABLE; Melihat isi (code) Trigger: SELECT text FROM user_source Harus WHERE name = 'PRICETRIG' UpperCase? ORDER BY line;
Menghapus Triggers
Sumber:
30