• PLSQL 触发器概念


    • 什么是触发器?

                      触发器是一个特殊的存储过程。

                      数据库触发器是一个与表想关联的,存储的PL/SQL程序

                      每当一个特定的数据操作语句(insert,Update,delete)在指定的表发出时,Oracle自动执行触发器中定义的语句序列

    • 触发器的应用场景。
    1. 复杂的安全性检查(代码请看式例一)
      1. 在特定的时间段不让操作数据,比如在周末or非工作时间,不让操作数据
    2. 数据的确认(代表请看式例二)
      1. 比如涨工资的时候,涨的工资肯定要比原工资要高,才叫涨工资。这时候就需要数据的确认。
    3. 数据库的审计
      1. 跟踪表上所在的数据操作。什么时间,什么人,操作了什么数据,操作的数据是什么,这就是数据库的审计。
      2. 数据库审计在oracle数据库中已经单独实现了,并且非常的强大。
      3. 数据库审计在Oracle中有五种,触发器只是其中一种。
    4. 完成数据的备份和同步
      1. 把主表里的数据备份到从表里,如果主表数据库崩溃就可以用从表数据库。
    • 触发器的类型
      • 语句级触发器
        • 在指定的操作语句操作之前或操作之后执行一次,不管这条语句影响了多少行。
      • 行级触发器
        • 触发语句作用的每一条语句都被触发。在行级触发器中使用:old和:new伪记录变量,识别值的状态。
        • :old 和 :new 代表的是同一行里的数据
        • :old 代表是操作之前的数据
        • :new 代表的是操作之后的数据
    • 触发器的语法(demo)

                     插入一条新员工之后打印一条语句

                             create trigger/*触发器关键字*/ saynewemp /*触发器名称*/
              after /*插入成功之后执行*/ insert /*添加数据的时候执行*/ on emp /*表名*/
           declare
           begin
                   dbms_output.put_line('成功插入新员工');  /*要执行的语句序列*/
              end;

    • --实施复杂的安全性检查(式例一)
      --禁止在非工作时间插入数据(这个触发器代表的是“语句型触发器”。影响的是整个表,不关心受影响的行数)
      /*
      1.周末  to_char(sysdate,'day')  in ('星期六','星期日')
      2.上班前  下班后  to_number(to_char(sysdate,'hh24')) not between 9 and 18
    1. before  操作之前执行   after  操作之后执行
    2. raise_application_error(-20001 ~ -29999,'提示字符串');  该函数代表自定义异常信息
      */
      create or replace trigger securityemp
        before insert on aaaaaa
      declare
      begin
        if to_char(sysdate, 'day') in ('星期六', '星期日') or
           to_number(to_char(sysdate, 'hh24')) not between 9 and 18 then
          raise_application_error(-20001, '禁止在非工作时间插入数据');
        end if;
      end;
    • /* (式例二)
      数据的确认(这是一个行级触发器)
      涨后的薪水不能少于涨前的薪水
      :old 和 :new 代表的是同一行里的数据
      :old 代表是操作之前的数据
      :new 代表的是操作之后的数据
      for each row 加上这条语句就代表是行级触发器
      */
      create or replace trigger namename
        before update on aaaaaa
        for each row
      declare
      begin
        if :old.role_name > :new.role_name then
          raise_application_error(-20003, '涨后的薪水不能少于涨前的薪水');
        end if;
      end;

    本来一落虫,悄悄低头走,

    自知弱菜鸡,牛人四处有。

    可愿抬起头,肩担抖一抖,

    回头是悠闲,前方无尽头。

  • 相关阅读:
    简单的三栏,文字多行居中效果 css原生
    目录
    HttpRunner使用
    测试职能
    缺陷
    SQL操作数据
    jmeter使用
    接口自动化理论引入
    接口自动化框架(Pytest,Allure,Yaml)
    jmeter 登陆--查询存在否-->新建客户-->查询存在否 + 压测
  • 原文地址:https://www.cnblogs.com/guojunjie/p/9177905.html
Copyright © 2020-2023  润新知