当前位置:  开发笔记 > 数据库 > 正文

为什么Oracle不告诉您哪个表或视图不存在?

如何解决《为什么Oracle不告诉您哪个表或视图不存在?》经验,为你挑选了4个好方法。

如果你使用过Oracle,你可能会收到有用的消息"ORA-00942:表或视图不存在".是否有合法的技术原因消息不包含丢失对象的名称?

关于这一点的争论是由于安全听起来像是由TSA制作的.如果我是攻击者,我会知道我刚试图利用哪个表,并且能够轻松地解释这个无用的消息.如果我是通过多层应用程序代码处理复杂连接的开发人员,那么通常很难说.

我的猜测是,当最初实现此错误时,有人忽略了添加对象名称,现在,人们担心它会破坏兼容性来修复它.(代码执行愚蠢的事情,如解析错误消息,如果它发生变化将会混淆.)

是否有开发人员友好(而不是招募您的DBA)方式来确定丢失表的名称?


虽然我已经接受了与该主题相关的答案,但它并没有真正回答我的问题:为什么这个名称不是错误信息的一部分?如果有人能提出真正的答案,我会很乐意改变我的投票.



1> Ethan Post..:

您可以在参数文件(纯文本或spfile)中设置EVENT以强制Oracle在user_dump_dest中转储详细的跟踪文件,对象名称可能在那里,如果不是SQL应该在那里.

EVENT ="942跟踪名称errorstack level 12"

如果您使用的是纯文本文件,则需要将所有EVENT设置保留在连续的行中.不确定如何应用于spfile.



2> Nick Pierpoi..:

SQL*Plus会告诉您不存在的表.例如:

SQL> select
  2     *
  3  from
  4     user_tables a,
  5     non_existent_table b
  6  where
  7     a.table_name = b.table_name;
   non_existent_table b
   *
ERROR at line 5:
ORA-00942: table or view does not exist

这里显示了缺失表的名称以及发生错误的SQL语句中的行号.

同样,在单行SQL语句中,您可以看到突出显示未知表名称的星号:

SQL> select * from user_tables a, non_existent_table b where a.table_name = b.table_name;
select * from user_tables a, non_existent_table b where a.table_name = b.table_name
                             *
ERROR at line 1:
ORA-00942: table or view does not exist

就你的问题而言,我猜错误消息不包括表名的原因是错误消息本身需要是静态文本.错误行中的行号和位置显然会传回SQL*Plus(不知何故).


当您可以交互式使用SQL*Plus来测试查询时,这很好.但是,一个常见的情况是,当您只使用像Hibernate这样的持久层来自应用程序的日志时,很难准确关联可能已执行的查询.
@erickson:Hibernate的问题更多;)(开玩笑)
@erickson:我担心它是瘦JDBC驱动程序的限制.OCI调用OCIErrorGet可以返回多个错误字符串.第一个是主要的,其他是细节(如堆栈跟踪).您还可以询问"错误句柄"以获取OCI_ATTR_PARSE_ERROR_OFFSET等详细信息.我在JDBC驱动程序API中找不到任何相关的调用.无论如何,Oracle JDBC驱动程序抛出纯粹的通用JDBC SqlExption - 没有Oracle特定的.

3> Mark Nold..:

如果您使用的是TOAD或TORA等SQL浏览工具,它会通过突出显示或指向将光标移动到您出错的位置来帮助您解决ORA错误.

将SQL复制并粘贴到其中一个工具中以提供帮助.您也可以找到可用的分析信息.



4> 小智..:

我不同意这个观点,即SQL +可以让你了解哪个表名是不可接受的.没错,它有助于直接DML,虽然解析它非常困难.但是当谈到动态时,我们没有得到任何帮助:

SQL> begin
  2  execute immediate 'insert into blabla values(1)';
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 2

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有