Как найти имя схемы в 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
- Создание синонимов для всех таблиц:
CREATE SYNONYM READER_USER.TABLE1 FOR XYZ.TABLE1
Итак, если вам не сказали имя схемы владельца, у вас есть три варианта. Последний должен всегда работать:
- Запросить текущий параметр схемы:
SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL
- Перечислите свои синонимы:
SELECT * FROM ALL_SYNONYMS WHERE OWNER = USER
- Исследуйте все таблицы (за исключением некоторых известных стандартных схем):
SELECT * FROM ALL_TABLES WHERE OWNER NOT IN ('SYS', 'SYSTEM', 'CTXSYS', 'MDSYS');
Ответ 2
Вызовите SYS_CONTEXT
, чтобы получить текущую схему. Из Спросите Tom" Как получить текущую схему:
select sys_context( 'userenv', 'current_schema' ) from dual;