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