2017-10-03 2 views
-3

J'ai une base de données de plus de 500 tables et maintenant il y a une copie de cette base de données d'une vieille sauvegarde. Nous avons noté qu'il y a beaucoup d'enregistrements manquants dans la nouvelle base de données que je voudrais mettre à jour. Quelle est la meilleure pratique pour mettre à jour tous les enregistrements d'une autre base de données, nous pouvons le faire individuellement en utilisant des requêtes, mais cela prend du temps et nous avons une date limite. Existe-t-il une alternative ou un meilleur moyen d'y parvenir?Comment mettre à jour toutes les tables d'une base de données en les comparant avec une autre base de données?

Cordialement

+0

c'est une question trop large. comment allez-vous choisir quels enregistrements sont corrects s'il y a des conflits avec les identifiants? allez-vous effectuer des mises à jour si certains enregistrements ont changé? Allez-vous supprimer des enregistrements si nécessaire? Et si les enregistrements avec des relations qui reposent sur des clés primaires doivent être ajoutés mais que les identifiants sont pris par d'autres enregistrements. Cela ressemble à un problème qui ne sera pas résolu d'ici la date limite. – Tanner

+0

De nombreux outils tiers permettent de comparer les données entre les bases de données. SQL Data Compare from redgate est l'un d'entre eux. Quelque chose comme ça est à peu près aussi proche que vous pouvez obtenir un bouton facile pour ce genre de chose. C'est incroyablement compliqué pour des choses comme la manipulation lorsque le schéma est différent. J'aime les délais. J'aime le son de whooshing qu'ils font en passant. –

Répondre

1

La première chose à remarquer est que cela pourrait être dangereux en soi.

Vous voudriez avoir des horodatages sur chaque table pour les performances, sinon vous allez rencontrer des problèmes potentiels de collision d'enregistrements. Sans horodatage, vous voulez vraiment être certain que vous n'avez pas de identity_inserts et que la sauvegarde de la base de données n'a pas été écrite indépendamment du système actuel.

Mais si vous avez horodatages, ou un moyen garanti si l'identification des enregistrements pour éviter une collision, etc, et vous voulez vraiment rouler votre propre plutôt que d'utiliser l'un des outils de comparaison de données disponibles puis ...

Vous pourriez écrire une procédure stockée avec une requête dynamique et itérer sur chaque table avec INFORMATION_SCHEMA.TABLES et exécuter une instruction d'insertion créée.

EXEC sp_execute '' est la structure pour les requêtes dynamiques. Créez une variable pour la requête, utilisez un curseur pour parcourir les fiches INFORMATION_SCHEMA_TABLES et INFORMATION_SCHEMA_TABLES pour construire des instructions SQL.

Il faut espérer que suffisamment d'informations pour vous aider à construire une requête SQL dynamique qui aurait pour effet de faire quelque chose comme ce qui suit sur chaque table:

INSERT INTO TableA(Col1, Col2, ColN) 
SELECT 
    Col1, Col2, ColN 
FROM 
    OldDatabase.TableA 
WHERE 
    TableA.[ID or Timestamp] NOT IN OldDatabase.[ID or TIMESTAMP] 

Mais vous voulez vraiment examiner pourquoi vous manquez ces enregistrements. Peut-être aussi les insérer dans une table de notation pour vous assurer que vous pouvez revenir en arrière et examiner pourquoi.

Espérons que cela aide.