plsql调用者权限与定义者权限

一个简单的例子:
SQL> conn / as sysdba
已连接。
SQL> create user naruto identified by naruto;

用户已创建。

SQL> grant dba to naruto;

授权成功。

SQL> conn naruto/naruto
已连接。
SQL> create or replace procedure get_row --定义者权限
  2  is
  3  x number;
  4  begin
  5   execute immediate 'select 1 from dba_users where rownum = 1';
  6  end;
  7  /

过程已创建。
编译通过了,在这里过程里用到了动态sql,在编译时并不解释动态sql。

SQL> exec get_row;
BEGIN get_row; END;

*
第 1 行出现错误:
ORA-00942: 表或视图不存在
ORA-06512: 在 "NARUTO.GET_ROW", line 5
ORA-06512: 在 line 1

错误很明显,dba_users表不存在,但是naruto用户已经有dba权限了,为什么还看不到这张表?
因为过程只在 直接授权 下运行,不是通过一个角色来授权(例如 grant select on dba_users to naruto就可以运行)。

SQL> create or replace procedure get_row
  2  authid current_user --改为调用者权限
  3  is
  4  x number;
  5  begin
  6   execute immediate 'select 1 from dba_users where rownum = 1';
  7  end;
  8  /

过程已创建。

SQL> exec get_row;

PL/SQL 过程已成功完成。


创建过程和运行过程所有角色都是禁用的


SQL> create or replace procedure haha

  2  authid current_user

  3  is

  4  begin

  5

  6  for i in (select * from session_roles) loop

  7     dbms_output.put_line(i.role);

  8  end loop;

  9  end;

 10  /


过程已创建。


SQL> exec haha;


PL/SQL 过程已成功完成。


SQL> set serveroutput on

SQL> exec haha;

DBA

SELECT_CATALOG_ROLE

HS_ADMIN_ROLE

EXECUTE_CATALOG_ROLE

DELETE_CATALOG_ROLE

EXP_FULL_DATABASE

IMP_FULL_DATABASE

GATHER_SYSTEM_STATISTICS

SCHEDULER_ADMIN

WM_ADMIN_ROLE

JAVA_ADMIN

JAVA_DEPLOY

XDBADMIN

XDBWEBSERVICES

OLAP_DBA

AQ_ADMINISTRATOR_ROLE

MGMT_USER


PL/SQL 过程已成功完成。


SQL> create or replace procedure haha

  2  is

  3  begin

  4

  5  for i in (select * from session_roles) loop

  6     dbms_output.put_line(i.role);

  7  end loop;

  8  end;

  9  /


过程已创建。


SQL> exec haha;


PL/SQL 过程已成功完成。

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

转载于:http://blog.itpub.net/25361369/viewspace-705235/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值