我已经创建了一个包,其中包含一个存储的过程,我计划援引从一个单独的应用程序。存储程序将会返回一个排列的所有意见和表在该架构。要做到这一点,它执行一个简单的选择上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开发和选择从这些表格就好了。我得有意义的数据只是罚款(567排,因为事实上).但是当我试图执行存储的过程,Oracle抱怨有一个编辑错误,如下所示:

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

当我双击,第二个错误信息,SQL开发者需要我的第一从句("从DBA_TABLES").

因此我相当难倒。我知道SQL Server很好,我是新来的神谕,因此请原谅我。如果你能提供一些线索,或者点我在正确的方向,我真的很欣赏它。

在此先感谢!

有帮助吗?

解决方案

使用ALL_TABLES和ALL_VIEWS代替DBA_TABLES和DBA_VIEWS。 ALL_%视图应该是所有用户访问。

其他提示

如果你选择一个表格或图在一个存储PL/SQL-程序或存储PL/SQL-你需要一个直接的授权。一个授予通过一个数据库的作用是不够的。

你可能需要一个直接授予观dba_tables.(公开)的同义词仅仅是(公共)的同义词。你需要直接授予的选择权。

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

编辑:对不起,我掩饰了,你好像说,你可以从DBA_TABLES直接选择部分。最有可能的问题是,你的权限通过角色授予别人回答。但它仍然值得说明的是,你的公共同义词的理解是不完整的,如果它实现了你所需要的使用ALL_TABLES会更好。

同义词是PUBLIC仅意味着所有用户可参考同义词;它不给予他们对对象的任何访问,所述同义词指的是

你会做什么最直接解决这个错误是在SYS意见给用户(S),将运行该程序授予SELECT权限。但是,我认为这是一个非常糟糕的主意。

正如Raimonds建议,考虑是否可以让你从USER_TABLES或ALL_TABLES,而不是所需要的。什么是用户调用此程序,并没有该用户必须SONAR5的表访问什么?

一般情况下,如果应用程序是在感兴趣的表,想必上有一些特权,在这种情况下,应在ALL_TABLES列出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top