最新消息:

oracle存储过程访问其它用户表权限不足

SQL 观测者 1938浏览

一个oracle的存储过程中存在一条访问其它用户表的select语句,总是提示没有访问权限,在plsql以及测试下都能执行,但是封装成存储过程总提示没有访问权限。

解决如下:

1.切换到创建表的其它用户下,执行:GRANT SELECT ANY TABLE TO USER_A WITH ADMIN OPTION;

user_a是创建存储过程的那个用户,然后重新切换到当前用户,执行通过。

2.第一种方式并不是最佳的方式,通过查资料。知道使用存储过程分两种权限:

以研究一下steven的plsql程序设计,里面专门有一节讨论这个问题。

先收回上面分配的权限: revoke select ANY TABLE from spmc;

分配单个表的权限 GRANT select ON t_pub_instinfo TO spmc WITH GRANT OPTION;

使用存储过程的时候分成两种权限:

1.定义者权限

2.调用者权限

默认的情况下使用的是定义者权限。

定义者权限要求所有权限是直接授权的,通过角色授权的无效。就好像完全定在了你调用的那个用户下了,你用角色授予的权限完全失效。

而调用者权限就是为了解决定义者权限的一些局限设计的,它访问的是用户所具有的权限包括角色授权的权限。
这种通过调用者权限和动态sql解决。

Oracle规定,在默认的情况下,在调用存储过程用户的角色不起作用,即在执行存储过程时只有Public权限。所以在调用Create table时,会有权限不足的提示。

存储过程分为两种,即DR(Definer’s Rights ) Procedure和IR(Invoker’s Rights ) Procedure。比如说用户sh创建了删除表mytable的存储过程drop_table(),当用户sh调用时,删除用户sh下的表 mytable;如果是另一个用户scott调用呢?是删除用户scott下的mytable表呢,还是删除用户sh的mytable呢?另外,如果存储 过程中包含建表语句,不管是用户sh还是用户scott调用都会失败,因为Public没有建表权限,除非为Public grant建表权限。所以,存储过程的调用者会面临两个问题:

存储过程的名称解析环境

存储过程的执行权限

这两个问题可以在定义存储过程时,通过指定AUTHID 属性,即定义DR Procedure 和IR Procedure来解决。

DR Procedure

1、定义

CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID DEFINER as

BEGIN

END DEMO;

2、名称解析环境为定义该存储过程的用户所在的Schema。

3、执行该存储过程时只有Public权限。

IR Procedure

1、定 义

CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as

BEGIN

END DEMO;

2、名称解析环境为调用该存储过程的用户所在的Schema。

3、执行该存储过程时拥有调用者的所有权限,即调用者的Role是有效的。

因此楼主的问题只需要使用IR Procedure就能解决

create procedure xxx AUTHID CURRENT_USER
as
begin
INSERT INTO TABLE1 SELECT * FROM USER_B.TABLE1;
EXECUTE IMMEDIATE ’ INSERT INTO TABLE1 SELECT * FROM USER_B.TABLE1′;
end;

可以通过 SELECT * FROM SYS.USER_TAB_PRIVS;

查询出当前用户“额外”赋予的权限;

转载请注明:观测者 » oracle存储过程访问其它用户表权限不足