一:概念
是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。