对定义者权限和调用者权限的理解

对于PL/SQL存储过程的调用来说,具有两种权限控制方式:定义者权限和调用者权限。定义者权限表示用户在执行PL/SQL代码的时候,是否有权访问代码中所涉及的对象如表等,是根据创建该PL/SQL的用户是否拥有对其访问权来决定的,而调用者权限则是根据执行该PL/SQL的用户是否具有对其中涉及的对象的访问权来决定是否可访问的。缺省情况下,PL/SQL存储过程都是以定义者权限来执行的。以下例子说明了其含义。

创建一个用户u1,该用户试图去访问hr用户的表employees,但因为没有权限而失败
conn / as sysdba
create user u1 identified by u1;
grant connect, resource to u1;
conn u1/u1
select last_name from hr.employees where employee_id=101;

ERROR at line 1:
ORA-00942: table or view does not exist

现在hr用户创建一个存储过程,并在其中实现对表employees的访问
conn hr/hr
create or replace procedure p_get_lastname1(v_employee_id in employees.employee_id%type,
                                            v_last_name   out employees.last_name%type) is
begin
    select last_name
      into v_last_name
      from employees
     where employee_id = v_employee_id;
end;
/

现在把执行该存储过程的权限赋给u1用户,u1用户便可以通过该存储过程间接实现对表employees的访问
grant execute on p_get_lastname1 to u1;
conn u1/u1
var ls_lastname varchar2(50);
exec hr.p_get_lastname1(101,:ls_lastname);

PL/SQL procedure successfully completed.

print ls_lastname;

LS_LASTNAME
------------------------
Kochhar

这里之所以能访问就是利用了PL/SQL默认的定义者权限机制,因为该存储过程是由hr用户自己定义的,hr用户自然可以访问自己的表。因此借用定义者权限,u1用户虽然本身没有对表employees的访问权,但借助存储过程同样实现了对该表的访问。

再看调用者权限的使用,现在创建另一个用户u2,以u2来执行hr用户创建的另一个存储过程
conn / as sysdba
create user u2 identified by u2;
grant connect,resource to u2;
conn hr/hr
create or replace procedure p_get_lastname2(v_employee_id in employees.employee_id%type,
                                            v_last_name   out employees.last_name%type)
    authid current_user is
begin
    select last_name
      into v_last_name
      from employees
     where employee_id = v_employee_id;
end;
/
grant execute on p_get_lastname2 to u2;
conn u2/u2
var ls_lastname varchar2(50);
exec hr.p_get_lastname2(101,:ls_lastname);

ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "HR.P_GET_LASTNAME2", line 5
ORA-06512: at line 1

这里之所以执行失败是因为存储过程在定义时被指定为调用者权限(通过authid current_user指定),而调用者u2没有访问employees表的权限,因此执行没有成功。

对于定义者权限的PL/SQL程序来说,通过角色传入的权限是不能作用于存储过程里面的。以下例子说明了这点
conn / as sysdba
create user u3 identified by u3;
grant dba to u3;
conn u3/u3
create or replace procedure p_test is
begin
    dbms_utility.exec_ddl_statement('grant dba to u1');
end;
/
exec p_test;

ERROR at line 1:
ORA-01932: ADMIN option not granted for role 'DBA'
ORA-06512: at "SYS.DBMS_UTILITY", line 574
ORA-06512: at "U3.P_TEST", line 3
ORA-06512: at line 1

虽然u3用户被授予了DBA权限,但是默认指定的定义者权限创建的存储过程是不能获得DBA这个角色所传递过来的权限的,因此执行仍然没有足够的权限,DBMS_UTILITY包无法访问。此时可将该存储过程改为调用者权限,这样u3用户就能够正常执行了。
create or replace procedure p_test authid current_user is
begin
    dbms_utility.exec_ddl_statement('grant dba to u1');
end;
/
exec p_test;

PL/SQL procedure successfully completed.


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28974745/viewspace-2144738/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28974745/viewspace-2144738/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值