zoukankan      html  css  js  c++  java
  • 数据库的触发器

    触发器定义:
    触发器在数据库中独立于对象存储,与统计函数和存储过程需要用户主动调用不同,由事件驱动且自动隐式运行,触发器不接受参数。
    分为语句及触发器(表级触发器)或行级触发器;

    DML:SELECT、UPDATE、INSERT、DELETE(主要作用于对数据库中数据的增删查改的操作)
    DDL:CREATE、ALTER、DROP等(主要作用于定义或改变数据表结构,数据类型与数据表之间的连接或约束等初始化工作,多用于建表和初始化)

    语句级触发器对每个DML语句只执行一次

    实例
    CREATE OR REPLACE TRIGGER2019/4/13 13:16:55 emp_trigger
    --设置触发条件
    BEFORE INSERT OR DELETE
    --设置具体某个字段上触发
    --(BEFORE UPDATE OF sal,comm)
    --设置触发器作用位置
    ON emp
    --声明变量
    DECLARE
    v_date VARCHAR2(50);
    v_hour VARCHAR2(50);
    BEGIN
    SELECT TO_CHAR(SYSDATE,'day'),TO_CHAR(SYSDATE,'hh') INTO v_date,v_hour FROM dual;
    IF v_date='星期六' OR v_date='星期日' THEN
    --抛出错误
    RAISE_APPLICATION_ERROR(-20001,'周末不能办理离职手续');
    --(内部的编号可是-20000~-100000之间自行定义)
    ELSIF v_hour<8 OR v_hour>18 THEN
    RAISE_APPLICATION_ERROR(-20002,'非工作时段不能办理离职手续');

    END IF;
    END;
    /

    行级触发器对DML语句而言,只要有一条数据被影响就会被触发一次
    :new 和 :old 使用方法和意义:
    :new 只出现在 INSERT 和 UPDATE,而 :old 只出现在 UPDATE 和 DELETE 中。new代表新新增的数据而old代表原先的数据

    实例:
    CREATE OR REPLACE TRIGGER emp_trigger
    BEFORE INSERT
    ON emp
    --表示该触发器是行级触发器
    FOR EACH ROW
    BEGIN
    IF :new.sal > 5000 OR :new.sal < 1000 THEN
    RAISE_APPLICATION_ERROR( -20001 , ' 薪资不在规定范围 ' );
    END IF;
    END;
    /

    可通过行级触发器是 UPDATE 的级联操作
    CREATE OR REPLACE TRIGGER dept_trigger
    BEFORE UPDATE OF deptno
    ON dept
    FOR EACH ROW
    BEGIN
    UPDATE emp SET deptno = :new.deptno WHERE deptno = :old.deptno ;
    END;
    /

  • 相关阅读:
    matlab练习程序(RGB2HSV、HSV2RGB)
    matlab练习程序(距离变换)
    C++生成xml(使用tinyxml)
    matlab练习程序(RGB2YUV、YUV2RGB)
    修改 Google Desktop 的缓存目录
    Access 2003 中 null 和 '' 空字符串的奇怪问题
    娃娃
    【js:片断】jQuery 设置 select 下拉框的选中状态
    由 TypeInitializationException 引起的问题
    afaca 分析报告
  • 原文地址:https://www.cnblogs.com/hasagi/p/10719191.html
Copyright © 2011-2022 走看看