use*_*925 8 oracle stored-procedures
这个场景就像这样......
我有一个命名空间XXX,我创建了一些表和一些存储过程...
他们有一个名称空间YYY,他们创建了一些表...
他们XXX授予了对表的访问权限,所以当我使用XXX连接与SQL Developer 相连时,我可以这样做:
SELECT * FROM YYY.TableA
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试从存储过程(简单存储过程或包)内部运行相同的语句,则存储过程不会编译.它发生在很多sp上.还有其他许可我要问??? 我正在运行这样的sp:
CREATE OR REPLACE PROCEDURE PRC_SOMESP(
) AS BEGIN
END PRC_SOMESP;
Run Code Online (Sandbox Code Playgroud)
不访问YYY表的过程编译得很好.
提前致谢.
在Justin Cave响应之后,我正在尝试将"AUTHID CURRENT_USER"句子添加到sp中,但得到相同的"表或视图不存在"结果:
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
Run Code Online (Sandbox Code Playgroud)
我应该检查一下吗???
Jus*_*ave 12
最有可能的问题是,拨款是通过角色完成的.授予用户的权限在定义者权限存储过程中不可用(默认值).
在SQL Developer中,验证这是问题相对容易.如果您运行该命令
SET ROLE none
Run Code Online (Sandbox Code Playgroud)
然后运行SELECT语句,我希望你会得到相同的ORA-00942错误.
假设是这种情况,解决方案通常是要求YYY模式中的表的所有者直接向您授予对表的访问权限,而不是通过角色授予访问权限.除此之外,您可以通过向声明添加AUTHID CURRENT_USER来将存储过程定义为调用者的权限存储过程.这将导致过程的调用者需要访问底层对象,但它允许您的过程使用通过角色授予的特权.
如果要创建调用者权限存储过程,还需要使用动态SQL引用表名,以便将权限检查推迟到运行时.所以你会有类似的东西
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;
Run Code Online (Sandbox Code Playgroud)
如果你想要一个查询模式XXX中的TableA表的调用者权限存储过程.
在架构上的存储过程中,XXX如果您从架构访问表YYY,请确保完全限定它们:
select count(1) from YYY.TableA;
Run Code Online (Sandbox Code Playgroud)
另一件需要考虑的事情是大小写(如果您在 Oracle 标识符中混合使用大小写)。
最后一件事:发布您遇到的错误。这样会更容易帮助您。
| 归档时间: |
|
| 查看次数: |
26436 次 |
| 最近记录: |