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