2011-04-27 4 views
0

Je dois créer un outil capable de fusionner les bases de données de production des clients. Habituellement, ces bases de données auront le même schéma (je ferai quelques vérifications plus tard, mais pour l'instant nous supposerons qu'il est). Filtrage des données en double est également quelque chose pour plus tard. Ceci doit être fait automatiquement (donc pas de génération de script via SSMS etc). J'ai déjà dû recommencer plusieurs fois parce que chaque fois que je rencontrais des problèmes, je ne pensais pas, alors cette fois je voulais vous demander conseil avant de recommencer.Fusion de bases de données - Suppression d'une colonne d'identité

Mon plan d'action actuel est:

  • schéma Copier la base de données 1 (plus tard je vais ajouter quelques chèques ici pour lorsque le schéma est différent
  • boucle sur toutes les tables et mettre tous les étrangers mises à jour clés en cascade, et définir l'ordre dans lequel le TableData doit être inséré (de sorte que les tables contenant le PK d'abord, puis les tables de maintien de la FK de)
  • boucle toutes les tables dans l'ordre correct

    • Arrivée base de données 2 table pour colonne d'identité, le cas échéant, récupérer le valeur initiale de courant à partir de la table correspondante dans la base de données 1, drop propriété d'identité sur la table base de données 2 et mettre à jour chaque ID de newID = currentId + semence (pour éviter double des clés primaires plus tard)
    • Générer un script d'insertion (Table.EnumScript de SMO) pour la base de données 1 table
    • Générer un script d'insertion (Table.EnumScript de SMO) pour la base de données 2 Table
    • Exécuter toutes les lignes de base de données 1 insérer un script sur la nouvelle base de données
    • Exécuter toutes les lignes dans la base de données 2 script insertion (qui a maintenant des données primaires sur le terrain clés/identité qui va suivre ceux de la base de données 1) sur la nouvelle base de données
  • Aller à table suivante

Tout fonctionnait lors du test (désactivation de la propriété d'identité dans SSMS, création d'un script T-SQL pour mettre à jour chaque ligne avec la graine donnée, ..) Mais le problème est maintenant d'automatiser cela en C#, plus spécifique la désactivation du propriété d'identité. Il ne semble pas y avoir de solution propre à cela. La création d'une nouvelle table et la reconstruction de toutes les contraintes, etc. semblent être la mauvaise façon, car la seule raison pour laquelle j'en ai besoin est de cascader chaque FK pour que tout pointe vers l'endroit correct. l'identité-colonne-données, et le changer après la génération du script et avant l'insertion dans la nouvelle base de données. Mais alors j'ai besoin de savoir quels points de données à quelles autres données, alors que tout est toujours dans les chaînes (insertscript)?

Des suggestions, des pensées ou des techniques sur la façon de gérer cela?

Je connais le comparateur SQL de Red Gate, et il est en effet merveilleux, mais j'ai besoin de le programmer moi-même. Utilisation de: SMO, SQL Server 2005 - 2008R2 (pas de développement ou d'édition d'entreprise sur les serveurs clients), ADO.NET, C#, .NET framework 2.0, Visual Studio 2008

+0

Pour lier des lignes sans identité, vous pouvez utiliser des GUID en tant que colonnes non clés. – Dalex

+0

J'ai écrit un ETL pour faire ceci, sans enlever la propriété IDENTITY. J'ai ajouté une colonne fictive pour suivre les anciens ID et les ai insérés dans une carte, puis j'ai mis à jour tous les FK de la carte. Longue histoire courte, un problème que j'ai eu que je ne vous vois pas manipuler ici est des références circulaires. –

Répondre

1

Je ne sais pas exactement ce que vous essayez d'accomplir avec votre processus, mais la gestion des versions de base de données est quelque chose que j'ai un vif intérêt.
Jetez un oeil à DBSourceTools (http://dbsourcetools.codeplex.com).
Il s'agit d'un utilitaire permettant de scripter une base de données entière sur disque, y compris toutes les contraintes et données de clé étrangère. En utilisant les cibles de déploiement, vous pourrez ensuite recréer ces bases de données sur un autre serveur de base de données (généralement une machine locale).
L'outil gérera les dépendances et les grandes tables de base de données en utilisant Sql Bulk insert - essayer de générer un script avec 50 000 instructions d'insertion sera un cauchemar.
Amusez-vous. Je suis impliqué dans le projet http://dbsourcetools.codeplex.com.

Questions connexes