zoukankan      html  css  js  c++  java
  • plsql 触发器介绍 语句级别触发器、行级别触发器。

    /*
    分类:
        1、DDL触发器
          执行create,alter,drop操作时,会激活的触发器
        2、DML触发器
          执行增、删除、修改时,激活的触发器
        3、系统事件触发器
          执行特定的系统事件时(启动、加载、登录、退出)
    构成:
        1、触发事件:会引起触发器执行的操作;DDL操作,DML操作,系统事件;
        2、触发时间:before ,after, instead of:替代
        3、触发条件:where 条件
        4、触发对象:表、视图、数据库对象
        5、触发频率:语句级别(表级别):执行一次,行级别:for each row :满足条件的每一行操作都会激活触发器;
        6、触发操作:触发器中执行的操作;
    
    */
    -- 1、语句级别的触发器。(执行一次)     
    --  before触发器  和   after触发器   刚执行语句 触发器跟着执行(1.判断语句是否执行 2.不给语句执行的机会) 和  语句可以先执行后设置的事件    
    -- 理解:当用户执行某个操作时,会执行我所写的触发器
    
                                                    -- oracle中创建一个触发器   create or replace    关键字trigger + 触发器的名字。 
    create or replace trigger  insertInterceptor
     after delete on emp                            -- 定义触发器的时间种类。   xx xx on xx 表名。
    declare
        v_money emp.sal%type;
        row1 emp%rowtype;
        cursor c(no emp.deptno%type) is select * from emp where deptno=no;   
    begin                                           
      insert into emp (empno,ename,job,sal) values(20,'学习','张三',2000);
      
      open c(20);
      loop
      fetch c into row1;
      exit when c%notfound;
      dbms_output.put_line(
        'cursor index=='||c%rowcount||
        '姓名=='||row1.ename||
        '--------工资=='||row1.sal||
        '--------工作=='||row1.job
      );
      
      end loop;
      close c;
    end;
    
                                                      -- 测试效果:删除20后新填入一个20在emp表中  并输出emp表中对应部门的 相关的  数据 
    delete from emp where empno=20;
    
    
    --练习   禁止用户在emp中的删除数据  tg01 
    alter trigger tg01 enable;
    alter trigger tg01 disable;
    delete from emp where empno=2;
    
    -- 禁止用户在emp中  update数据   
    create or replace trigger updateMessage
      before update on emp
    declare
      
    begin
      raise_application_error(-20010,'禁止用户在emp中  update数据');     --注意oracle错误码   20000--20999;
    end;
    
    --测试
    update emp set ename='哈哈' where empno=7788;
    alter trigger updateMessage disable;
    
    
    -- 2、行级别触发器  for each row :满足条件的每一行操作都会激活触发器;
    create or replace trigger rowMessage
      before update or insert on emp for each row      
    declare
      
    begin         -- 如果条件执行  就给出相应的提示
      if updating then 
        dbms_output.put_line('执行了更新的操作');
      if:old.sal>:new.sal then                            -- 逻辑表
        raise_application_error(-20002,'禁止给员工降工资!');
        end if;
      elsif inserting then
        dbms_output.put_line('执行了录入的操作');
      end if;
    end;
    
    --关闭触发器
    alter trigger updateMessage disable;
    alter trigger insertInterceptor disable;
    
    update emp set sal=sal+1 where deptno=20;
    commit; 
    
    insert into emp (empno,ename,sal)values(5,'嘻嘻',500);
    
    
    select * from emp;
    select sal from emp where deptno=20;
    
    -- 删除触发器
    drop trigger tg02;

         

  • 相关阅读:
    小技巧与阅读感悟
    Android常见漏洞介绍(1):Intent Scheme URL 攻击
    利用Mallet工具自动挖掘文本Topic
    Xie Tao的几个小建议PPT:关于读Paper,如何与他人交流,赶Deadline
    Python解析DNS数据包
    iOS 横竖屏适配 笔记
    多工程联编,cocopods的使用
    Call to unavailable function 'system': not available on iOS
    xxx referenced from: xxx in xxx.o
    YYModel学习总结YYClassInfo(1)
  • 原文地址:https://www.cnblogs.com/ZXF6/p/11240300.html
Copyright © 2011-2022 走看看