Oracle - Невозможно удалить таблицы - PullRequest
3 голосов
/ 23 марта 2012

Этот вопрос относится к вопросу , который я выложил вчера , но с дополнительными последствиями.

Ситуация такова: я не могу сбросить ЛЮБУЮ таблицу. Вот пример:

SQL> CREATE TABLE FOO (BAR NUMBER) TABLESPACE SYSTEM
 /
Table created.

SQL> SELECT COUNT(1) FROM FOO;
  COUNT(1)
----------
         0

SQL> DROP TABLE FOO;
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
ORA-06512: at line 19

Итак, таблица, кажется, существует, но я не могу ее уронить.

Обратите внимание на ошибку ORA-00604: ошибка произошла на рекурсивном уровне SQL 1 . Если я пытаюсь удалить несуществующую таблицу, эта ошибка не появляется:

SQL> DROP TABLE NON_EXISTING_TABLE
ERROR at line 1:
ORA-00942: table or view does not exist

Каким-то образом система не может найти таблицу в время отбрасывания .

Установка Oracle и сама БД новая (однажды).

РЕДАКТИРОВАТЬ - я повторил этот тест, используя другое табличное пространство и пользователя (я только что создал), и я получил немного другое поведение: используя SYS, после того как я получил ошибку DROP , я все еще могу ВЫБРАТЬ из таблицы. Однако, используя этого нового пользователя, после того как я получил ошибку DROP, я больше не могу ВЫБРАТЬ из таблицы.

Решение

Мы обнаружили проблему: отсутствует MDSYS.SDO_GEOR_SYSDATA_TABLE, что препятствует операции удаления. Решением является восстановление этой таблицы. Вот полное решение от Gaurav Soni (кстати, большое спасибо).

Запустите скрипт catmd.sql (находится в каталоге $ ORACLE_HOME / md / admin).

Сценарий catmd.sql - это сценарий, который загружает все объекты, необходимые пространственному пространству Oracle, в базу данных. Затем удалите пользователя.

Вы также можете обратиться к оракулу металинкс

Шаги для ручной установки опции пространственных данных Oracle

Удаление пользовательских результатов в ORA-942 против SDO_GEOM_METADATA_TABLE

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Я бы предложил активировать трассировку SQL (ALTER SESSION SET SQL_TRACE=TRUE;) и попробовать сбросить снова. Это создаст файл трассировки на сервере (в каталоге udump), который покажет весь SQL-запрос, выполненный сеансом, включая рекурсивные операторы. Это должно показать вам рекурсивный оператор SQL, который не выполняется.

0 голосов
/ 23 марта 2012

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

...