如果你使用过Oracle,你可能会收到有用的消息"ORA-00942:表或视图不存在".是否有合法的技术原因消息不包含丢失对象的名称?
关于这一点的争论是由于安全听起来像是由TSA制作的.如果我是攻击者,我会知道我刚试图利用哪个表,并且能够轻松地解释这个无用的消息.如果我是通过多层应用程序代码处理复杂连接的开发人员,那么通常很难说.
我的猜测是,当最初实现此错误时,有人忽略了添加对象名称,现在,人们担心它会破坏兼容性来修复它.(代码执行愚蠢的事情,如解析错误消息,如果它发生变化将会混淆.)
是否有开发人员友好(而不是招募您的DBA)方式来确定丢失表的名称?
虽然我已经接受了与该主题相关的答案,但它并没有真正回答我的问题:为什么这个名称不是错误信息的一部分?如果有人能提出真正的答案,我会很乐意改变我的投票.
您可以在参数文件(纯文本或spfile)中设置EVENT以强制Oracle在user_dump_dest中转储详细的跟踪文件,对象名称可能在那里,如果不是SQL应该在那里.
EVENT ="942跟踪名称errorstack level 12"
如果您使用的是纯文本文件,则需要将所有EVENT设置保留在连续的行中.不确定如何应用于spfile.
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(不知何故).
如果您使用的是TOAD或TORA等SQL浏览工具,它会通过突出显示或指向将光标移动到您出错的位置来帮助您解决ORA错误.
将SQL复制并粘贴到其中一个工具中以提供帮助.您也可以找到可用的分析信息.
我不同意这个观点,即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