面对错误:表或​​视图不存在

时间:2011-02-07 15:59:42

标签: sql oracle stored-procedures ora-00942


我正在使用insert语句并尝试将数据插入数据库表。我正在使用存储过程。
但是这样做我得到了这个错误。

  

消息:ORA-00942:表或视图   不存在ORA-06512


我检查了表/存储过程是否存在,一切都到位。表名或sp中也没有拼写错误。如果我从查询编辑器运行SP的一部分它工作正常,但是当我执行整个SP时它会抛出错误。


我尝试了Stephen提供的步骤,但是因为我在运行Grant命令时使用相同的用户/所有者登录,所以它给出了一个错误,说“不能自行授予/撤销”。
还有一个补充。我有一个存储过程SP1,其中我使用select语句作为

Select a from table_name where condition;

当我单独执行此操作时,它会返回一些结果。但是当我执行sp时,它会在写入它的同一行发出错误。


任何人都可以帮我解决这个问题。我正在使用SQL +。
提前致谢 维杰

5 个答案:

答案 0 :(得分:11)

贾斯汀的回答是正确的,但让我稍微扩展一下。

每个说该表不存在的人都没有阅读你的全部帖子。既然你能够:

  

如果我从查询编辑器运行SP的一部分,它可以正常工作

显然桌子就在那里。 显然你有一些访问权限。否则,这显然无效。

  

但是当我执行整个SP时,它会抛出一个错误。

这是因为Oracle区分了直接授予的权限和通过角色授予的权限。

说我这样做:

Create Table TABLE_A
Create Role READ_ONLY
Grant Select on TABLE_A to READ_ONLY
Grant READ_ONLY to VIJAY

在SQL窗口/提示符下,您可以毫无问题地查询该表。所以现在你需要创建一个视图

Create VIJAY.VIEW_A as SELECT * FROM TABLE_A

您将收到TABLE_A确实存在的错误。因为视图是编译的,就像它运行的过程没有任何角色一样。由于它在没有READ_ONLY角色的情况下运行,因此对TABLE_A存在这一事实视而不见。现在我需要做的是

Grant Select on TABLE_A to VIJAY.

既然您拥有直接权限,则可以编译使用该表的视图或过程/包。

答案 1 :(得分:8)

表是否存在于存储过程存在的模式中?如果没有,最简单的解释是,您的过程的所有者已被授予通过角色而不是通过直接授权访问该表的权限。定义者权限存储过程需要直接访问它访问的对象。一种快速测试方法是禁用会话角色,即

SQL> set role none;
SQL> <<execute your query>>

如果产生错误,则问题是缺少直接授权。

答案 2 :(得分:3)

在Oracle中,您可以选择是否使用调用者或定义者的权限执行存储过程:http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/subprograms.htm#i18574

检查存储过程的AUTHID属性是否正确以及生成的用户是否具有适当的权限。

答案 3 :(得分:1)

嗯,简单地说,您尝试插入数据的表在您连接的数据库中不存在。您需要检查这些内容(即您连接到哪些内容,并且是那里的表,并且可以访问您正在使用的用户上下文)。

答案 4 :(得分:1)

正如Joe Stefanelli所说......这里显示的错误有很多可能性。

检查是否:

  1. 您正在连接到正确的Oracle实例。
  2. 您有权在查询中引用的表上查询或执行处理。
  3. 普通的select语句和过程之间存在差异。 oracle中的过程不尊重分配给用户的角色;而是需要将权限明确授予用户。有关更多信息,请阅读以下链接ORA-00942