SQL Server - синхронизация 2 таблиц в двух разных базах данных

У меня есть 2 таблицы с одинаковой схемой в двух разных базах данных на одном сервере с SQL Server 2008 R2. Одна таблица чаще обновляется данными.

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

Ответ 1

Использование MERGE - ваш лучший выбор. Вы можете контролировать каждое из условий. КОГДА СООТВЕТСТВУЕТ ТОГДА, КОГДА НЕ ПОДТВЕРЖДЕНЫ ТОГДА и т.д.

MERGE - Technet

MERGE-MSDN (GOOD!)

Пример A: Использование транзакции - Переменные таблицы - NO

DECLARE @Source TABLE (ID INT)
DECLARE @Target TABLE (ID INT)

INSERT INTO @Source (ID) VALUES (1),(2),(3),(4),(5)

BEGIN TRANSACTION

MERGE @Target AS T
USING @Source AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
    INSERT (ID) VALUES (S.ID);

ROLLBACK TRANSACTION
SELECT  'FAIL' AS Test,*
FROM    @Target

Пример B: Использование транзакций - Физические таблицы

CREATE TABLE SRC (ID INT);
CREATE TABLE TRG (ID INT);

INSERT INTO SRC (ID) VALUES (1),(2),(3),(4),(5)

BEGIN TRANSACTION

MERGE TRG AS T
USING SRC AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
    INSERT (ID) VALUES (S.ID);

ROLLBACK TRANSACTION
SELECT  'FAIL' AS Test,*
FROM    TRG

Пример C: Использование транзакций - Tempdb (локальный и глобальный)

CREATE TABLE #SRC (ID INT);
CREATE TABLE #TRG (ID INT);

INSERT INTO #SRC (ID) VALUES (1),(2),(3),(4),(5)

BEGIN TRANSACTION

MERGE #TRG AS T
USING #SRC AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
    INSERT (ID) VALUES (S.ID);

ROLLBACK TRANSACTION
SELECT  'FAIL' AS Test,*
FROM    #TRG

Ответ 2

Вероятно, вы можете использовать утилиту командной строки sql server tablediff.exe. Он может выполнять таблицы за столом, одноразовое сравнение между двумя таблицами и автоматически генерировать sql, чтобы вы могли синхронизировать dest с исходным кодом.

Там также обертка GUI вокруг http://code.google.com/p/sqltablediff/, что делает работу еще проще. Он создаст для вас командную строку.

Затем вы можете создать запланированную задачу для запуска командной строки, а затем выполнить сгенерированные SQL-скрипты.

Ответ 3

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

Также SQL 2008 имеет новый новый оператор MERGE, который вы можете использовать для выбора/вставки/обновления в одном запросе T-SQL. http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx

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

В качестве дополнительного варианта есть также службы интеграции с сервером (SSIS): http://blogs.msdn.com/b/jorgepc/archive/2010/12/07/synchronize-two-tables-using-sql-server-integration-services-ssis-part-i-of-ii.aspx