【问题标题】:Facing an error : table or view does not exist面临错误:表或​​视图不存在
【发布时间】:2011-06-22 20:16:29
【问题描述】:


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

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


我检查了表/存储过程是否存在并且一切就绪。表名或 sp 中也没有错字。如果我从查询编辑器运行 SP 的一部分,它可以正常工作,但是当我执行整个 SP 时,它会引发错误。


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

Select a from table_name where condition;

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


谁能帮我解决这个问题。我正在使用 SQL +。
提前致谢 维杰

【问题讨论】:

  • 很多可能性:连接到错误的数据库?表格名称中的错字?你必须给我们更多才能继续前进。
  • 你能告诉我们你的过程或插入语句吗?

标签: sql oracle stored-procedures ora-00942


【解决方案1】:

嗯,简单地说,您尝试插入数据的表在您连接的数据库中不存在。您需要检查这两件事(即您连接到什么,以及那里的表格是否可供您使用的用户上下文访问)。

【讨论】:

  • 另外,检查你用来连接数据库的用户/模式是否有足够的权限来查看这个表/视图。
  • 没有“足够看的权利”。这可以通过角色来完成。正如贾斯汀所说,将角色设置为无,然后测试您是否可以访问该表。
【解决方案2】:

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

检查是否:

  1. 您正在连接到正确的 Oracle 实例。
  2. 您有权查询或处理您在查询中引用的表。
  3. 普通的选择语句和过程是有区别的。 oracle 中的程序不尊重分配给用户的角色;而是需要明确授予用户权限。欲了解更多信息,请阅读以下链接ORA-00942

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 虽然是真的,但我怀疑这个用户更改了 Authid。贾斯汀的回答更有可能是这样。通过角色授权和直接授权的混淆由于在 sql 提示符下工作但未编译的查询而更加复杂。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      每个说该表不存在的人都没有阅读您的整个帖子。因为你能够:

      如果我从查询编辑器运行 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.
      

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

      【讨论】:

      • 感谢您提供如此详细的解释。我尝试了上述步骤,但由于我在运行 Grant 命令时使用相同的用户/所有者登录,所以它给了我一个错误,提示“无法自行授予/撤销”。
      • 等等,过程和表是同一个用户拥有和运行的?这是没有意义的。与表在同一架构中的过程不需要对表的权限。你能把CREATE的过程代码贴到BEGIN吗?
      猜你喜欢
      • 2012-03-30
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多