ORA-00942:表或视图不存在:如何查找它正在讨论的表或视图

anj*_*anb 8 java sql oracle hibernate ora-00942

我们正在运行一个java/hibernate应用程序,在TESTING中针对ORACLE 10g.偶尔,我们会看到这个错误:

ORA-00942:表或视图不存在

有没有办法找出ORACLE正在谈论的表/视图?

我知道我可以在hibernate中添加额外级别的日志记录,这将显示它在ORACLE上执行的所有SQL,然后运行该SQL以确定缺少哪个TABLE/VIEW或缺少权限.但鉴于它处于TESTING/STAGING状态,这会降低性能.

是否有一种简单的方法来缩小表/视图名称?

更新:

您知道,我无法控制Oracle数据库服务器环境.
我启用了Hibernate跟踪/日志记录,并找到了一个VALID SQL.我甚至把Wireshark(这是一个TCP数据包过滤器)看看hibernate实际发送了什么,这是一个有效的SQL.那么,为什么甲骨文会偶尔抱怨它,而不是总是抱怨它.

Mat*_*son 7

这就是我所做的,对这个最初来自的人有所了解,我知道我是从某个网站上拿过来的,但现在不记得在哪里了.

在预生产中,我有这个

create table caught_errors (
  dt        date,               
  username  varchar2( 30), -- value from ora_login_user
  msg       varchar2(2000),
  stmt      varchar2(2000)
);


create or replace trigger catch_errors
   after servererror on database
declare
   sql_text ora_name_list_t;
   msg_     varchar2(2000) := null;
   stmt_    varchar2(2000) := null;
begin

  for depth in 1 .. ora_server_error_depth loop
    msg_ := msg_ || ora_server_error_msg(depth);
  end loop;

  for i in 1 .. ora_sql_txt(sql_text) loop
     stmt_ := stmt_ || sql_text(i);
  end loop;

  insert into 
    caught_errors (dt     , username      ,msg ,stmt )
           values (sysdate, ora_login_user,msg_,stmt_);
end;
/
Run Code Online (Sandbox Code Playgroud)

任何时候抛出servererror,它被捕获并记录到一个表,然后我可以检查该表以查找有问题的查询,并根据需要退还它们以查看丢失的表(当您在sqlplus中运行查询时,它会告诉您表)

注意,是的,这有问题,例如,如果catch_errors被删除,或者本身引发错误,你可以得到递归循环,因此为什么这只存在于预生产中.


Mar*_*ark 3

当 Oracle 审计打开时,查看 DBA_AUDIT_EXISTS 表。我相信 Oracle 可以提供非常详细的审计,您可以根据需要通过 DB 命令简单地打开和关闭审计,尽管我不记得它们是什么。

请参阅: http ://docs.oracle.com/cd/B19306_01/network.102/b14266/cfgaudit.htm

一些想法(我刚刚在谷歌上快速搜索)