Невозможно удалить только что созданную таблицу

Я создал таблицу с именем dual2. У меня там есть строки, и я могу выбирать из них. При попытке его отбросить выдает такую ​​ошибку:

ОШИБКА в строке 1:
ORA-00604: ошибка на уровне рекурсивного SQL 1
ORA-00942: таблица или представление не существует

Однако таблица все еще существует! Он возвращается из dba_tables и user_tables.

Любые идеи о том, что здесь происходит ??

альтернативный текст http://img180.imageshack.us/img180/6012/28140463.png < / а>

Вот сценарий создания таблицы, который я получил от разработчика plsql:

-- Create table
create table
(
  DUMMY VARCHAR2(1)
)
tablespace SYSTEM
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

P.S .: p.cambell спасибо за редактирование! и извините за мой плохой английский :)


person stee1rat    schedule 01.08.2010    source источник
comment
Вы уверены, что ссылаетесь на правильную схему?   -  person OMG Ponies    schedule 02.08.2010
comment
Да, drop table system.dual2 делает то же самое. И я вошел как система. А владельцем таблицы является система.   -  person stee1rat    schedule 02.08.2010
comment
Вот почему я не думаю, что таблица находится в SYSTEM. Я не могу вспомнить, как получить скрипт таблицы от разработчика PLSQL - это бы очень быстро все прояснило. Щелкните правой кнопкой мыши по таблице и выберите свойства?   -  person OMG Ponies    schedule 02.08.2010
comment
Я добавил скрипт, который я получил с разработчиком plsql, в текст вопроса. Но эта таблица ЕСТЬ в схеме системы ..   -  person stee1rat    schedule 02.08.2010
comment
Интересно, есть ли у вас какие-то проблемы с синонимами или другими объектами. Что дает вам SELECT owner, object_name, object_type из dba_objects?   -  person dpbradley    schedule 02.08.2010
comment
извините, забыл добавить, где object_name = 'DUAL2   -  person dpbradley    schedule 02.08.2010
comment
Ну, там написано owner = SYSTEM, object_name = DUAL2, object_type = TABLE, выглядит нормально.   -  person stee1rat    schedule 02.08.2010
comment
Непонятно ... Что ж, если предположить, что кто-то еще не определил триггер события уровня базы данных, который захватывает drop DDL (как упоминал Гэри), теория испорченного каталога кажется наиболее вероятной.   -  person dpbradley    schedule 02.08.2010
comment
Итак, как проверить каталог на наличие повреждений? И как это исправить?   -  person stee1rat    schedule 09.08.2010


Ответы (2)


Правило 1 в НИКОГДА не создавайте ничего как системное (или SYS). Это встроенные схемы для встроенных объектов.

Вам, вероятно, придется подключиться как SYSDBA, чтобы иметь достаточные привилегии для удаления любых объектов, принадлежащих системе. Кроме того, в зависимости от установки могут быть триггеры, которые срабатывают перед таблицей сброса (я думаю, что у MDSYS она есть) и которые могут не работать для объекта SYSTEM.

Лично у меня возникло бы искушение уничтожить базу данных и начать заново или вернуться к тому состоянию, которое было до того, как вы создали объект.

person Gary Myers    schedule 02.08.2010
comment
Я знаю о Правиле №1, но проблема в том, что у других пользователей тоже есть эта проблема, поэтому я решил сделать это как system или sys. Для sys as sysdba написано «недостаточно привилегий». Конечно, я могу удалить эту базу данных, но я просто хочу знать - в чем проблема. - person stee1rat; 02.08.2010
comment
Да, и там сказано «недостаточно прав» для удаления таблиц других пользователей как sysdba, кстати. - person stee1rat; 02.08.2010
comment
Похоже, проблема не связана с реальной таблицей, которую вы создали, а какая-то другая важная таблица SYSTEM или SYS каким-то образом была уничтожена. Есть ли недопустимые объекты в БД? Если это то, что происходит, перестройте БД, но это может быть (частично) исправлено повторным запуском catproc или аналогичным. Я бы экспортировал все, что вы хотите сохранить, и заблокировал доступ, прежде чем касаться чего-либо еще ... - person Alex Poole; 02.08.2010
comment
Вы можете попробовать трассировку DBMS_MONITOR и просмотреть файл трассировки, чтобы увидеть, какие запускаются триггеры и / или рекурсивные SQL-запросы. Возможно, вы можете отключить триггер / сбросить объект / повторно включить триггер. - person Gary Myers; 03.08.2010

если вы хотите удалить только данные таблицы, вы можете использовать усечение.

Truncate TABLE [dbo].[table_name]

Он удалит все строки и столбец, если есть какой-либо автоинкремент (или идентификатор). тогда семя установлено в 1.

person DineshHona    schedule 02.08.2010
comment
-1; ответ SQL Server для проблемы Oracle. Oracle не имеет ни автоинкремента, ни столбцов идентификации. - person Adam Musch; 02.08.2010