Оракул - Стол Зомби
У меня эта странная проблема со вчерашнего дня. Я пробовал несколько вариантов, и я фактически переустановил ORACLE и саму БД.
Вот проблема: у меня есть эта таблица, которая в некотором роде зомби. Вот симптомы:
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME='MYTABLE'
Возвращает запись, что означает, что таблица существует.
SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'MYTABLE'
Возвращает все столбцы MYTABLE. Пока все хорошо, таблица существует.
SELECT * FROM MYTABLE
Возвращает ORA-00942: таблица или представление не существует. В этот момент я совершенно сбит с толку: кажется, что таблица существует в USERTABLES, но я не могу выбрать по ней?
CREATE TABLE MYTABLE (Foo NUMBER) TABLESPACE MYTABLESPACE
Возвраты:ORA-00604: ошибка произошла на рекурсивном уровне SQL 1 ORA-00001: уникальное ограничение (SYS.I_OBJ2) нарушено
Я не понимаю эту ошибку. Но лучшее еще впереди.
SELECT * FROM MYTABLE
Удивительно, но вышеприведенный запрос (точная копия третьего запроса) теперь возвращает несколько записей! Более того, я заметил, что столбец Foo отсутствует: таблица, которую я сейчас вижу, является моей исходной таблицей, в которой были другие столбцы.
DROP TABLE MYTABLE
Я сейчас пытаюсь отбросить таблицу, и я получаю следующие ошибки:
ORA-00604: ошибка произошла на уровне рекурсивного SQL 1 ORA-00942: таблица или представление не существует ORA-06512: в строке 19
SELECT * FROM MYTABLE
Еще больше запутавшись, чем когда-либо, я пытаюсь выполнить приведенный выше запрос, и, к удивлению, таблицы больше не существует
Я не понимаю этого: таблица находится в USERTABLES, но я не могу выбрать SELECT по ней, однако, если я создаю новую таблицу с тем же именем, я получаю сообщение об ошибке, но теперь я могу SELECT по предыдущей версии этой таблицы с несколькими записей.
Какие-нибудь мысли? Мне действительно нужна твоя помощь:(
РЕДАКТИРОВАТЬ - Я проверил сейчас: я не могу удалить любую таблицу. Это может быть просто новым симптомом.
Решение
Проблема заключалась в том, что таблица MDSYS.SDO_GEOR_SYSDATA_TABLE отсутствовала, и триггер события удаления пытался получить к ней доступ, что вызвало ошибку. Решением было восстановление этой таблицы.
2 ответа
Вы не указали имена схем при попытке выбрать и удалить. CURRENT_SCHEMA вашего сеанса может отличаться от пользователя, вошедшего в систему. Проверьте, пытаясь
select SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') from dual;
Вместо того, чтобы описать, какой был вывод, не могли бы вы скопировать / вставить полный вывод для нас?
Наконец, вы можете исключить, что кто-то испортил словарь? Вы знаете, SYSDBA может сделать что-нибудь....
Если есть привилегии, попробуйте этот запрос:
SELECT *
FROM dba_objects
WHERE object_name = 'MYTABLE';
И посмотрите, какие объекты существуют с таким именем. Это может указать вам правильное направление.