一、定义
数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(insert,update,delete)在指定表上发出时,Oracle自定地执行触发器中定义的语句序列。
简单的来说就当某个条件成立的时候,触发器里面所定义的语句就会被自动的执行,因此触发器不需要人为的去调用,也不能调用。
二、作用
1.数据校验
员工涨薪后工资不能少于涨薪前工资
2.进行复杂的安全性检查
禁止在非工作时间插入新员工
3.做审计,跟踪表上所做的数据操作
4.数据库的备份和同步
三、创建语法
create [or replace] trigger 触发器的名称
before | after
insert | update | delete
on 表名
[for each row] --对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次
declare
变量名称 变量类型;
begin
pl/sql语句;
end;
四、分类
1.语句级触发器(不管影响多少行,只会执行一次)
--数据校验, 星期六工作人员休息, 不能办理新员工入职
--在插入数据之前
--判断当前日期是否是周六
--如果是周六,就不能插入
create or replace trigger tri_test
before
insert
on emp
declare
--声明变量
vday varchar2(10);
begin
--查询当前
select trim(to_char(sysdate,'day')) into vday from dual;
--判断当前日期:
if vday = 'saturday' then
dbms_output.put_line('工作人员休息,不能办理入职');
--抛出系统异常
raise_application_error(-20001,'工作人员休息,不能办理入职');
end if;
end;
2.行级触发器(影响多少行,就执行多少次;加上for each row)
:old 代表旧的记录, 更新前的记录,:new 代表的是新的记录
--判断员工涨工资后的工资一定要大于涨工资前的工资
/*
200 --> 100
触发器 : before
旧的工资
新的工资
如果旧的工资大于新的工资 , 抛出异常,不让它执行成功
触发器中不能提交事务,也不能回滚事务
*/
create or replace trigger tri_updatesal
before
update
on emp
for each row
declare
begin
if :old.sal > :new.sal then
raise_application_error(-20002,'旧的工资不能大于新的工资');
end if;
end;
--创建序列
create sequence seq_person_pid;
--触发器,实现自动完成主键自增
create or replace trigger tri_add_person_pid
before
insert
on person
for each row
declare
begin
dbms_output.put_line(:new.pname);
--给新记录 pid 赋值
select seq_person_pid.nextval into :new.pid from dual;
end;