一、什么是触发器?

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;
/

sybase数据库 触发器 数据库触发器编写实例_sybase数据库 触发器

insert into emp(empno,ename,sal,deptno)
values (1001, 'Tom', 3000,10);

sybase数据库 触发器 数据库触发器编写实例_oracle_02


因为我测试的时候是星期一,所以他能插入新员工。弄到这里的时候差点怀疑人生

sybase数据库 触发器 数据库触发器编写实例_oracle_03

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;
/

sybase数据库 触发器 数据库触发器编写实例_oracle_04

update emp set sal = sal - 1 where empno = 7839;

sybase数据库 触发器 数据库触发器编写实例_数据_05

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表已经存在,所以提示错误

sybase数据库 触发器 数据库触发器编写实例_oracle_06

update emp set sal = sal + 2000;

sybase数据库 触发器 数据库触发器编写实例_触发器_07


虽然上面提示已经更新,但打开表里面又没有数据:

sybase数据库 触发器 数据库触发器编写实例_数据_08


所以更新完数据后要提交:

sybase数据库 触发器 数据库触发器编写实例_数据_09


然后刷新一下表:

sybase数据库 触发器 数据库触发器编写实例_数据库_10

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;
/

sybase数据库 触发器 数据库触发器编写实例_触发器_11


主表:

sybase数据库 触发器 数据库触发器编写实例_oracle_12


备份表:

sybase数据库 触发器 数据库触发器编写实例_oracle_13


执行下面的代码:

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

sybase数据库 触发器 数据库触发器编写实例_sybase数据库 触发器_14


执行完后:备份表随着主表同时更新

主表:

sybase数据库 触发器 数据库触发器编写实例_sybase数据库 触发器_15


备份表:

sybase数据库 触发器 数据库触发器编写实例_oracle_16

六、总结

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