ORA-00942: таблица или представление не существует: как найти, о какой таблице или представлении идет речь

мы запускаем приложение java / hibernate, идущее против ORACLE 10g в тестировании. Время от времени мы видим эту ошибку:

ORA-00942: таблица или представление не существует

есть ли способ узнать, о какой таблице/представлениях говорит ORACLE ?

Я знаю, что могу добавить дополнительные уровни входа в спящий режим, который покажет весь SQL, который он выполняет на ORACLE, а затем запустите этот SQL, чтобы выяснить, какая таблица / представление отсутствует или отсутствует разрешение. Но учитывая, что он находится в тестировании/постановке, это замедлит производительность.

есть ли простой способ сузить имя таблицы/представления ?

обновление :

чтобы вы знали, у меня нет контроля над средой сервера Oracle DB.
Я включил трассировку/ведение журнала Hibernate и нашел допустимый SQL. Я даже поставил Wireshark (который является фильтром пакетов TCP), чтобы увидеть, что на самом деле отправляет hibernate, и это был допустимый SQL. Итак, почему Oracle жалуйтесь на это время от времени и не всегда.

5 ответов


посмотрите в таблицу DBA_AUDIT_EXISTS, когда аудит включен для Oracle. Я считаю, что Oracle может предоставить очень подробный аудит, который вы можете просто включать и выключать, когда вам нравится с помощью команд DB, хотя я не помню, что они с верхней части моей головы.

посмотреть: http://docs.oracle.com/cd/B19306_01/network.102/b14266/cfgaudit.htm

для какой-то идеи (которую я просто быстро погуглил)


Это то, что я делаю, приношу извинения тому, кто это изначально пришел, я знаю, что взял его с какого-то веб-сайта, но не могу вспомнить, где прямо сейчас.

в preproduction, у меня есть это

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, он скажет вам таблицу)

Примечание, да, там есть проблемы с этим, например, что, если caught_errors отбрасывается или вызывает ошибку, вы можете получить рекурсивный цикл, поэтому это существует только в предпроизводстве.


Я не думаю, что здесь есть волшебная палочка. Это может быть отсутствующая таблица или неправильно написанное имя таблицы в запросе. Это может быть вопрос привилегий. Вы не можете сказать, не выполнив запрос

Я предлагаю вам идти вперед и инструмент код таким образом, что вы можете включить и выключить его. Запустите его, извлеките запрос и отправьте его в DBA для решения.


вы должны проверить учетную запись, которая имеет ли разрешение на доступ к целевой таблице.


пожалуйста, проверьте правильность имени табличного пространства, если вы столкнулись с этой проблемой при импорте БД.