从存储过程内部oracle“表或视图不存在”

这个场景是这样的……

我有一个命名空间XXX,我创建了一些表和一些存储过程…@H_502_2@

他们有一个名称空间YYY他们创建了一些表…@H_502_2@

他们授权XXX访问他们的表,所以当我使用XXX连接与sql Developer连接时,我可以这样做:@H_502_2@

SELECT * FROM YYY.TableA

但是,如果我尝试从存储过程(简单存储过程或包)内部运行相同的语句,则存储过程不会编译.它发生在很多sp上.我还有其他许可吗?我正在运行这样的sp:@H_502_2@

CREATE OR REPLACE PROCEDURE PRC_SOMESP(
) AS BEGIN
END PRC_SOMESP;

不访问YYY表的过程编译得很好.@H_502_2@

提前致谢.@H_502_2@

在Justin Cave响应之后,我正在尝试将“AUTHID CURRENT_USER”句子添加到sp中,但得到相同的“表或视图不存在”结果:@H_502_2@

CREATE OR REPLACE PROCEDURE PRC_PROC1( PARAMETERS... )  
AUTHID CURRENT_USER  
AS  
    MYVAR NUMBER;  
BEGIN  
    STATEMENTS...
END PRC_PROC1;  

CREATE OR REPLACE PACKAGE PKG_PROC2  
AUTHID CURRENT_USER  
AS  
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE PRC_PROC2( PARAMETERS... )  
END PKG_PROC2

我应该检查其他什么???@H_502_2@

最有可能的问题是,拨款是通过角色完成的.授予用户的权限在定义者权限存储过程中不可用(默认值).

sql Developer中,验证这是问题相对容易.如果您运行该命令@H_502_2@

SET ROLE none

然后运行SELECT语句,我希望你会得到相同的ORA-00942错误.@H_502_2@

假设是这种情况,解决方案通常是要求YYY模式中的表的所有者直接向您授予对表的访问权限,而不是通过角色授予访问权限.除此之外,您可以通过在声明中添加AUTHID CURRENT_USER来将存储过程定义为调用者的权限存储过程.这将导致过程的调用者需要访问底层对象,但它允许您的过程使用通过角色授予的特权.@H_502_2@

如果要创建调用者权限存储过程,还需要使用动态sql引用表名,以便将权限检查推迟到运行时.所以你会有类似的东西@H_502_2@

CREATE OR REPLACE PROCEDURE PRC_SOMESP 
  AUTHID CURRENT_USER
AS 
  l_cnt pls_integer;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;

如果你想要一个查询模式XXX中的TableA表的调用者权限存储过程.@H_502_2@

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...