一.觸發器的作用
觸發器的作用類似攔截器.把一些針對數據庫的DML操作(insert/update/delete/select)進行攔截,符合業務要求的進行操作,不符合要求的操作可以通過拋出異常來阻止
說白了就是數據確認(after)與安全性檢查(before),此外觸發器不針對select操作
二.觸發器的使用
語法不再贅述,百度或者查閱oracle的文檔都能找到
以下的一些例子是基於scott用戶下的emp表
1.創建語句級觸發器insertEmpTrigger,當對表【emp】進行增加【insert】操作前【before】,顯示'插入了一條數據'
注意是單引號
1 --創建觸發器
2 create or replace trigger insert_trigger 3 before 4 insert
5 on emp 6 for each row 7 begin
8 dbms_output.put_line('插入了一條數據'); 9 end; 10 /
如果不加for each row即使一次插入多條數據,觸發器仍然只工作一次(普通的語句觸發器),for each row 使得這個觸發器變成了一個行觸發器
2.星期一到星期五,且9-21點能向數據庫emp表插入數據,否則使用函數拋出異常,使用:raise_application_error('-20000','例外原因')
說明:raise_application_error(error_number,error_message) 用於拋出自定義的異常 error_number為-20000 到 -20999 之間,error_message表示錯誤的信息
注意:不能僅僅用整點來控制,必須要考慮分鍾的問題
1 create or replace trigger security_trigger 2 before 3 insert
4 on emp 5 for each row 6 declare
7 pday varchar2(10); 8 phour number(2); 9 begin
10 select to_char(sysdate,'day') into pday from dual; 11 select ceil(to_char(sysdate,'hh24.mi')) into phour from dual; 12 if pday in ('星期六','星期日') or phour not between 9 and 21 then
13 raise_application_error('-20000','非工作日不能插入數據'); 14 end if; 15 end; 16 /
觸發器創建之后,在周一的 21:57時已經不能插入數據
3.創建行級觸發器checkSalaryTrigger,漲后工資這一列,確保大於漲前工資(10%) (:new.sal/:old.sal的使用)
:new.列名 與:old.列名 分別表示 某列的新值與舊值,而且這兩個變量只有在創建觸發器時加上for each row才會出現
此外update二者皆有,insert只有:new,delete只有:old(上面已經說過,觸發器不針對select操作)
1 create or replace trigger checkSalary_trigger 2 after 3 update
4 on emp 5 for each row 6 begin
7 -- 偽變量:new.sal表示更新后的sal字段
8 -- 10% 要寫成 0.1
9 if (:new.sal - :old.sal) < :old.sal*0.1 then
10 raise_application_error('-20000','工資漲幅必須大於10%'); 11 else
12 dbms_output.put_line('更新成功!'); 13 end if; 14 end; 15 /