2013-02-25 3 views
3

Правильно, вот мой вопрос.Oracle Express Edition 11gR2: «таблица или представление не существует», но она отображается в «dba_tables»!

Я играл с некоторым инструментом ETL, который создал несколько таблиц в моем Oracle XE. Тогда я замечаю, что не мог ни получить доступ к этим таблицам, ни бросить их.

Как вы можете видеть на скриншоте (ну я не мог опубликовать изображение, поэтому мне пришлось копировать/вставлять текст). Запрос «dba_tables» показывает эту таблицу, но при ее удалении Oracle говорит, что «не существует».

SQL> select table_name from dba_tables where owner='HR'; 

TABLE_NAME 
------------------------------ 
REGIONS 
LOCATIONS 
DEPARTMENTS 
JOBS 
EMPLOYEES 
JOB_HISTORY 
DetailedOrders 
COUNTRIES 

8 rows selected. 

SQL> drop table HR.DetailedOrders cascade constraints; 
drop table HR.DetailedOrders cascade constraints 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> 

Я также попытался: Создайте пустую таблицу с тем же названием - успех! Тогда отбросьте его - удачи! Запрос dba_tables или user_tables, он все еще там!

Это проблема с проблемой? Как я могу это исправить?

Спасибо,

Джереми

ответ

4

Что пользователь вы вошли в систему, как при выполнении этих команд?

Предполагаете, что вы вошли как пользователь, отличный от HR (что похоже на то, что вы, вероятно, есть), имеет смысл, что вы можете узнать, что существует таблица, запрашивая DBA_TABLES, но у вас нет прав сделать что-нибудь со столом. Это означало бы, что вашей учетной записи было предоставлено нечто вроде привилегии SELECT ANY DICTIONARY или SELECT_CATALOG_ROLE, но явно не было предоставлено привилегий на hr.DetailedOrders. Ошибка, которую вы получаете, когда пытаетесь сделать что-то с таблицей, на которой у вас нет прав, является ORA-00942, и сообщение об ошибке сконструировано таким образом, чтобы она непреднамеренно не приводила информацию о злоумышленнике о таблицах, которые могут существовать в базе данных сообщая вам, является ли проблема, что таблица действительно не существует или что она существует, и у вас нет привилегий. Это может сделать ошибку несколько запутанной, особенно если вы используете учетную запись, которой был предоставлен доступ к DBA_TABLES.

Что вы подразумеваете под «созданием пустого стола с тем же именем»? Вы говорите о создании таблицы DetailedOrders в текущей схеме? Если это так, то также ожидается, что это будет работать (как и падение таблицы). Каждая схема представляет собой отдельное пространство имен. Таким образом, вы можете иметь один объект DetailedOrders в каждой схеме в базе данных, если хотите. Некоторые из них могут быть таблицами, некоторые из них могут быть просмотрами, некоторые могут даже храниться в процедурах - конечно, это не будет иметь большого смысла, но это, безусловно, может быть сделано.

Кроме того, похоже, что таблица DetailedOrders была создана в качестве идентификатора с учетом регистра. Это ужасная идея. Oracle по умолчанию использует нечувствительные к регистру идентификаторы, но может заставить использовать идентификаторы, чувствительные к регистру, если вы окружите идентификатор двойными кавычками. Ниже приведено описание StackOverflow thread that discusses case-sensitive vs. case-insensitive identifiers. Короткий ответ, однако, является то, что если вы на самом деле имеют возможность удалить таблицу, вы должны были бы сделать что-то вроде

DROP TABLE HR."DetailedOrders" 

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

+0

Спасибо, Джастин. Двойные кавычки сделали трюк! – ZOG