標籤:error ptr div 星期六 temp src var create 檢查
一.觸發器的作用
觸發器的作用類似攔截器.把一些針對資料庫的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 begin10 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 then13 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 then10 raise_application_error(‘-20000‘,‘工資漲幅必須大於10%‘);11 else 12 dbms_output.put_line(‘更新成功!‘);13 end if;14 end;15 /
Oracle 觸發器的使用