ora-00942 Table or View Does Not Exists при любом DML-запросе к таблице
Жила-была таблица Bar в схеме Foo. Давно жила в производственной базе, было у неё не много строк, но весьма много внешних ключей и иных упоминаний. Запросы на чтение к таблице выполнялись каждую минуту, а когда и секунду. DML-запросы случались не часто, около 10-100 в год. Но никогда проблем с ними не было.
И тут в один обыкновенный рабочий день, перестали проходить DML запросы. На любой DML ошибка
ora-00942 Table or View Does Not Exists
При этом запросы на чтение прекрасно проходят. Что же это за напасть с таблицей? Как узнать? Как победить?
Дополнения.
Запросы не работают как от имени Foo, так и от других пользователей.
Изменения регистра имени таблицы и полей в строке запроса не помогают.
select * from all_objects where object_name like '%BAR%'возвращаетOWNER | OBJECT_NAME-------------------FOO | BARselect * from all_tab_columns where table_name = 'BAR'Поля тоже все в верхнем регистре, HEX чистый.- Привожу результаты из sqlplus
.
SQL> select BARID from BAR where BARID = 'XYZ';
BARID
------------------
XYZ
SQL> update BAR set BAR_NAME = 'ABC' WHERE BARID = 'XYZ';
update BAR set BAR_NAME = 'ABC' WHERE BARID = 'XYZ'
*
ошибка в строке 1:
ORA-00942: таблица или представление пользователя не существует
SQL>
- DDL-запрос на добавление нового столбца и его удаление проходит без ошибок.
Ответы (2 шт):
Дело было так.
Зачем-то на таблицу Foo.Bar был заведён Materialized Views Log. Это было давным давно. А вот незадолго до появлении проблемы некто переименовал таблицу Foo.M$LOG_Bar в Foo.DeleteMe_M$LOG_Bar.
Т.е. при dml-запросах
ora-00942 Table or View Does Not Exists
означало, что нет таблицы с логом.
Обратное переименование, однако не помогло. Но так как этот лог вовсе не нужен был, помогло его удаление. Теперь DML работают.
Причина указана в ответе ТС. Ошибка действительно воспроизводится в версии 11.2:
11g> create table bar as select 1 id, 'memo 1' memo from dual;
Table created.
11g> create materialized view log on bar with rowid;
Materialized view log created.
11g> alter table mlog$_bar rename to del_mlog$_bar;
Table altered.
11g> update bar set memo='**memo' where id=1;
update bar set memo='**memo' where id=1
*
ERROR at line 1:
ORA-00942: table or view does not exist
В последующих версиях эта ошибка была исправлена, больше невозможно переместить или удалить таблицу с логами материализованого представления:
19c> alter table mlog$_bar rename to del_mlog$_bar;
alter table mlog$_bar rename to del_mlog$_bar
*
ERROR at line 1:
ORA-32433: cannot rename a materialized view log
Так как в дереве зависимостей логи материализованого представления отсутствуют, то для быстрой локализации ошибки надо было: провести поиск всех объектов со схожим именем, ну или просто помнить, что на таблице может существовать MV Log:
11g> select object_name, object_type from obj where object_name like '%BAR%';
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
DEL_MLOG$_BAR TABLE
BAR TABLE
11g> select master, log_table from user_mview_logs;
MASTER LOG_TABLE
------------------------------ ------------------------------
BAR MLOG$_BAR