Что пользователь вы вошли в систему, как при выполнении этих команд?
Предполагаете, что вы вошли как пользователь, отличный от 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"
где имя таблицы в двойных кавычках и спичек обсадных корпус, который вы видите в словаре данных. Вам также придется делать это каждый раз, когда вы запрашиваете таблицу. Многие инструменты не обрабатывают чувствительные к регистру идентификаторы, а будущие разработчики будут проклинать ваше имя, если вы создадите регистрозависимые идентификаторы в своих базах данных. но ты можешь сделать это.
Спасибо, Джастин. Двойные кавычки сделали трюк! – ZOG