Oracle-PROCEDURE权限解读

举报
小工匠 发表于 2021/09/11 01:14:38 2021/09/11
【摘要】 问题 存过中有查询dba_相关的数据字典视图,编译时却提示 ‘表或视图不存在’,编译不通过。 但是报错的语句在SQL中确实可以查到的,说明问题并不是提出给出的’表或视图不存在’导致的。 这里需要...

问题

这里写图片描述

存过中有查询dba_相关的数据字典视图,编译时却提示 ‘表或视图不存在’,编译不通过。

但是报错的语句在SQL中确实可以查到的,说明问题并不是提出给出的’表或视图不存在’导致的。

这里需要注意SQL权限和存过的权限是不同的。

我们查询的是sys用户下的数据字典,需要显示授权
虽然cc用户也是DBA用户。

 select * from dba_role_privs where grantee='CC';
  
 
  • 1

这里写图片描述


解决办法

oracle存储过程默认定义者权限,但ROLE对存储过程不可见。
因此需要给cc用户显示赋权。 使用authid current_user也不行。

使用sys用户

grant select any dictionary to cc;
  
 
  • 1

这里写图片描述

重新编译,通过

这里写图片描述


知识引申

oracle存储过程分两种,DR(Definer’s Rights ) Procedure和IR(Invoker’s Rights ) Procedure。

在执行存储过程时,我们可能会遇到权限问题

  • AUTHID DEFINER (定义者权限):指编译存储对象的所有者。也是默认权限模式。
  • AUTHID CURRENT_USER(调用者权限):指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter session set current_schema 可以改变调用者Schema)

在数据库中创建存储过程时,定义者权限是缺省模式。

当指定AUTHID CURRENT_USER关键字后,便是调用者权限存储过程.

它们之间最根本的差异在于role能否在存储过程中生效


定义者权限存储过程问题

定义者权限存储过程role无效,必须要有显式授权。即便是拥有dba role,还是不能访问不同用户的表。

有时候可能需要进行非常多的授权才能执行存储过程,稍显麻烦。

oracle给我们提供了在存储过程中使用role权限的方法:
修改存储过程,加入Authid Current_User时存储过程可以使用role权限(调用者权限)。

栗子

这里写图片描述

编译通过

这里写图片描述

执行失败。

方法一:使用sys用户赋权限

SQL> conn  sys/****** as sysdba;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 
Connected as sys@cc AS SYSDBA

SQL> grant create table to cc;

Grant succeeded

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

重新执行

SQL> exec p_test_proc_priv;

PL/SQL procedure successfully completed

  
 
  • 1
  • 2
  • 3
  • 4

方法二 :修改存储过程,加入Authid Current_User时存储过程可以使用role权限。

现在先回收掉权限,改用另外的方式

SQL> conn  sys/****** as sysdba;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 
Connected as sys@cc AS SYSDBA
SQL> revoke create table from cc;

Revoke succeeded
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

重新执行后:

SQL> exec p_test_proc_priv;

begin p_test_proc_priv; end;

ORA-01031: insufficient privileges
ORA-06512: at "CC.P_TEST_PROC_PRIV", line 4
ORA-06512: at line 2
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

直白的说,就是让这个存过拥有当前用户的权限,如果这个用户可以create table,那么这个存过通过authid current_user,也获得该用户的权限。


修改存过
这里写图片描述

记得先把已经 exec 执行存过创建的表 drop掉,否则报错。

这里写图片描述


ORACLE权限相关

查看一个用户的所有系统权限(包含角色的系统权限)

select privilege from dba_sys_privs where grantee='DATAUSER'  
union  
select privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='DATAUSER' );   
  
 
  • 1
  • 2
  • 3

查看Oracle提供的系统权限

select name from sys.system_privilege_map a order by a.name ;
  
 
  • 1

oracle 11g中 209条数据

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/53292397

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200