9

We're running a java/hibernate app going against ORACLE 10g in TESTING. Once in a while, we're seeing this error:

ORA-00942: table or view does not exist

Is there a way to find out which table/view(s) ORACLE is talking about ?

I know that I can add extra levels of logging in hibernate which will show all the SQL that it executes on ORACLE and then run that SQL to figure out which TABLE/VIEW is missing or missing permission. But given that it is in TESTING/STAGING, that will slow down performance.

Is there a simple way to narrow down on the Table/View Name ?

UPDATE :

Just so you know, I don't have control over the Oracle DB Server Environment.
I enabled Hibernate tracing/logging and found a VALID SQL. I even put Wireshark(which is a TCP packet filter) to see what hibernate actually sends and that was a valid SQL. So, why would Oracle complain about it once in a while and NOT always.

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 でクエリを実行すると、テーブル)

はい、これには問題があります。たとえば、catched_errors がドロップされるか、エラー自体が発生すると、再帰ループが発生する可能性があるため、これが本番前にのみ存在する理由です。

于 2008-10-10T09:13:26.367 に答える
3

Oracle の監査がオンになっている場合は、DBA_AUDIT_EXISTS テーブルを調べてください。オラクルは非常に詳細な監査を提供できると信じています。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

DB のインポート中にこの問題が発生した場合は、テーブルスペース名が正しいことを確認してください。

于 2012-07-30T10:06:00.040 に答える
0

ここに魔法の弾丸はないと思います。テーブルが見つからないか、クエリ内のテーブル名のスペルが間違っている可能性があります。特権の問題かもしれません。クエリを実行しないと本当にわかりません

先に進んで、オンとオフを切り替えられるようにコードをインストルメント化することをお勧めします。それを実行してクエリを抽出し、DBA に送信して解決してもらいます。

于 2008-10-10T00:06:49.183 に答える