9

在测试中,我们正在运行一个针对 ORACLE 10g 的 java/hibernate 应用程序。有时,我们会看到此错误:

ORA-00942: 表或视图不存在

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

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

有没有一种简单的方法来缩小表/视图名称的范围?

更新 :

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

4

5 回答 5

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;
/

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

请注意,是的,这是有问题的,例如,如果 catch_errors 被丢弃,或者本身引发错误,您可能会得到递归循环,因此为什么这只存在于预生产中。

于 2008-10-10T09:13:26.367 回答
3

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

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

对于一些想法(我只是快速搜索了一下)

于 2008-10-10T00:07:43.910 回答
1

您应该检查帐户,该帐户是否具有访问目标表的权限。

于 2012-04-10T06:46:12.823 回答
0

我不认为这里有灵丹妙药。它可能是缺少表,或者查询中的表名拼写错误。这可能是一个特权问题。如果不执行查询,你真的无法判断

我建议您继续以可以打开和关闭它的方式检测您的代码。运行它,提取查询,然后将其发送给您的 DBA 来解决。

于 2008-10-10T00:06:49.183 回答
0

如果您在导入数据库时​​遇到此问题,请检查表空间名称是否正确。

于 2012-07-30T10:06:00.040 回答