Oracle學習第八天
阿新 • • 發佈:2019-02-05
觸發器
1.什麼是觸發器(trigger)概念:是一個與表相關聯的、儲存的PL/SQL程式
作用:每當一個指定的資料操作語句(insert、update、delete)在指定的表上發出時,Oracle自動地執行觸發器中定義的語句序列
第一個觸發器:每當成功插入新員工後自動列印“成功插入新員工”
create trigger saynewemp
after insert
on emp
declare
begin
dbms_output.put_line('成功插入新員工');
end;
/
2.觸發器應用場景
複雜的安全性檢查
資料確認
實現審計功能
完成資料的備份和同步
3.觸發器的語法
create [or replace] trigger 觸發器名
[before|after]
[delete|insert|(update[of 列名])]
on 表名
[for each row [when(條件)]]
plsql塊
4.觸發器的型別
語句級觸發器(針對表)
在指定的操作語句執行之前或之後執行一次,不管這條語句影響了多少行
行級觸發器(針對行)
觸發語句作用的每一條記錄都被觸發。在行級觸發器中使用:old和:new 偽記錄變數,識別值得狀態。
5.案例
①禁止在非工作時間插入資料
--非工作時間
1.週末 :to_char(sysdate,'day')in('星期六','星期日')
2.上班前,下班後:to_number(to_char(sysdate,'hh24'))not between 9 and 18
create or replace trigger test
before insert
on emp
declare
begin
if to_char(sysdate,'day')in('星期六','星期日') or to_number(to_char(sysdate,'hh24'))not between 9 and 18 then
--禁止insert新員工
raise_application_error(-20001,'禁止在非工作時間插入新員工');
end if;
end;
/
②漲工資不能越漲越少
create or replace trigger test2
before update
on emp
for each row
declare
begin
if :new.sal<:old.sal then
raise_application_error(-20002,,‘z漲後的薪水不能少於漲前的薪水’;
end;
/
:old和:new代表同一條記錄
:old 表示操作該行之前,這一行的值
:new 表示操作該行之後,這一行的值
③給員工工資,當漲後的工資超過6000的時候,審計該員工的資訊
create table audit_info(
information varchar2(200)
)
create or replace trigger test3
after update
on emp
for each row
declare
begin
if:new.sal>6000 then
insert into audit_info values(:new.empno||''||:new.ename||''||:new.sal)
end if;
end;
/
④資料備份同步
當給員工漲完工資後自動備份行的工資到備份表中
create talbe emp_back as select * from emp;
cerate or replace trigger test4
after update
on emp
for each row
declare
begin
update emp_back set sal=:new.sal where empno=:new.empno;
end;
/
快照:非同步備份