什么是触发器
是一个特殊的存储过程
是完成一个特定功能的一个程序
是一个与表相关联的,存储的PLSQL程序
每当一个特定的数据操作语句 insert update delete在指定的表
上触发时,Orcale自动执行触发器中定义的语句序列
语法
1.复杂的安全性检查
2.数据的确认
3.实现审计功能
是一个特殊的存储过程
是完成一个特定功能的一个程序
是一个与表相关联的,存储的PLSQL程序
每当一个特定的数据操作语句 insert update delete在指定的表
上触发时,Orcale自动执行触发器中定义的语句序列
语法
create Trigger XXXX
after insert [of 列名]
on emp
declare
begin
(执行一些动作);
end;
应用场景
1.复杂的安全性检查
2.数据的确认
3.实现审计功能
4.完成数据的备份的同步
--触发器
create table emp (
id number(10) primary key, --id
empname varchar2(100), --员工名
deptno number(10), --部门id
sal number(9,2) --薪水
);
--安全性检查
--禁止在非工作时间插入新员工
/*
1周末 to_char(sysdate,'day') in ('星期六','星期日')
2上班前 下班后 to_number(to_char(sysdate,'hh24')) not between 9 and 18
*/
create trigger tri_emp
before insert --插入之前操作
on emp
declare
if to_char(sysdate,'day') in ('星期六','星期日') or
to_number(to_char(sysdate,'hh24')) not between 9 and 18 then
--禁止插入 满足条件就进入异常,程序插入失败
raise_appliation_error(-20001,'禁止在非工作时间插入新员工');
end if
end;
drop trigger tri_emp;
insert into emp values(3,'xiangdehua3',1,10000);
--数据确认
--涨后工资不能少于涨前的薪水
/*
代表同一条记录
:old 表示操作该行之前的值
:new 表示操作该后之前的值
*/
create trigger tri_checksalary
before update
on emp
for each row
begin
if :new.sal<:old.sal then
raise_application_error(20002,'涨后工资不能少于涨前的薪水');
end if;
end;
update emp set sal = sal-1 where id =1;
--数据库的审计--基于值的审计功能
--给员工涨工资,当涨后的薪水超过6k的时候审计员工信息
--创建表用于保存员工信息
create table audit_info(
information varchar2(2000)
);
/*
代表同一条记录
:old 表示操作该行之前的值
:new 表示操作该后之前的值
*/
create or replace trigger tri_audit_emp_salry
after update
on emp
for each row
begin
if :new.sal>6000 then
insert into audit_info values(:new.empname||'的工资大于6k');
end if;
end;
update emp set sal=sal+9000 where id =1;
select * from audit_info;
--创建备份表
create table emp_backup as select * from emp;
--数据库的备份和同步
--涨完工资后自动备份新的工资到备份表中
/*
*/
create or replace trigger tri_sync_salary
after update
on emp
for each row
begin
update emp_backup set sal=:new.sal where id = :new.id;
end;
update emp set sal =sal+20000 where id =2 ;
学习自CSDN和慕课老师的个人总结。