Как настроить несколько баз данных (схем) Oracle с одним и тем же пользователем? - PullRequest
0 голосов
/ 20 марта 2012

Наша компания унаследовала некоторые программы, работающие на C # Visual Studio 2010, Windows 7 и Oracle 11g.После некоторых усилий мы запустили программное обеспечение и настроили стабильную базу данных (схему).

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

Я хотел сделать следующее: Допустим, наша существующая схеманазывается ПРОД.Я хотел создать вторую схему под названием TEST, которую мы можем использовать для импортированных данных.Затем в коде C # я могу просто переключать имя источника данных при переключении между двумя нашими схемами базы данных.Загвоздка в том, что имя пользователя и пароль для этого соединения появляются во множестве мест, разбросанных по коду.Чтобы избежать необходимости изменять учетные данные пользователя в нескольких местах каждый раз, когда мы переключаемся между «средами БД», я хотел создать одного пользователя, который будет иметь доступ к PROD и TEST.привилегия пользователя для конкретной схемы? предполагает, что это невозможно. Правильный способ предоставления пользователям доступа к дополнительным схемам в Oracle предлагает метод предоставления доступа на уровне объекта, но этого недостаточно: В основном я хочу, чтобы один пользователь имел доступ к двум идентичным схемам (ПРОД и ТЕСТ) .Достигнув этого, я хочу начать изменять TEST, чтобы начать с импорта данных.

Я также пытался создать TEST как отдельную установку Oracle Database на другом порту, но при попытке создать моего пользователя.в этом новом экземпляре я все еще получаю конфликт о том, что пользователь уже существует (поскольку он был создан для PROD в исходной установке базы данных).

Мой пользователь уже существует и имеет доступ к PROD.Как мне дать ему доступ к TEST?Или как решить более общую проблему определения базы данных PROD и TEST, определенной в приложении, которое использует Oracle?

В MySQL это было бы тривиально, но я понятия не имею, как это сделать вOracle.Я очень новичок в Oracle.

Ответы [ 3 ]

1 голос
/ 20 марта 2012

На вопрос о предоставлении разрешений уже дан ответ .

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

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

Если вы хотите, чтобы в программном обеспечении было как можно меньше трения, вам нужно сделать пару вещей:

  1. Рефакторинг кода от придурка, который решил жестко закодировать информацию о соединении в нескольких местах. Вам нужно собрать строки в одном месте и убедиться, что вы извлекаете код уровня доступа к данным (DAL) в его собственный класс.
  2. Рассмотрите возможность создания объектов домена, которые не зависят от схем (ы) базы данных. Я считаю это обязательным, но вы могли бы уйти, не делая этого. Я по-прежнему буду создавать доменные объекты, даже если они соответствуют таблицам схемы PROD, поскольку вам не следует использовать конструкции данных, если вы переходите от одной схемы к другой.
  3. Создание интерфейса для вашего уровня доступа к данным (DAL)
  4. Сопоставить текущую схему данных через текущий DAL с объектами домена, используя интерфейс.
  5. Сопоставить новую схему через новый DAL с объектами домена, используя интерфейс.
  6. Создайте фабрику (или используйте шаблон провайдера), чтобы определить, какой объект DAL вы собираетесь использовать (это делает приложение настраиваемым для старой или новой "схемы"
0 голосов
/ 26 марта 2012

Соединение с Oracle неправильно обрабатывается в коде C #, и это вызывает трудности.

Если уровень доступа к данным был определен отдельно, как предлагает Грегори, или если в инструкциях SQL использовалось более общее соглашение об именах, как указывает ответ А. Б., тогда было бы намного проще переключаться между двумя базами данных.

Поскольку наш мандат в настоящее время не предусматривает внесения каких-либо изменений / рефакторинга кода, я использую подход резервного копирования и восстановления:

Я создаю резервную копию рабочей базы данных. Затем я делаю необходимые тесты и изменения в базе данных. Если мне нужно вернуться к рабочей базе данных, я снова создаю резервную копию «тестируемой» базы данных и восстанавливаю исходную рабочую базу данных, используя соответствующий флаг для замены существующих таблиц в случае восстановления. Это позволяет мне переключаться между «рабочей» базой данных и «тестовой» базой данных.

Это не идеально, так как для резервного копирования и восстановления требуется некоторое время, но он работает без влияния на код C # и дает возможность выполнять работу с «тестовой» базой данных, не затрагивая рабочую. Поскольку это временный сценарий, пока база данных «тестирования» не заработает, я буду придерживаться этого подхода.

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

0 голосов
/ 22 марта 2012

Я предполагаю, что у вас есть схема PROD и DBUSER, которые имеют некоторые привилегии для объектов в этой схеме.
Имя и пароль DBUSER жестко закодированы во всем приложении.
Вы создали новую схему TEST, которая выглядит так же, как PROD (включая гранты для DBUSER).
Вы хотите, чтобы везде, где приложение выполняло что-то вроде:

UPDATE some_table set ...

Будет обновлена ​​таблица some_table в TEST, а не в PROD.
Мое предложение заключается в использовании и изменении SYNONYMS , т.е. -
Если вы хотите обновить some_table в PROD, выполните:

CREATE OR REPLACE PUBLIC SYNONYM some_table for prod.some_table;

и когда вы хотите обновить some_table в TEST, выполните:

CREATE OR REPLACE PUBLIC SYNONYM some_table for test.some_table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...