【转】关于Oracle存储过程执行权限问题的解决


原文地址:http://blog.itpub.net/4227/viewspace-69049/

今天晚上升级,有个存储过程死活编译不过去,提示权限不足,但是用户是具有dba权限的,网上一查才知道,oracle存储过程分两种,DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。

    1、定义者权限:定义者权限PL/SQL程序单元是以这个程序单元拥有者的特权来执行它的,也就是说,任何具有这个PL/SQL程序单元执行权的用户都可以访问程序中的对象。所有具有执行权的用户都有相同的访问权限,在定义者权限下,执行的用户操作的schema为定义者,所操作的对象是定义者在编译时指定的对象。在定义者(definer)权限下,当前用户的权限为角色无效情况下所拥有的权限。
    2、调用者权限:调用者权限是指当前用户(而不是程序的创建者)执行PL/SQL程序体的权限。这意味着不同的用户对于某个对象具有的权限很可能是不同的,这个思想的提出,解决了不同用户更新不同表的方法。在调用者权限下,执行的用户操作的schema为当前用户,所操作的对象是当前模式下的对象。在调用者(invoker)权限下,当前用户的权限为当前所拥有的权限(含角色)。
    3、ORACLE默认为定义者权限,定义者权限在存储过程中ROLE无效,需要显示授权,例如在存储过程中调用其他用户的表,但是定义存储过程的当前用户没有显示访问该表的权限,即使当前用户具有dba角色,编译过程中也会出现权限不足的问题,因为role无效。
    定义存储过程时,通过指定AUTHID 属性,定义DR Procedure 和IR Procedure
DR Procedure 
1、定 义
    CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID DEFINER as
      ...
    BEGIN
      ...
    END DEMO;
IR Procedure
1、定 义
    CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as
     ...
    BEGIN
     ...
    END DEMO;


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM