Как найти имя схемы в Oracle? когда вы подключены в сеансе sql, используя только для чтения пользователя

Я подключен к базе данных оракула с пользователем только для чтения, и я использовал имя службы при настройке соединения в sql-разработчике, поэтому я не знаю SID (схему).

Как я могу узнать имя схемы, с которой я подключен?

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

Изменить: я получил свой ответ частично с помощью приведенного ниже кода sql Frank, который дал мне имя владельца, которое является схемой в моем случае. Но я не уверен, что это универсальное решение, применимое ко всем случаям.

select owner, table_name from all_tables.

Изменить. Я думаю, что над sql это правильное решение во всех случаях, потому что схема является владельцем всех объектов db. Таким образом, либо я получаю схему, либо владелец, оба они одинаковы. Раньше мое понимание схемы было неправильным, и я прошел через другой question, и найденная схема также является пользователем.

Frank/a_horse_with_no_name Поместите это в ответ, чтобы я мог его принять.

Ответы

Ответ 1

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

Если вы просто создаете пользователя и предоставляете разрешение SELECT для пользователя только для чтения, вам нужно добавить имя схемы к каждому имени таблицы. Чтобы этого избежать, у вас есть в основном два варианта:

  • Установите текущую схему в сеансе:
ALTER SESSION SET CURRENT_SCHEMA=XYZ
  1. Создание синонимов для всех таблиц:
CREATE SYNONYM READER_USER.TABLE1 FOR XYZ.TABLE1

Итак, если вам не сказали имя схемы владельца, у вас есть три варианта. Последний должен всегда работать:

  • Запросить текущий параметр схемы:
SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL
  1. Перечислите свои синонимы:
SELECT * FROM ALL_SYNONYMS WHERE OWNER = USER
  1. Исследуйте все таблицы (за исключением некоторых известных стандартных схем):
SELECT * FROM ALL_TABLES WHERE OWNER NOT IN ('SYS', 'SYSTEM', 'CTXSYS', 'MDSYS');