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

    一、 什么是触发器
    数据库触发器是一个存储的PL/SQL程序块,它与一个基表联系,当在表上执行特定的数据库维护(插入、删除、更新这三种操作)时,隐含地执行一个PL/SQL程序块。

    二、触发器的作用:
                  。防止非法的数据库操纵、维护数据库安全
                  。对数据库的操作进行审计,存储历史数据
                  。完成数据库初始化处理
                  。控制数据库的数据完整性
                  。进行相关数据的修改
                  。完成数据复制
                  。自动完成数据库统计计算
                  。限制数据库操作的时间、权限等,控制实体的安全性



    三、触发器的组成:
                 1、触发时间:触发器事件的时间次序(before, afer)[2]
                 2、触发事件:什么SQL语句会引起触发器触发(Insert, delete, update)[3]
                 3、触发子体:触发器触发时要执行的操作(一个完整的PL/SQL程序)
                 4、触发类型:触发器被执行的次数(语句级、行级)[2] //语句级只执行一次,行级会执行多次。
                      [*]一个表上最多可以创建12个不同类型的触发器:3*2*2 = 12


    四、创建触发器注意事项:
                  1、在触发器中可以调用存储过程、包;在存储过程中不得调用触发器。
                  2、在触发器中不得使用commit, rollback, savepoint语句。
                  3、在触发器中不得间接调用含有commit, rollback, savepoint的语句的存储过程及函数。

    五,创建触发器


    实现当操纵员工表时自动将员工人数统计到部门表中。
    1  scott用户下
    create table dept1(dno int,dname varchar(20),population int);
    create table emp1(eid int,ename varchar2(20),dno int);

    insert into dept1 values (11,'sale',0);
    insert into dept1 values (12,'market',0);
    insert into dept1 values (13,'study',0);
    commit;


    2.
    SQL> create or replace trigger trigger01
       after delete or insert or update on emp1
        for each row
        begin
        if inserting then                                 
        update dept1 set population=population+1     
         where dept1.dno=:new.dno;
        elsif deleting then
        update dept1 set population=population-1
      where dept1.dno=:old.dno;
       elsif updating then
       update dept1 set population=population+1
       where dept1.dno=:new.dno;
      update dept1 set population=population-1 
      where dept1.dno=:old.dno;
       end if;
       end;
    /



    3.

    SQL> select * from dept1;

           DNO DNAME                POPULATION
    ---------- -------------------- ----------
            11 sale                          0
            12 market                        0
            13 study                         0


    insert into emp1 values (1001,'prajna',11);
    insert into emp1 values (1002,'sommer',12);
    insert into emp1 values (1003,'huihui',13);
    commit;


    SQL>  select * from dept1;

           DNO DNAME                POPULATION
    ---------- -------------------- ----------
            11 sale                          1
            12 market                        1
            13 study                         1
    (发现里面population列的值跟着变了)



    update emp1 set dno=12 where eid=1003; 
     commit;
     
    ================================================
    公司库存表(kucun) 同类产品的总量
    分销商订货(xiaoshou) 时,kucun表数量减少
    create table kucun(cid int,shul int);
    insert into kucun values(100,9000);

    SQL> select * from kucun;

           CID       SHUL
    ---------- ----------
           100       9000


    create table xiaoshou(cid int,shuliang int);
    insert into xiaoshou values(100,1000);


    SQL> select * from xiaoshou;

           CID   SHULIANG
    ---------- ----------
           100       1000


    SQL> create or replace trigger t12
       after insert on xiaoshou
        for each row
         begin
        if inserting then 
        update kucun set shul=shul-:new.shuliang where kucun.cid=:new.cid;
       
       end if;
       end;
      /

    ((特殊变量:   :new    :old
       :new代表你所新输入的数据
       :old代表更改前的数据
      使用方式 :old.列名
      
      insert 操作只有 :new
      delete 操作只有 :old
      update 操作 :new  :old 都有))

    查看错误
    SQL> show error





  • 相关阅读:
    CPU 上下文切换是什么
    Linux性能优化实战
    JavaScript 概述
    最全前端资源汇总
    zabbix 源码安装
    单例
    php防止sql注入
    python 多进程读写文件
    python twisted异步将数据导入到数据库中
    scrapy-splash常用设置
  • 原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/0c81682fcbcf30656e66ce24af74fbbb.html
Copyright © 2011-2022 走看看