Где запись будет вставлена ​​первой? - PullRequest
1 голос
/ 24 сентября 2010

У меня есть схема под названием " CUSTOMERS ". В этой схеме есть таблица с именем RECEIVABLES .

Существует еще одна схема, которая называется " ACCOUNTS ". В этой схеме есть таблица с именем RECEIVABLES_AC .

RECEIVABLES_AC имеет общедоступный синоним, который называется RECEIVABLES. Структура таблиц обеих таблиц абсолютно одинакова.

Если ваш интерфейс использует учетные данные схемы клиента для установления соединения, как вы можете гарантировать, что запись будет вставлена ​​в RECEIVABLES_AC без изменения кода интерфейса.

Я думаю, что это вопрос с подвохом. За исключением переименования таблицы RECEIVABLES в схеме CUSTOMERS, я не понимаю, как это можно сделать.

Ответы [ 3 ]

2 голосов
/ 24 сентября 2010

Единственный способ, которым я могу придумать (без изменения оператора входа или вставки), - это использовать триггер базы данных, который запускается при входе в систему и изменяет текущую схему на ACCOUNTS:

create or replace trigger logon_set_schema
AFTER LOGON ON DATABASE
BEGIN
   if sys_context('USERENV','SESSION_USER') = 'CUSTOMERS' then
      execute immediate 'alter session set current_schema=accounts';
   end if
END;
/

Однако это, вероятно, нарушит другие аспекты кода, поэтому изменение приложения для указания имени схемы будет крайне предпочтительным.

0 голосов
/ 25 сентября 2010

Два хороших способа решения этой проблемы:

Вариант 1

  1. Переименовать CUSTOMERS.RECEIVABLES.
  2. Удалите общедоступный синоним.
  3. Создать частный синоним в схеме CUSTOMERS, который называется RECEIVABLES и указывает на ACCOUNTS.RECEIVABLES_AC.

Вариант 2

  1. Измените интерфейс, чтобы он ссылался на RECEIVABLES_AC вместо RECEIVABLES.
  2. Создайте частный синоним в схеме CUSTOMERS с именем RECEIVABLES_AC, который указывает на ACCOUNTS.RECEIVABLES_AC.

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

0 голосов
/ 24 сентября 2010

Что не указано, так это если поведение предполагается вместо или в дополнение к.

  1. Использовать репликацию на ACCOUNTS.RECEIVABLES для распространения DML на CUSTOMER.RECEIVABLES_AC.Триггеры, потоки, что у вас.

  2. Используйте оператор ALTER SESSION SET CURRENT_SCHEMA, чтобы изменить пространство имен по умолчанию для сеанса пользователя.

Правоспособ ответить - это исправить дизайн и не иметь несколько таблиц дебиторской задолженности с открытыми схемами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...