概述
触发器的四个应用场景:
1.复杂的安全性检查:比如:禁止在非工作时间插入新员工
2.数据库的确认:比如:涨工资,工资应该越长越多的,如果越长越少就不叫涨工资了
3.数据库审计:比如:跟踪表上操作的记录,比如什么时间什么人操作了数据库,操作了表上的 记录是什么等
4.数据库的备份和同步:比如有两个数据库一个在北京一个在上海,在北京的数据库是主数据库,在上海的数据库是备用数据库,在主数据库中的数据被修改了以后可以通过触发器监听,如果被修改会将修改的数据传递给备份数据库,当主数据崩溃以后不影响数据的使用
触发器使用场景一:
复杂的安全性检查
禁止在非工作时间插入新员工
–周末:select to_char(sysdate,‘day’) from dual in (‘星期六’,‘星期日’);
–上班前,下班后:select to_number(to_char(sysdate,‘hh24’)) not between 9 and 18;
–不管插入10个员工还是1个员工,插入操作都只是对表操作一次,所以使用语句级触发器
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(-20007,'禁止在非工作时间插入新员工');
--自定义的错误代码比如在-20000-20009区间
end if;
end;
执行如下插入语句时当不满足9:00-18:00之间或者在非周末时间会触发以上触发器
insert into emp(empno,ename,sal,deptno) values(1002,'Tom',3000,10);
触发器使用场景二:数据的确认
涨工资不能越涨越少
涨工资的时候可能给1个员工涨工资,也可能给很多个员工涨工资,对每一条记录都要做检查
所以要使用行级触发器
CREATE OR REPLACE trigger checksalary
before update --涨工资之前需要检查一下涨后的工资是否少于涨钱的工资
on emp
for each row
begin
--if 张后的薪水<涨钱的薪水 then
if :new.sal<:old.sal then
raise_application_error(-20008,'涨后的薪水不能少于涨前的薪水,涨之后的薪水:'||:new.sal||' 涨之前的薪水:'||:old.sal);
end if;
end;
–:ord和:new 他们代表的是同一条记录,
–:ord是表示操作该行之前,这一行的值
–:new是表示操作该行之后,这一行的值
执行下面更新语句不会触发触发器:
update emp set sal=sal+1 where empno=7839;
执行下面更新语句会触发触发器,因为修改后的工资比修改前要低
update emp set sal=sal-1 where empno=7839;
触发器使用场景三:数据库的审计—>基于值的审计功能
给员工涨工资,当涨后的薪水超过6000块钱的时候,我们审计该员工的信息
准备工作,创建一张表用于保存审计信息
create table audit_info_emp(
information 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_epm values(:new.empno||' '||:new.ename||' '||:new.sal);
end if;
end;
使用如下更新语句给所以员工涨2000工资,涨薪后超过6000的员工会被写入审计表
update emp set sal=sal+2000;
commit;
触发器使用场景四:数据库的备用和同步
利用触发器实现数据的同步部分
准备工作:emp表:源数据表 emp_back表:模拟emp表的备份表
–不加where条件或者加了where条件为true为复制表结构及数据
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;
最后
以上就是寒冷学姐为你收集整理的触发器的四个应用场景的全部内容,希望文章能够帮你解决触发器的四个应用场景所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复