首页 文章

Oracle 9i:Synonymed表不存在?

提问于
浏览
2

我创建了一个包,其中包含我计划从单独的应用程序调用的存储过程 . 存储过程将返回架构中所有视图和表的排序列表 . 为此,它对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的新手,所以请耐心等待 . 如果你能提供一些线索,或指出我正确的方向,我真的很感激 .

提前致谢!

3 回答

  • 7

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

  • 4

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

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

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

  • 2

    Edit: 抱歉,我掩饰了您似乎可以直接从DBA_TABLES中选择的部分 . 最有可能的问题是,您的权限是通过其他人回答的角色授予的 . 但是仍然有必要解释一下,你对PUBLIC同义词的理解是不完整的,如果它能够完成你需要的东西,使用ALL_TABLES会更好 .

    同义词是PUBLIC只意味着所有用户都可以引用同义词;它不授予他们对同义词所引用的对象的任何访问权限 .

    您最常直接解决此错误的方法是将SYS视图的SELECT权限授予将运行此过程的用户 . 但是,我认为那是 very bad idea.

    正如Raimonds所建议的那样,考虑一下您是否可以从USER_TABLES或ALL_TABLES获得所需的内容 . 用户调用此过程的内容,以及该用户对SONAR5表的访问权限是什么?

    通常,如果您的应用程序对表感兴趣,可能它有一些特权,在这种情况下应该列在ALL_TABLES中 .

相关问题