- Thay DEPTNO của các nhân viên này bằng DEPTNO của Boston Thay lương mỗi nhân viên bằng lương trung bình của bộ phậ n * 1.1 Thay commission
Chương 15 DATABASE TRIGGER
Database trigger là nh ng th t c đữ ủ ụ ược th c hi n ng m đ nh ngay khi th c hi n l nh SQL nh ự ệ ầ ị ự ệ ệ ưINSERT, DELETE, UPDATE nh m đ m b o các quy t c logic ph c t p c a d li u. Thi t k các database triggerằ ả ả ắ ứ ạ ủ ữ ệ ế ế tho mãn các yêu c u sau: ả ầ
S d ng các database trigger nh m đ m b o th c hi n t t c các thao tác có liên ử ụ ằ ả ả ự ệ ấ ả quan t i l nh can thi p d li u đớ ệ ệ ữ ệ ược th c hi n. ự ệ
Ch s d ng database trigger đ i v i các thao tác tr ng tâm. ỉ ử ụ ố ớ ọ
Không s d ng database trigger đ th c hi n các ràng bu c s n có trong database ử ụ ể ự ệ ộ ẵ Oracle. Ví d : dùng database trigger đ thay th cho các constrain. ụ ể ế
S d ng database trigger có th gây r i, khó khăn cho vi c b o trì và phát tri n h ử ụ ể ố ệ ả ể ệ th ng l n. Vì th , ta ch s d ng database trigger khi th t c n thi t. ố ớ ế ỉ ử ụ ậ ầ ế
15.1.T O TRIGGER Ạ
Khi t o database trigger, ta c n l u ý t i m t s tiêu chí nh : ạ ầ ư ớ ộ ố ư
Th i gian th c hi n: ờ ự ệ BEFORE, AFTER
Hành đ ng th c hi n: ộ ự ệ INSERT, UPDATE, DELETE Đ i tố ượng tác đ ng: b ng d li u ộ ả ữ ệ
Lo i trigger th c hi n: trên dòng l nh hay trên câu l nhạ ự ệ ệ ệ
M nh đ đi u ki n th c hi n ệ ề ề ệ ự ệ
N i dung c a trigger ộ ủ 15.1.1. Phân lo i trigger ạ
Ta có th phân lo i trigger theo th i gian th c hi n nh : ể ạ ờ ự ệ ư BEFORE và AFTER.
BEFORE trigger: Trigger được kích ho t trạ ước khi th c hi n câu l nh. Vi c này có ự ệ ệ ệ th cho phép ta lo i b t các phép x lý không c n thi t, th m chí có th rollback d ể ạ ớ ử ầ ế ậ ể ữ li u trong trệ ường h p có th gây ra các ngo i l (exception). Trigger thu c lo i này ợ ể ạ ệ ộ ạ
thường đượ ử ục s d ng đ i v i các thao tác ố ớ INSERT ho c ặ UPDATE.
AFTER trigger: Câu l nh đệ ược th c hi n xong thì trigger m i đự ệ ớ ược kích ho t. ạ Th c hi n các công vi c thự ệ ệ ường ph i làm sau khi đã th c hi n câu l nh. ả ự ệ ệ
INSTEAD OF trigger: Lo i trigger này cho phép ngạ ườ ử ụi s d ng có th thay đ i ể ổ m t cách trong su t d li u c a m t s view mà không th th c hi n thay đ i tr c ộ ố ữ ệ ủ ộ ố ể ự ệ ổ ự ti p đế ược. V i ớ INSTEAD OF trigger, ta có th th c hi n v i c ba thao tác: insert, ể ự ệ ớ ả update, delete.
Ta cũng có th phân lo i trigger theo lo i câu l nh kích ho t nh : ể ạ ạ ệ ạ ư INSERT, UPDATE, DELETE. Trong các trigger thu c m t trong ba lo i l nh: ộ ộ ạ ệ INSERT, UPDATE,DELETE. Trigger UPDATE c n ph i chầ ả ỉ rõ thêm tên c t d li u kích ho t trigger m i khi giá tr d li u trong đó b thay đ i. Bên trong Trigger cóộ ữ ệ ạ ỗ ị ữ ệ ị ổ th có ch a các l nh thao tác d li u. Do đó, c n ph i tránh trể ứ ệ ữ ệ ầ ả ường h p l p l i theo ki u đ quy. ợ ặ ạ ể ệ
M t cách khác ta cũng có th phân lo i trigger theo s l n kích ho t. theo đó s có 02 lo i trigger: ộ ể ạ ố ầ ạ ẽ ạ
Trigger m c l nh: Trigger đứ ệ ược kích ho t m i khi th c hi n câu l nh. ạ ỗ ự ệ ệ
Trigger m c dòng l nh: Trigger đứ ệ ược kích nhi u l n ng v i m i dòng d li u ch u ề ầ ứ ớ ỗ ữ ệ ị nh h ng b i thao tác th c hi n lênh.
ả ưở ở ự ệ
Oracle c b n - SQL và PL/SQL ơ ả
Hình v 15. Th t th c hi n trigger ẽ ứ ự ự ệ
15.1.2. L nh t o trigger ệ ạ
Ta có th t o trigger thông qua l nh script. ể ạ ệ Cú pháp l nh t o trigger m c câu l nh: ệ ạ ứ ệ
CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name
BEGIN
PL/SQL Block; END;
Cú pháp l nh t o trigger m c dòng d li u: ệ ạ ứ ữ ệ
CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name
[REFERENCING OLD AS old | NEW AS new] FOR EACH ROW
[WHEN condition] BEGIN
PL/SQL Block; END;
V i: ớ
trigger _name Tên trigger
timing Th i gian kích ho t trigger ờ ạ
event Lo i câu l nh kích ho t trigger ạ ệ ạ
referencing Tên bi n thay th cho giá tr trế ế ị ước và sau thay đ i c a dòng d li u đang x lý ổ ủ ữ ệ ử
FOR EACH ROW Trigger thu c lo i tác đ ng trên dòng d ộ ạ ộ ữ
li u ệ
WHEN Ch ra m t s đi u ki n ràng bu c th c ỉ ộ ố ề ệ ộ ự
hi n trigger ệ
table_name Tên b ng d li u có g n trigger trên đó ả ữ ệ ắ
PL/SQL Block N i dung kh i l nh SQL và PL/SQL trong ộ ố ệ
trigger
Ví d : ụ
CREATE OR REPLACE TRIGER secure_emp BEFORE INSERT ON emp
BEGIN
IF TO_CHAR(sysdate,’DY’) IN (‘SAT’,’SUN’)
OR TO_CHAR(sysdate,’HH24’) NOT BETWEEN ‘08’ AND ’18’ THEN
RAISE_APPLICATION_ERROR (-20500,
’Th i gian làm vi c không phù h p’); ờ ệ ợ
END IF; END;
CREATE OR REPLACE TRIGER audit_emp_values AFTER DELETE OR INSERT OR DELETE ON emp FOR EACH ROW
BEGIN
INSERT INTO audit_emp_values (user_name, timestamp, id, old_last_name, new_last_name, old_title, new_tile, old_salary, new_salary)
VALUES (USER, SYSDATE, :old.empno, :old.ename,
:new.ename, :old.job, :new.job, :old.sal, :new.sal);
END;
15.1.3. S d ng Procedure builder đ t o trigger ử ụ ể ạ
Ta cũng có th t o database trigger thông qua công c Procedure builder c a Oracle. Ta l n lể ạ ụ ủ ầ ượt th c hi n theo các bự ệ ước sau:
1. K t n i t i database ế ố ớ
2. D ch chuy n t i đ i tị ể ớ ố ượng đ t trigger trong ph n Object Navigator ặ ầ 3. Chuy n t i ph n trigger r i b m nút New đ t o m i trigger. ể ớ ầ ồ ấ ể ạ ớ 4. Đ t các tuỳ ch n v th i gian, ki u,.. cho trigger ặ ọ ề ờ ể
5. So n th o n i dung c a trigger ạ ả ộ ủ6. L u gi trigger ư ữ