zoukankan      html  css  js  c++  java
  • 存储过程执行权限

    最后更新时间: 2014年4月13日,星期日


    存储过程分为两种,即DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。为什么会有两种存储过程呢?比如说用户user02创建了修改表t1的存储过程,当用户user01调用时,是修改的user01自己的t1表还是user02的t1表?  

    示例:
    用户user02将存过赋执行权限给user01:
    grant execute on user02.prc1 to user01;
    grant execute on user02.prc2 to user01;
    grant execute on user02.prc3 to user01;


    用户user01执行user02下的存过 prc1,prc2,prc3;
    用户user01只有执行user02下存过的权限,没有查询/修改user02.t1的任何权限;
    --默认是 authid DEFINER
    create or replace procedure prc1 is
    v_sql varchar2(200);
    begin 
    begin 
        v_sql :='drop table t1 purge';
        EXECUTE IMMEDIATE v_sql;
        v_sql:='create table t1(id int)';
        EXECUTE IMMEDIATE v_sql;
    exception when others then
        dbms_output.put_line('表不存在!');
        v_sql:='create table t1(id int)';
        EXECUTE IMMEDIATE v_sql;
    end;
    for i in 1 .. 10
    loop
    insert into t1 values(0);
    end loop;
    commit;
    end;
    /
    -- DEFINER 表示使用的是定义者的权限,即user02的权限,修改的是 user02.t1表,尽管user01没有直接修改user02.t1表的任何权限
    create or replace procedure prc2 authid DEFINER is
    v_sql varchar2(200);
    begin 
      begin 
        v_sql :='drop table t1 purge';
        EXECUTE IMMEDIATE v_sql;
        v_sql:='create table t1(id int)';
        EXECUTE IMMEDIATE v_sql;
        exception when others then
        dbms_output.put_line('表不存在!');
        v_sql:='create table t1(id int)';
        EXECUTE IMMEDIATE v_sql;
      end;
      for i in 1 .. 10
      loop
        insert into t1 values(2);
      end loop;
      commit;
    end;
    /

    -- current_user 表示调用者权限,修改的是user01.t1表
    create or replace procedure prc3 authid current_user is
    v_sql varchar2(200);
    begin 
      begin 
        v_sql :='drop table t1 purge';
        EXECUTE IMMEDIATE v_sql;
        v_sql:='create table t1(id int)';
        EXECUTE IMMEDIATE v_sql;
        exception when others then
        dbms_output.put_line('表不存在!');
        v_sql:='create table t1(id int)';
        EXECUTE IMMEDIATE v_sql;
      end;
      for i in 1 .. 10
      loop
        insert into t1 values(3);
        
      end loop;
      commit;
    end;
    /


    参考: 



    1. 匿名块(DECLARE BEGIN END;)总是IR Procedure,触发器和视图总是DR Procedure。我们可以通过视图*_PROCEDURES来查看存储过程的AUTHID属性值。
    2. 存储过程、包、都适用。




  • 相关阅读:
    [Java]关于throw,throws,try{}catch(){} 悟寰轩
    jmx使用jmxmp协议连接器的实现 悟寰轩
    ActionContextCleanUp作用 悟寰轩
    空心验证码(定制) 悟寰轩
    struts升级:FileUploadInterceptor在struts 2.3.14.2的jar中修改了方法acceptFile中的参数 悟寰轩
    网络里的“逆世界” 悟寰轩
    离开时自动提示设为首页
    文本与图像上传到数据库
    在Delphi用vbscript的正则表达式
    ASP中输入特殊字符
  • 原文地址:https://www.cnblogs.com/bowshy/p/3661867.html
Copyright © 2011-2022 走看看