ORA-00942: таблица или представление не существует: как найти таблицу или представление, о которых идет речь - PullRequest
8 голосов
/ 10 октября 2008

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

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

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

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

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

ОБНОВЛЕНИЕ:

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

Ответы [ 5 ]

7 голосов
/ 10 октября 2008

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

В подготовительном производстве у меня есть

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 сброшен или выдает саму ошибку, вы можете получить рекурсивный цикл, поэтому он существует только при подготовке производства.

3 голосов
/ 10 октября 2008

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

См: http://docs.oracle.com/cd/B19306_01/network.102/b14266/cfgaudit.htm

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

0 голосов
/ 30 июля 2012

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

0 голосов
/ 10 апреля 2012

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

0 голосов
/ 10 октября 2008

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

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

...