Я создал несколько новых пользователей в Oracle. Однако при запуске sqlplus им всем необходимо полностью указать имена таблиц в запросе. Какой лучший способ установить схему по умолчанию для этих новых пользователей?
В set search_path
Oracle нет ничего похожего на PostgreSQL .
Самая близкая вещь, о которой я могу подумать, - это запуск входа в систему для пользователя, который запускает ALTER SESSION SET CURRENT_SCHEMA ...
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
EXCEPTION
when others
then null; -- prevent a login failure due to an exception
END;
/
Если список пользователей не слишком длинный, вы можете создать триггер входа в базу данных, чтобы вам не нужно было создавать этот триггер для каждого пользователя:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
BEGIN
if (user in ('TOM', 'DICK', 'HARRY')) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
Конечно, список пользователей, для которых вы хотите изменить схему по умолчанию, также можно взять из таблицы. В этом случае вам нужно только вставить или удалить строки оттуда, чтобы «активировать» эту функцию (вместо повторного создания триггера каждый раз).
Другим вариантом будет создание синонимов каждый раз, когда вы создаете пользователя, который указывает на реальные таблицы. Вы можете автоматизировать это, используя хранимую процедуру, которая перебирает все таблицы в одной схеме и создает для них синонимы в другой схеме.
Если все ваши пользователи Oracle не работают над одними и теми же таблицами, я настоятельно рекомендую не использовать общедоступные синонимы, которые вам придется создавать только один раз - они могут вызвать много проблем, если в вашей установке существуют разные пользователи приложений.
Редактировать :
Следуя совету Алекса, вот триггер входа, который проверяет роль, а не имя пользователя:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
declare
has_role boolean;
BEGIN
has_role := dbms_session.is_role_enabled('FOOBAR_ROLE');
if (has_role) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
when others then null;
это универсальное решение, оно усложнит поиск и устранение неисправностей, поскольку делает любую ошибку невидимой. Может быть, полностью удалить обработку исключений или зарегистрировать ошибку на сервере в АВТОНОМНОЙ транзакции, а затем повторно ПОДНЯТЬ ее ?Я не думаю, что есть способ установить один. Пользователь является схемой. AFAIK вы можете установить только табличное пространство по умолчанию.
источник