【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、数据的备份和同步