尝试访问另一个模式表时获取PLS-00201

时间:2018-02-21 13:25:47

标签: oracle plsql grant

我想清理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和SYNONYM到XYZ_TABLE具有SIUD角色,但在进行研究时我发现存储过程不能使用角色授权。但我没有找到任何方法让PROCEDURE上的授权编译没有错误,并保证SCHEMA_APP也可以调用该程序。对此有何帮助?谢谢!

编辑:4年前,我发现了this similar question,但没有得出确凿的答案:/

1 个答案:

答案 0 :(得分:2)

此错误的核对清单应如下所示:

  1. XYZ_TABLE是否存在? (你拼错了吗?它实际上是用双引号命名为"xyz_table"还是"XYZ Table"?)
  2. 是否在预期的架构SCHEMA_ADM
  3. SELECT等权限是否直接授予包所有者SCHEMA_DAT
  4. 是否有预期名称的私人或公共同义词? (例如,表X可能有同义词Y,但代码引用Y。)
  5. 或者,是代码前缀为模式名称的代码,例如SCHEMA_DAT.XYZ_TABLE
  6. 是否有与模式(SCHEMA_DAT)同名的包或类型?这可能会在编译器找到包而不是模式时创建命名冲突,然后在其中查找名为XYZ_TABLE的内容。
  7. 您的要求可能会有所不同,但创建同义词通常比对模式名称进行硬编码更好(对于类型更少,如果事情发生变化则更灵活),并且私有同义词优于公共同义词(安全性,如他们不会广播您的架构结构,如果您想将不同的用户定向到不同的对象,或者稍后根据不同的要求添加另一个架构,则会更灵活。)