Запрос таблиц, перечисленных в DBA_Tables - PullRequest
4 голосов
/ 09 октября 2009

Сторонний продукт, который у нас есть в моей компании, использует Oracle в качестве бэкэнда.Я пытаюсь войти в базу данных Oracle и посмотреть на схему и данные.Я вошел как sys / sysdba, создал пользователя с табличным пространством по умолчанию, созданным приложением, и предоставил пользователю все необходимые разрешения для запроса структур.Я также установил для O7_DICTIONARY_ACCESSIBILITY значение true, чтобы разрешить запросы объектов словаря данных.

После входа в систему как пользователя и запроса User_Tables ничего не возвращается.Но когда я запрашиваю DBA_Tables, таблицы, которые я ожидаю найти, возвращаются.Я новичок в Oracle, поэтому я не совсем уверен, как несистемная таблица может быть в табличном пространстве, но не user_table.

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

1 Ответ

14 голосов
/ 09 октября 2009

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

  • USER_TABLES возвращает информацию о таблицах, которые принадлежат конкретному пользователю. Не похоже, что у вашего пользователя есть какие-либо таблицы, поэтому вы можете ожидать, что он будет пустым.
  • ALL_TABLES возвращает информацию о таблицах, к которым у определенного пользователя есть доступ. Если вы предоставили соответствующие привилегии, ваш пользователь должен увидеть таблицы в этом представлении словаря данных.
  • DBA_TABLES возвращает информацию о каждой таблице в базе данных, даже если вам необязательно иметь доступ к базовой таблице.

Если вы пытаетесь запросить данные из одной из таблиц, указываете ли вы имя схемы (столбец OWNER в ALL_TABLES)? Если вы не являетесь владельцем объекта, вам, как правило, необходимо использовать полные имена для ссылки на него, т.е.

SELECT *
  FROM schema_owner.table_name

Вы можете избежать использования полностью определенных имен, если

  • Вы создаете синоним (публичный или частный) для объекта
  • Вы меняете CURRENT_SCHEMA для сеанса. Это изменяет схему по умолчанию, в которой разрешается имя. Это не влияет на разрешения и привилегии. Вы можете изменить текущую схему с помощью команды

    SET ALTER SESSION SET current_schema = new_schema_name

    Вы должны будете делать это для каждого сеанса, который создает пользователь - возможно, при входе в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...