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

      Oracle触发器

    一.触发器的概念理解。

      数据库触发器是一个与表关联的存储下来的可以自动执行的PL/SQL程序。每当一个特定的数据操作语句在指定的表上发出时,Oracle自动的执行触发器中定义的语句序列。比如,你要实现银行卡数据的插入,插入姓名,数据库就自动的为你插入卡的ID和你账户的ID,这样的功能就可以使用触发器来实现。当然,还有其他的作用。

      一个表可以创建多个触发器。

      一个触发器可以实现多个功能。

      在触发器中可以用IF INSERTING THEN 、IF DELETING THEN 、 IF UPDATING THEN 结构来判断哪种操纵触发了触发器从而来实现对应的触发器功能。(相当于多个触发器总合在一起)

      触发器是一把双刃剑,添加了触发器,在项目开发的过程中,如果遇到了工作交接,这时就必须沟通好,所以触发器的注释一定要写好。

      触发器也可以调用存储过程和存储函数。

      什么情况下可能会用到触发器:

        1.数据确认。

        2.实施复杂的安全性检查。

        3.做审计,跟踪表上所做的数据操作等。

        4.数据的备份和同步。

      查询触发器: select * from user_triggers;

      查询触发器、函数、过程: select * from user_source;  

    二.触发器的分类。

    •   语句级触发器

         语句级触发器就是在数据操作前或者操作后执行的一次性的触发器。不管这个操作影响了多少行。

    •       行级触发器

         数据操作影响到的每一条记录都被触发,使用old和new伪记录变量,识别值的状态。

         在行级触发器中伪变量与触发语句的适用。

    触发语句 :old :new
    insert   将要插入的数据
    update 更新前该行的值 更新后的值
    delete 删除前该行的值  
        通过    :new.属性值  来调用。
    •       列级触发器

         列级触发器仅限于update操作时才会触发。

    三.通过实例来创建触发器。

        -----------触发器的语法---------
        CREATE [OR REPLACE] TRIGGER 触发器名称
        {BEFORE|AFTER}                                                                            BEFORE|AFTER:触发触发器数据操作之前执行触发器还是之后执行触发器。
        {DELETE|INSERT|UPDATE[OF列名]}                 DELETE|INSERT|UPDATE[OF列名]:触发触发器数据操作的类型。    
        ON 表名
        [FOR EACH ROW [WHEN(条件)]]                  FOR EACH ROW:行级触发器的关键字。WHEN:给行级触发器加一个条件,满足条件才执行,从而实现行级判断。
        PL/SQL块                  

        ------------实现一个自动增长的ID列的触发器-------------


        --创建一个id,name的person表--
        create table person(
        id number primary key,
        name varchar2(20) not null
        );

        ---因为是自动增长的触发器,所以要先创建一个增长的序列--
        create sequence id_incr
        start with 1001
        increment by 1
        nomaxvalue
        nocycle
        cache 10;

        --------创建好序列之后就可以创建触发器了------------------


        

        --创建一个插入name时触发ID自动插入的触发器--

        create or replace trigger id_tri
        before
        insert on person
        for each row
        declare
        nextid number;
        begin
        select id_incr.nextval into nextid from dual;
        :new.id:=nextid;
        end;

        -----所有准备工作完成就可以插入数据了----
        insert into person(name) values('张三');
        insert into person(name) values('李四');

        select * from person;

        

        -----------实现一个插入数据时判断姓名是否以j开头的触发器-------------
        表还是person表


        create or replace trigger j_name
        before
        insert on person for each row
        begin
        if :new.name like 'j%' then
        raise_application_error(-20000,'不能使用j开头的姓名');
        end if;
        end;

        insert into person(name) values('j云霞');执行这条语句时就会抛出应用程序异常,提示不能使用j开头的姓名。相当于高级的约束。

        

        ------------------在触发器中针对某种类型的触发实现针对的功能---------
        表还是person表

        create or replace trigger is_what
        before
        insert or update or delete on person
        begin
        if inserting then
        dbms_output.put_line('这是插入数据时触发的');
        elsif updating then
        dbms_output.put_line('这是更新数据时触发的');
        else
        dbms_output.put_line('这是删除数据时触发的');
        end if;
        end;

        使用下列三条语句体来检测:
        set serveroutput on;
        insert into person(name) values('徐文帅');

        set serveroutput on;
        update person set name='张三' where name='徐文帅';

        set serveroutput on;
        delete person where name='张三';

        注意:is_what触发器是语句级触发器,所以你在增删改检测的时候,不论person有几条语句被牵扯到,它只会put_line一条提示语句。这就是语句级触发器和行级触发器的一个区别。

        

        ------------------------给id创建一个列级触发器--------
        create or replace trigger id_up
        before update of id on person
        begin
        dbms_output.put_line('更新id的触发器被触发了');
        end;

        

        set serveroutput on;
        update person set id=0000 where id='1001'; 这条语句执行的时候就会触发id_up触发器。   

        set serveroutput on;
        update person set name='aaa' where name='bbb';这条语句执行的时候就不会触发id_up触发器。

        

  • 相关阅读:
    js学习(三)对象与事件
    js学习(二)
    js学习(一)
    SSM+Redis结构框架及概述
    javaBean、EJB、POJO
    flex布局时的居中问题
    layui后台管理系统的坑
    基于element的模糊查询
    vue数组的运用
    uni-app 图片上传(uploadFile)
  • 原文地址:https://www.cnblogs.com/bzx888/p/4813175.html
Copyright © 2011-2022 走看看