【问题标题】:Oracle PLS-00201 error in procedure across users跨用户过程中的 Oracle PLS-00201 错误
【发布时间】:2014-06-20 10:15:31
【问题描述】:

我有一个内部应用程序和我们的网站共享的 Oracle 数据库。

我对 oracle 知之甚少,所以我会解释一下我是如何理解它的。

数据库有两个用户APPUSER和WEBUSER,当以APPUSER身份登录(使用Oracle SQL Developer)时,您可以看到数据库中的所有表。当以 WEBUSER 身份登录时,您只能看到几个程序,而 APPUSER 看不到这些程序。

一个过程开始于:

create or replace PROCEDURE "UPDATE_DETAIL" 
(v_ref IN APPUSER.DETAILS.REFERENCE%TYPE
,v_desc IN APPUSER.DETAILS.DESCRIPTION%TYPE
...

第 2 行有一个红色波浪线,带有“PLS-00201:未声明标识符 APPUSER”

我相信它有“APPUSER.TABLE.COLUMN”,因为 WEBUSER 没有直接访问表的权限。

我已经以 WEBUSER 身份执行了GRANT ALL ON UPDATE_DETAIL TO APPUSERlogged in,但这并没有解决问题,WEBUSER 是该程序的所有者,但在授权列表中没有列出任何内容(我假设是因为所有者只是拥有以下权限)默认?)

该过程的依赖项列表也是空的,但找不到如何手动添加一个。

不确定还有什么方法可以解决此错误。

谢谢。

【问题讨论】:

    标签: oracle stored-procedures


    【解决方案1】:

    如果您想要一个由WEBUSER 拥有的过程(并且我相信从您的描述UPDATE_DETAILWEBUSER 拥有)来引用APPUSER 拥有的对象,您需要授予WEBUSER 权限那些物体。比如APPUSER

    GRANT SELECT ON appuser.details
       TO webuser;
    

    这假设WEBUSER 只需要SELECT 来自APPUSER.DETAILS 表。如果您的过程需要INSERTUPDATEDELETE 该表中的数据,则需要授予WEBUSERAPPUSER.DETAILS 表的额外权限。您需要对APPUSERWEBUSER 用户需要引用的每个表进行类似的授权。

    【讨论】:

    • 嗨 Justin,是的,该过程的所有者是 WEBUSER,该过程执行 SELECTINSERTUPDATE 命令。我执行了GRANT ALL ON APPUSER.DETAILS TO WEBUSER 然后提交,但它仍然有相同的 appuser 必须声明消息..
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2013-01-07
    • 2017-10-31
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多