【Oracle】触发器最系统入门学习指导

前言:通过本次学习您可以学到什么


目录:

一、什么是触发器?

二、触发器的应用场景是什么?

  1、复杂的安全性检查

  2、数据的确认

  3、实现审计功能

  4、完成数据的备份和同步

三、触发器的语法是什么?

四、触发器的类型有哪些?

  1、语句级的触发器

  2、行级的触发器

五、案例介绍


----------------------------------------------------------------------------------------------

一、什么是触发器?

每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。

注意select语句不在上述的操作范围内。

第一个触发器:每当成功插入新员工信息后,自动打印“成功插入新员工”。

如何创建触发器

create trigger savenewemp

after insert

on emp

declare

begin

dbms_output.put_line( '成功插入新员工' );

end;

/

这个oracle中的触发器就非常类似于我们熟悉的java中的监听器。



二、触发器的应用场景是什么?

  1、复杂的安全性检查

当我们需要安全性策略的时候,比如周末禁止操作数据库等。

  2、数据的确认

比如我们涨工资的时候,如果工资变少了,就可以用触发器进行确认。

  3、实现审计功能

跟踪表上所做的数据操作,目前也在oracle中单独实现,也可以用触发器实现,这种审计叫做基于值的审计

  4、完成数据的备份和同步



三、触发器的语法是什么?


上面我们漏提到了一句语法:[For each row[when(条件)]]

首先我们需要先了解触发器的类型,如果有上面这句[For each row[when(条件)]]的话,那他就是行级触发器。


四、触发器的类型有哪些?

语句级触发器:在指定的操作语句操作之前或者之后执行一次,不管这条语句影响了多少行。

针对的是表。

行级触发器:触发语句作用的每一条记录都被触发,在行级触发器中我们使用:old和:new伪记录变量,识别值得状态。

针对的是行。


五、触发器的应用场景 

  1、复杂的安全性检查

实施复杂的安全性检查:禁止在非工作时间插入新员工。

/*

1、周末:to_char(sysdate,'day') in ('星期六','星期日')

2、上班前(9),下班后(18):to_number(to_char(sysdate,'hh24')) not between 9 and 18

*/

create or replace trigger securityemp

before insert

on emp

declare

begin

if to_char(sysdate,'day') in ('星期六','星期日')

or to_number(to_char(sysdate,'hh24')) not between 9 and 18

then

-- 禁止insert新员工

raise_application_error(-20001,'禁止在非工作时间插入新员工!');

end;

/

注意,上面的raise_application_error函数中的第一个参数的值范围是-20000~-29999

上面这个例子就是针对表的一个操作,所以没有[For each row[when(条件)]]



  2、数据的确认

涨工资不能越涨越少,每一条记录都需要检查,必然这个触发器是行级触发器。

/*

涨后的薪水不可以少于涨前的薪水

1、:old \ :new :代表的是同一条记录。

2、:old :表示操作该行之前,这一行的值。

3、:new :标示操作该行之后,这一行的值。

*/

create or replace trigger checksalary

before update

on emp

for each row 

begin

--涨后的薪水不可以少于涨前的薪水

--if 涨后薪水<涨前薪水 then

if :new.sal < :old.sal then

raise_application_error(-20002,'涨后的薪水不可以少于涨前的薪水!');

end if;

end;

/


上面这个例子就是针对每一行的一个操作,所以有[For each row[when(条件)]]


  

  3、实现审计功能

创建基于值得触发器

/*

数据库的审计---》基于值得审计功能

给员工涨工资,当涨后的工资超过6000元的时候,审计该员工的信息。

*/

--创建表,用于保存审计信息

create table audit_info

(

information varchar2(200)

)


create or replace trigger do_audit_emp_salary

after update

on emp

for each row

declare

begin

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

if :new.sal > 6000 then

insert into audit_info values(:new.empno|| '  '|| :new.ename||'  '||:new.sal);

end if;

end;

/



上面这个例子就是针对每一行的一个操作,所以有[For each row[when(条件)]]


  4、完成数据的备份和同步

利用触发器实现数据的备份和同步:同步备份,没有延时。

分布式数据库。



/*

数据的备份和同步

当给员工涨完工资后自动备份新的工资到备份表中。

这是一个行级触发器。

*/

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;

/



上述是同步备份,若无网络压力,则无延迟。

下面还有一种快照备份我们不做详述。


本章小结,希望对您有所帮助:

数据库的触发器是一个与表相关联的、存储的PL/SQL程序。

四个场景:

1、复杂的安全性检查

2、数据的确认

3、数据库的审计

4、数据的备份和同步


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值