一、什么是触发器?
1、概念
数据库触发器是一个与表相关联的、存储的PL/SQL程序。
2、作用
每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。
二、如何创建触发器
create trigger saynewemp
after insert
on emp
declare
begin
dbms_output.put_line(‘成功插入新员工’);
end;
/
三、触发器的应用场景
1、复杂的安全性检查
2、数据确认
3、实现数据库审计功能
4、完成数据的备份和同步
四、触发器的类型
1、行级触发器(针对是行)
- 触发语句作用的每一条记录都被触发。在行级触发器中使用old和new伪记录变量,识别值的状态。
2、语句级触发器(针对是表)
- 在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。
五、案例
1、触发器案例一:复杂的安全性检查
禁止在非工作时间插入数据
--触发器应用场最1:实施复杂的安全性检查
--禁止在非工作时间插入新员工
/*
1.周末:
select to_char(sysdate,'day') from dual;
->to_char(sysdate,'day') in ('星期六', '星期日')
2、上班前,下班后:
to_number(to_char(sysdate,'hh24')) not between 9 and 18
->to_number(to_char(sysdate,'hh24')) from dual;
*/
create or replace trigger securityemp
before insert
on emp
begin
if to_char (sysdate,'day') in ('星期六','星期日') or
to_number(to_char(sysdate,'hh24')) not between 9 and 18 then
--禁止insert员工,raise_application_error(错误的代码<-20000-20999>. '提示信息')应用层抛出错误函数
raise_application_error(-20001, '禁止在非工作时间插入员工');
end if;
end;
/
insert into emp(empno,ename,sal,deptno)
values (1001, 'Tom', 3000,10);
因为我测试的时候是星期一,所以他能插入新员工。弄到这里的时候差点怀疑人生
2、触发器案例二:数据的确认
涨工资不能越涨越少
--触发器应用场最2:数据的确认
--涨后的薪水不能少于涨前的薪水
/*
1、:o1d和:new代表同一条记录
2、:old表示操作该行之前,这一行的值
:new表示操作该行之后,这一行的值
*/
create or replace trigger checksalary
before update
on emp
for each row
begin
if :new.sal < :old.sal then
raise_application_error(-20002, '涨后的薪水不能少于涨前的薪水'||:new.sal||'涨前的薪水'||:old.sal);
end if;
end;
/
update emp set sal = sal - 1 where empno = 7839;
3、触发器案例三:数据库审计
创建基于值的触发器
/*
触发器应用场景3:数据库的审计--->基于值的审计功能
给员工涨工资,当涨后的薪水超过6000块钱时,审计该员工的信息
*/
--创建表,用于保存审计信息
create table audit_info
(
in formation varchar2(200)
);
create or replace trigger do_audit_emp_salary
after update
on emp
for each row
begin
--当涨后的薪水大于6000,插入审计信息
if :new.sal > 6000 then
insert into audit_info values(:new. empno||' '||:new.ename||' '|| :new.sal);
end if;
end;
/
因为我的audit_info表已经存在,所以提示错误
update emp set sal = sal + 2000;
虽然上面提示已经更新,但打开表里面又没有数据:
所以更新完数据后要提交:
然后刷新一下表:
4、触发器案例四:数据的备份和同步
create table emp_back as select * from emp;
/*
触发器应用场景四:数据的备份和同步
当给员工涨完工资后,自动备份新的工资到备份表中
*/
create or replace trigger sync_salary
after update
on emp
for each row
begin
--当主表更新后,自动更新备份表
update emp_back set sal=:new.sal where empno= :new.empno;
end;
/
主表:
备份表:
执行下面的代码:
update emp set sal = sal +10 where empno=7839;
执行完后:备份表随着主表同时更新
主表:
备份表:
六、总结
- 数据库触发器是一个与表相关联的、存储的PL/SQL程序。
- 触发器的应用实践。