【问题标题】:Getting PLS-00201 when trying to access another schema table尝试访问另一个模式表时获取 PLS-00201
【发布时间】:2018-02-21 13:25:47
【问题描述】:

我想清理 SCHEMA_ADM 和 SCHEMA_DAT 表上的一些数据,但是,我的过程需要存储在 SCHEMA_DAT 上,并且将由 SCHEMA_APP 调用。我做了这样的程序:

create or replace PACKAGE BODY "PKG_CLEANING_THE_MESS"
AS
PROCEDURE PRC_DELETE_DATA (some variables...)
AS
    TYPE fooTableType
    IS TABLE OF FOO_TABLE.ID%TYPE; --TABLE ON SCHEMA_DAT. Works fine!
    fooTable fooTableType;

    TYPE xyzTableType
    IS TABLE OF XYZ_TABLE.ID%TYPE; --TABLE ON SCHEMA_ADM. The problem is here!!!
    xyzTable xyzTableType;
    ...
END PRC_DELETE_DATA;
...
END PKG_CLEANING_THE_MESS;

当我尝试编译时,给我

PLS-00201:必须声明标识符“XYZ_TABLE”。

我尝试了“SCHEMA_ADM”。“XYZ_TABLE”而不是“XYZ_TABLE”,但也没有用。 SCHEMA_DAT 对 SCHEMA_ADM 具有 SIUD 角色,对 XYZ_TABLE 具有 SYNONYM 角色,但在进行研究时我发现存储过程不能使用角色授予。但是我没有找到任何方法来授予 PROCEDURE 上的授权以无错误地编译并保证 SCHEMA_APP 也可以调用该过程。有什么帮助吗?谢谢!

编辑:我找到了 this similar question,4 年前问过,但没有确定的答案:/

【问题讨论】:

  • 将权限直接授予过程所有者。使用私有同义词避免硬编码模式名称。
  • 即使直接授予 SCHEMA_DAT,仍然会出现同样的错误。
  • 我的错,我错误地直接授予 SCHEMA_DAT。当我做正确的事情时,它就会起作用!

标签: oracle plsql sql-grant


【解决方案1】:

这个错误的清单应该是这样的:

  1. XYZ_TABLE 存在吗? (你拼写对了吗?它实际上是在双引号中命名为"xyz_table""XYZ Table" 之类的吗?)
  2. 是否在预期的架构中,SCHEMA_ADM
  3. SELECT 等权限是否直接授予包所有者SCHEMA_DAT
  4. 是否有与预期名称对应的私有或公共同义词? (例如,表Y 可能有同义词X,但代码指的是Y。)
  5. 或者,代码是否以模式名称为前缀,例如SCHEMA_DAT.XYZ_TABLE?
  6. 是否存在与架构 (SCHEMA_DAT) 同名的包或类型?这可能会产生命名冲突,编译器会找到包而不是架构,然后在其中查找名为 XYZ_TABLE 的内容。

您的要求可能会有所不同,但创建同义词通常比硬编码架构名称更好(键入更少,如果事情发生变化则更灵活),并且私有同义词比公共同义词更可取(安全性,因为它们不广播您的架构结构,如果您想将不同的用户引导到不同的对象,或者稍后添加具有不同要求的另一个架构,则更加灵活。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多