触发器的四个应用场景

触发器的四个应用场景:

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 inserton emp
​
beginif 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 rowbegin--if 张后的薪水<涨钱的薪水 thenif :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 updateon emp
​
for each rowbegin

--当涨后的薪水大于6000,插入审计信息

if:new.sal>6000 theninsert 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 updateon emp
​
for each rowbegin
-- 当主表更新后,自动更新备份表

 update emp_back set sal=:new.sal where empno=:new.empno;end;

使用如下更新语句会触发该触发器同步数据到备份表

update emp set sal=sal+10 where empno=7839;

在这里插入图片描述

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值