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