Клонировать базу данных SQL Server со всеми новыми первичными ключами - PullRequest
3 голосов
/ 23 декабря 2011

Нам нужно создать автоматизированный процесс для клонирования небольших баз данных SQL Server, но в целевой базе данных все первичные ключи должны отличаться от исходного (мы используем идентификаторы UNIQUEIDENTIFIER для всех первичных ключей).У нас есть тысячи баз данных, которые имеют одну и ту же схему, и нам нужно использовать этот процесс «клонирования» для создания новых баз данных с сопоставлением всех неключевых данных, но с сохранением ссылочной целостности.

Существует ли простой способсделать это?

Обновление - Пример:

Каждая база данных имеет ~ 250 транзакционных таблиц, которые необходимо клонировать.Рассмотрим следующий простой пример нескольких таблиц и их взаимосвязей (каждая таблица имеет первичный ключ UniqueIdentifier = id):

location
doctor
  doctor_location (to doctor.id via doctor_id, to location.id via location_id)
patient
  patient_address (to patient.id via patient_id)
  patient_medical_history (to patient.id via patient_id)
  patient_doctor (to patient.id via patient_id, to doctor.id via doctor_id)
  patient_visit (to patient.id via patient_id)
  patient_payment (to patient.id via patient_id)

Причина, по которой нам нужно клонировать базы данных, заключается в том, что офисы выкупаются или меняютсявладение (из-за изменений в партнерстве это происходит относительно часто).Когда это происходит, налоговая и страховая информация меняется для офиса.Юридически это требует совершенно новой корпоративной структуры, а финансовые показатели между офисами должны быть полностью разделены.

Однако большинство офисов хотят сохранить всю историю своих пациентов, поэтому они решили «клонировать» базу данных.Новая база данных будет лишена финансовой истории, но все данные пациента / врача будут сохранены.Старая база данных будет иметь всю информацию вплоть до точки «клонирования».

Причина, по которой требуются новые идентификаторы GUID, заключается в том, что мы объединяем все базы данных в единую реляционную базу данных для целей отчетности.Поскольку все транзакционные таблицы имеют идентификаторы GUID, это прекрасно работает ... за исключением случаев клонов.

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

Ответы [ 2 ]

0 голосов
/ 27 декабря 2011

Для этого можно создать пакет служб Integration Services (SSIS).Вы должны создать новую базу данных в потоке управления, а затем скопировать данные из источника в место назначения, используя поток данных, который также заменит GUID или выполнит другие необходимые преобразования на этом пути.иметь большое количество таблиц, и только некоторые из них необходимо изменить, тогда вам может быть лучше просто сделать копию файлов MDF / LDF, повторно присоединить их с новым именем БД и использовать скрипт дляобновите идентификаторы.

Преимущество использования служб SSIS состоит в том, что их проще автоматизировать.Недостатком является то, что настройка может занять немного больше времени.

0 голосов
/ 23 декабря 2011

Я бы сделал это, создав базовое восстановление базы данных и обновив все значения в первичном ключе до нового GUID.

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

CREATE TABLE Orders
(

    OrderID uniqueidentifier,
    CustomerID uniqueidentifier REFERENCES Customer(CustomerID) ON UPDATE CASCADE,

etc...

Теперь, когда вы обновляете CustomerID таблицы Customer, также обновляется CustomerID таблицы заказов.

Вы можете сделать это длявсю таблицу с помощью простого запроса на обновление:

UPDATE TABLE Customer SET CustomerID = NewID();

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

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