一:概念
是oracle在發生某些事件時,可以自動觸發並調用的plsql程序,可以定義在事件上,由事件自動觸發。
二:分類
1)系統觸發器:由系統事件觸發的plsql程序,比如登陸oracle數據庫,登出oracle。
2)DML觸發器:由DML語句觸發的plsql程序,比如增刪改。
三:DML觸發器
-->語句觸發器
a.如果執行完一條DML語句后,希望對整張表的數據進行預算,使用語句觸發器,這種觸發器是在DML執行前/后自動觸發的。
b.語法
create [or replace] trigger 觸發器名
before | after insert | update | delete on 表
declare
--變量聲明區
begin
--處理業務
end;
/
注:觸發器自動調用,在DML語句執行之前或之后。
c.練習:在進行任何增刪改操作后,計算出員工數,員工薪資合計,員工平均工資。
create or replace trigger emp_tri
after insert or update or delete on emp
declare
count_emp number;
sal_total number;
sal_avg number;
begin
select count(*) into count_emp from emp;
select sum(sal) into sal_total from emp;
select avg(sal) into sal_avg from emp;
dbms_output.put_line(count_emp||' '||sal_total||' '||sal_avg);
end;
/
update emp set sal = 1000 where empno=7698;--當我們執行此sql語句時,觸發器就會觸發,輸出相應的值。
-->行級觸發器
a.如果在執行DML時,希望對當前操作的數據進行處理,那么可以使用行級觸發器。行級觸發器也是在執行DML之前/后自動觸發的,在行級觸發器中可以使用行變量引用到DML所操作的數據,這個行變量是內置的,可以直接使用。
b.行變量
-- :new 表示引用的是新增后的行數據
-- :old 表示引用的是修改/刪除前的行數據
-- 規則
insert語句只有:new,表示插入后的數據。
delete語句只有:old,表示刪除前的舊的數據。
update語句二者都有,new表示修改后的數據,old表示修改前的數據。
c.語法
create or replace trigger 觸發器名
before | after insert | update | delete on 表名
for each row
declare
--聲明變量
begin
--業務邏輯
end;
/
d.練習:刪除dept表數據之前,將刪除記錄存入備份表。
create or replace trigger dept_trig
before delete on dept
for each row
declare
begin
insert into dept_bak values(:old,deptno,:old.name,:old.loc);
end;
/
注:觸發器不要寫commit。