Как объединить две базы данных в SQL Server? - PullRequest
8 голосов
/ 26 мая 2009

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

Ответы [ 6 ]

7 голосов
/ 26 мая 2009

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

Чтобы правильно объединить две базы данных, использующие автоматически сгенерированные (non_GUID) ключи, вам необходимо выполнить несколько шагов. Сначала добавьте новый автоматически сгенерированный ключ в родительскую таблицу, затем импортируйте все данные из обеих таблиц, переименуйте старый старый файл в ID_old и переименуйте новые файлы в старое имя идентификатора. В этот момент вы можете перейти на дочерние столы. Вам нужно будет скопировать в дочерние таблицы, присоединившись к родительской таблице и приняв новое поле идентификатора в качестве значения для внешнего ключа вместо значения в существующей таблице. Вам нужно будет повторить этот процесс для каждой таблицы внешнего ключа, и если эта таблица также является родительской таблицей, вам нужно будет добавить поле преобразование в таблицу, прежде чем копировать какие-либо данные, чтобы вы могли работать по всей цепочке. , Чтобы сделать это правильно, требуется много знаний о структуре базы данных и много планирования. Не стоит делать это без хорошей резервной копии обеих исходных баз данных. Также лучше, если этот процесс может произойти, когда обе базы данных находятся в однопользовательском режиме.

Если вы используете естественные ключи и у вас есть дубликаты, у вас будет совсем другая проблема. Все дубликаты записей ключей должны быть сначала перенесены в отдельную таблицу, и необходимо определить, какие данные являются более правильными. В некоторых случаях вы обнаружите, что естественный ключ на самом деле не уникален (они редко бывают, поэтому я почти никогда не использую их), и объединенная база данных должна будет работать с автоматически сгенерированным ключом некоторого типа. Это будет связано как с изменениями кода, так и с изменениями базы данных, так что это вариант последней инстанции.

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

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

Нет простого способа объединить две базы данных (даже при использовании GUIDS у вас есть проблема с дубликатами в естественном ключе).

6 голосов
/ 24 июля 2013

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

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

Есть тонна таких на рынке. Red Gate, уже упоминавшийся в другом посте, является одним из лучших, но вы также можете попробовать ApexSQL Data Diff , dbForge , Инструментарий сравнения SQL и многие другие.

4 голосов
/ 26 мая 2009

Лучшая ставка, вероятно, будет с сторонним приложением, таким как RedGate SQL Data Compare . Стоит немного денег, но это стоит того, чтобы написать сценарий IMO.

1 голос
/ 27 мая 2016

Вот как я делал это дважды за последние годы: http://byalexblog.net/merge-sql-databases

0 голосов
/ 11 февраля 2016

Вы можете просто добавить дополнительное поле (например, DatabaseID) для всех таблиц в вашей объединенной базе данных и добавить его в первичные ключи. Таким образом, вы можете сохранить исходные ключи, имея уникальные ключи в объединенной базе данных - и вы можете определить, из какой базы данных получена строка. Это то, что SQL-Hub делает - если это всего лишь одна работа, вы можете сделать это с помощью бесплатной пробной версии.

0 голосов
/ 27 апреля 2010

Поскольку, если у вас есть первичные ключи в качестве IDENTITY, вот мое предложение (не требует изменения схемы).

  1. Установите все внешние ключи так, чтобы ON UPDATE CASCADE было установлено
  2. Обновите поле первичного ключа / IDENTITY в родительской таблице и добавьте максимальное значение поля соответствующей таблицы, в которую вы собираетесь объединиться (FK затем будут каскадно переносить значения в дочерние таблицы)
  3. Сделайте то же самое для полей PK / IDENTITY в дочерних таблицах
  4. Следуйте предложению этого ответа на форуме и используйте SET IDENTITY_INSERT ON / OFF по обе стороны от вставки каждой из таблиц, начиная с родительской таблицы и затем переходя к дочерним таблицам
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...