zoukankan      html  css  js  c++  java
  • Oracle 触发器的使用

    一.触发器的作用

      触发器的作用类似拦截器.把一些针对数据库的DML操作(insert/update/delete/select)进行拦截,符合业务要求的进行操作,不符合要求的操作可以通过抛出异常来阻止

      说白了就是数据确认(after)与安全性检查(before),此外触发器不针对select操作

    二.触发器的使用

      语法不再赘述,百度或者查阅oracle的文档都能找到

      以下的一些例子是基于scott用户下的emp表

    1.创建语句级触发器insertEmpTrigger,当对表【emp】进行增加【insert】操作前【before】,显示'插入了一条数据'

      注意是单引号

     1 --创建触发器
     2 create or replace trigger insert_trigger
     3 before
     4 insert
     5 on emp
     6 for each row
     7 begin
     8         dbms_output.put_line('插入了一条数据');
     9 end;
    10 /

    如果不加for each row即使一次插入多条数据,触发器仍然只工作一次(普通的语句触发器),for each row 使得这个触发器变成了一个行触发器

    2.星期一到星期五,且9-21点能向数据库emp表插入数据,否则使用函数抛出异常,使用raise_application_error('-20000','例外原因')

    说明:raise_application_error(error_number,error_message) 用于抛出自定义的异常 error_number为-20000 到 -20999 之间,error_message表示错误的信息

     注意:不能仅仅用整点来控制,必须要考虑分钟的问题

     1 create or replace trigger security_trigger
     2 before
     3 insert
     4 on emp
     5 for each row
     6 declare
     7         pday varchar2(10);
     8         phour number(2);
     9 begin
    10         select to_char(sysdate,'day')  into pday  from dual; 
    11         select ceil(to_char(sysdate,'hh24.mi'))   into phour  from dual;
    12         if pday in ('星期六','星期日') or phour not between 9 and 21  then
    13                 raise_application_error('-20000','非工作日不能插入数据');
    14         end if;
    15 end;
    16 /

     触发器创建之后,在周一的 21:57时已经不能插入数据

     

    3.创建行级触发器checkSalaryTrigger,涨后工资这一列,确保大于涨前工资(10%) (:new.sal/:old.sal的使用)

      :new.列名:old.列名 分别表示 某列的新值与旧值,而且这两个变量只有在创建触发器时加上for each row才会出现

     此外update二者皆有,insert只有:new,delete只有:old(上面已经说过,触发器不针对select操作)

     1 create or replace trigger checkSalary_trigger
     2 after
     3 update
     4 on emp
     5 for each row
     6 begin
     7         -- 伪变量:new.sal表示更新后的sal字段
     8         -- 10% 要写成 0.1
     9         if (:new.sal - :old.sal) < :old.sal*0.1 then
    10             raise_application_error('-20000','工资涨幅必须大于10%');
    11         else 
    12             dbms_output.put_line('更新成功!');
    13         end if;
    14 end;
    15 /

  • 相关阅读:
    Postman提取接口返回值设置变量
    Python-浅拷贝与深拷贝
    Python列表
    typeorm查询两个没有关联关系的实体
    springboot去掉数据源自动加载
    docker搭建redis集群
    实习工作记录(一)大文件上传vue+WebUploader
    js重点之promise
    css重点
    git简单命令整理
  • 原文地址:https://www.cnblogs.com/tele-share/p/7719591.html
Copyright © 2011-2022 走看看