Як встановити схему за замовчуванням користувача Oracle?


12

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

Відповіді:


19

Немає нічого подібного до PostgreSQL set search_pathв Oracle.

Найближчим, що я можу придумати, буде тригер входу для користувача, який працює 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;є загальним, це ускладнить усунення несправностей, оскільки робить будь-яку помилку невидимою. Можливо, видаліть обробку виключень цілком або введіть помилку на сервері в АВТОНОМНОЇ транзакції, а потім повторно РАЙОНУЙТЕ її ?
Джордж3

@ George3: але якщо виняток насправді викинутий, користувач не може увійти - я просто хотів запобігти тому, щоб хтось не міг увійти, лише через дурну помилку в тригері. Але кожен вільний адаптувати це до всього, що йому хочеться.
a_horse_with_no_name

0

Я не думаю, що є спосіб встановити його. Користувач - схема. AFAIK ви можете встановити лише простір таблиць за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.