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. Un tableau est mis à jour plus souvent avec des données.
il faut maintenant synchroniser ces 2 tables. Cela peut se produire comme un processus de nuit. Quelle est la meilleure méthode pour réaliser la synchronisation. processus ?
3 réponses
utiliser MERGE est votre meilleure option. Vous pouvez contrôler chacune des conditions. LORSQU'il y a correspondance alors, LORSQU'il n'y a pas correspondance alors, etc.
Exemple: Transactionnelle de l'utilisation des Variables de Table - 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
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 & 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
vous pouvez probablement utiliser le tablediff de sql server.exe utilitaire de ligne de commande. Il peut faire table-par-table, une comparaison unique entre deux tables et générer le sql automatiquement pour vous de synchroniser le plus à la source.
Il y a aussi une interface graphique wrapper autour d'elle http://code.google.com/p/sqltablediff/ ce qui rend la tâche encore plus facile. Il générera la ligne de commande pour vous.
vous pouvez alors créer une tâche programmée pour exécuter la ligne de commande, puis exécuter les scripts sql générés.
vous pouvez sélectionner dans 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 un peu de logique et mettre à jour ou supprimer de la table cible.
aussi SQL 2008 a une nouvelle déclaration de fusion 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 une synchronisation plus simple tâches j'utilise la deuxième option.
comme option supplémentaire il y a aussi des services D'intégration de serveurs (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