web-dev-qa-db-fra.com

SQL Server - synchronisation de 2 tables sur 2 bases de données différentes

J'ai 2 tables avec le même schéma sur 2 bases de données différentes sur le même serveur avec SQL Server 2008 R2. Une table est mise à jour plus souvent avec des données.

Il est maintenant nécessaire de synchroniser ces 2 tables. Cela peut se produire comme un processus nocturne. Quelle est la meilleure méthodologie pour réaliser la synchronisation. processus?

17
GilliVilla

Utiliser MERGE est votre meilleur pari. Vous pouvez contrôler chacune des conditions. LORSQUE CORRESPONDU ALORS, LORSQUE INÉGALÉ ALORS etc.

MERGE - Technet

MERGE- MSDN (BON!)

Exemple A: Utilisation transactionnelle - Variables de table - NON

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

Exemple B: Utilisation transactionnelle - Tables physiques

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

Exemple C: Utilisation transactionnelle - Tempdb (local et global)

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
18
Mathew A.

Vous pouvez probablement utiliser l'utilitaire de ligne de commande tablediff.exe du serveur sql. Il peut faire table par table, une comparaison unique entre deux tables et générer automatiquement le sql pour vous permettre de synchroniser le dest à la source.

Il y a aussi un wrapper GUI autour d'elle http://code.google.com/p/sqltablediff/ ce qui rend le travail encore plus facile. Il générera la ligne de commande pour vous.

Vous pouvez ensuite créer une tâche planifiée pour exécuter la ligne de commande, puis exécuter les scripts SQL générés.

4
java4script

Vous pouvez sélectionner parmi les différentes bases de données et utiliser un curseur pour boucler les données sélectionnées. Dans ce curseur, vous pouvez faire de la logique et mettre à jour ou supprimer de la table cible.

SQL 2008 a également une nouvelle instruction MERGE agréable que vous pouvez utiliser pour sélectionner/insérer/mettre à jour dans une requête T-SQL. http://technet.Microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx

Pour les processus plus complexes, j'utilise la première option. Pour des tâches de synchronisation plus simples, j'utilise la deuxième option.

En option, il existe également des services d'intégration de serveur (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

1
Tys