Oracle之触发器

一、定义

数据库触发器是一个与表相关联的、存储的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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值