【问题标题】:Oracle 9i: Synonymed Table Does Not Exist?Oracle 9i:同义表不存在?
【发布时间】:2012-01-04 04:36:49
【问题描述】:

我创建了一个包,其中包含我计划从单独的应用程序调用的存储过程。存储过程将返回模式中所有视图和表的排序列表。为此,它对 DBA_TABLES 和 DBA_VIEWS 同义词执行简单的选择,如下所示:

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

我已验证存在问题的同义词是公开的:

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

我的理解是,由于它们是公开的,我不需要任何进一步的权限即可访问它们。如果这种理解是不正确的,我希望有人能驳斥我的想法,并指出更准确的数据。

现在我的问题是:我可以在 Oracle SQL Developer 中打开一个工作表并从这些表中进行选择。我得到有意义的数据就好了(事实上,567 行)。但是当我尝试执行存储过程时,Oracle报错编译错误,如下图:

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

当我双击第二条错误消息时,SQL Developer 会将我带到第一个 FROM 子句(“FROM DBA_TABLES”)。

所以我很困惑。我非常了解 SQL Server,而且我是 Oracle 的新手,所以请多多包涵。如果您能提供一些线索,或指出正确的方向,我将不胜感激。

提前致谢!

【问题讨论】:

    标签: oracle package synonym ora-00942


    【解决方案1】:

    使用 ALL_TABLES 和 ALL_VIEWS 而不是 DBA_TABLES 和 DBA_VIEWS。所有用户都应该可以访问 ALL_% 的视图。

    【讨论】:

      【解决方案2】:

      如果您从存储的 PL/SQL 过程或存储的 PL/SQL 函数中的表或视图中进行选择,则需要直接授权。通过数据库角色授予是不够的。

      您可能需要直接授予视图 dba_tables。 (公共)同义词只是(公共)同义词。您需要直接授予选择权限。

      请看这里:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807

      【讨论】:

        【解决方案3】:

        编辑:抱歉,我忽略了您似乎说可以直接从 DBA_TABLES 中选择的部分。最有可能的问题是您的权限是通过其他人回答的角色授予的。但仍然值得解释的是,您对 PUBLIC 同义词的理解是不完整的,使用 ALL_TABLES 会更好,如果它能够满足您的需要。

        同义词为PUBLIC仅表示所有用户都可以引用同义词;它不会授予他们任何访问同义词所指对象的权限。

        最直接解决此错误的方法是将 SYS 视图的 SELECT 权限授予将运行此过程的用户。但是,我认为这是一个非常糟糕的主意。

        按照 Raimonds 的建议,请考虑是否可以从 USER_TABLES 或 ALL_TABLES 获得所需的信息。哪个用户正在调用此过程,该用户对 SONAR5 的表有什么访问权限?

        一般来说,如果你的应用程序对一个表感兴趣,大概它对它有一些特权,在这种情况下应该在 ALL_TABLES 中列出。

        【讨论】:

        • 相信我:我不想授予不必要的权限。你的建议很好。 :) 事实证明,Raimonds 的建议效果很好,我已经开始跑步了。
        猜你喜欢
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        相关资源
        最近更新 更多