Oracle 觸發器的使用


一.觸發器的作用

  觸發器的作用類似攔截器.把一些針對數據庫的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 /

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM