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

12

Я создал несколько новых пользователей в Oracle. Однако при запуске sqlplus им всем необходимо полностью указать имена таблиц в запросе. Какой лучший способ установить схему по умолчанию для этих новых пользователей?

a_horse_with_no_name
источник

Ответы:

19

В set search_pathOracle нет ничего похожего на 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;
/
a_horse_with_no_name
источник
Отличная идея, но поскольку when others then null;это универсальное решение, оно усложнит поиск и устранение неисправностей, поскольку делает любую ошибку невидимой. Может быть, полностью удалить обработку исключений или зарегистрировать ошибку на сервере в АВТОНОМНОЙ транзакции, а затем повторно ПОДНЯТЬ ее ?
George3
@ George3: но если на самом деле выдается исключение, пользователь не может войти в систему - я просто хотел, чтобы кто-то не смог войти в систему только из-за глупой ошибки в триггере. Но любой может свободно адаптировать это к тому, что он / она хочет.
a_horse_with_no_name
0

Я не думаю, что есть способ установить один. Пользователь является схемой. AFAIK вы можете установить только табличное пространство по умолчанию.

cljk
источник