13

Je cherche un moyen d'automatiser la génération de scripts de changement pour nos bases de données.Génération automatisée de scripts de changement de base de données

Actuellement, nous utilisons l'édition de base de données Visual Studio 2008, qui a l'option Schema Compare, mais je ne vois pas un moyen d'automatiser ces actions. Ce que je voudrais faire est de créer une ancienne et une nouvelle base de données au cours de mes constructions quotidiennes et de comparer les schémas générer un script de changement pour les différences entre les deux. (Différences dans le schéma et les procédures, les tables de recherche peuvent être supprimées et recréées sans problèmes)

Est-ce que quelqu'un connaît une solution pour, ou vais-je écrire des miles de scripts pour que cela se passe?

L'utilisation des produits payés en plus de l'outillage Microsoft n'est pas une option ici ...

mise à jour en fonction des commentaires:

  • J'ai diverses bases de données de différentes tailles, mais tous les changements qui se passera dans un manière contrôlée tout en étant conscient des données déjà présentes.
  • Seuls les changements "faciles" devraient être pris en charge automatiquement, je pense à l'ajout de colonnes et de tableaux (très commun). Les colonnes ne peuvent jamais être supprimées (donc l'outil/script peut protester si cela se produit)

Répondre

7

Semblable à ce que fait @Anton Gogolev, nous utilisons un outil qui vous permet d'écrire des migrations dans des fichiers XML. L'outil que nous utilisons est appelé Liquibase et il prend en charge plusieurs types de SGBD. Non seulement nous l'utilisons en interne sur nos schémas de développement, mais nous l'utilisons également en externe lors de l'installation de la mise à niveau que le client exécute.

+0

Bon appel, je vais regarder dans celui-ci – thijs

1

Vous pouvez essayer d'inverser un peu votre approche.

Je développe un outil appelé Wizardby qui vous permet d'écrire des migrations de base de données dans un DSL spécial. Ainsi, au lieu de s'appuyer sur des algorithmes de comparaison de schémas fragiles (par exemple, aucun d'entre eux ne peut gérer correctement les noms de colonnes/tables), vous devez écrire toutes les modifications dans votre fichier de base de données dans un fichier mdl. . Il peut également être intégré dans votre processus de construction.

+0

Nous utilisons déjà Enterprise Architect pour modéliser nos bases de données, à partir de là nous générons des scripts sql create. Je vais jeter un autre regard sur ce que l'EA peut faire ici ... – thijs

1

La fonctionnalité de SQL Compare est également disponible en tant que bibliothèques et documentée en tant que telle. J'ai utilisé ces DLL dans une application de console, n'a eu aucun problème.

+0

Pouvez-vous être plus précis sur les assemblages/classes que vous avez utilisés, peut-être même fournir un échantillon? – thijs

1

Pouvez-vous être plus précis? Par exemple, quelle est la taille de la base de données? Combien de données a-t-il? À quelle vitesse la mise à niveau devrait-elle être?

Je suis sûr qu'il n'y a pas une solution entièrement générique et automatique pour ce problème.

  • Si vous renommez la colonne et que vous comparez simplement et uniquement le schéma? La colonne sera supprimée et créée vide.

  • Si vous divisez la colonne FullName en Name, MidleName, SurName. Comment le schéma compare-t-il?

Bien sûr, ces échantillons peuvent être continués encore et encore.

+0

Je peux dire en toute sécurité que les renames ne se produira pas. Même chose pour la division des données. Toute modification du schéma sera "sûre" pour les données. Si nous changeons des choses qui auraient besoin de reconstruire les données, je serais heureux d'écrire manuellement des scripts pour cela. Je veux que l'automatisation prenne soin des choses "faciles" (ajout de tables, de colonnes, mise à jour et ajout d'index) – thijs

3

Comme thijs mentionné, le Database Edition Power Tools contient la SqlSchemaCompareTask que vous pouvez utiliser à partir de votre code pour générer un script de changement:

SqlSchemaCompareTask task = new SqlSchemaCompareTask() 
{ 
    SourceConnectionString = "Data Source=source-db; ...", 
    SourceDatabaseName = "source-database-name", 
    TargetConnectionString = "Data Source=target-db; ...", 
    TargetDatabaseName = "target-database-name", 
    OutputFileName = "changes.sql", 
    OutputPath = @"C:\path\to\output" 
}; 

task.Execute(); 

Vous pouvez l'exécuter en utilisant un script de compilation via msbuild.exe:

<Import 
    Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\TeamData\ 
      Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks.targets"/> 
<Target Name ="SchemaCompare"> 
    <SqlSchemaCompareTask 
     SourceConnectionString="$(SourceConnectionString)" 
     SourceDatabaseName="$(TargetDatabase)" 
     TargetConnectionString="$(TargetConnectionString)" 
     TargetDatabaseName="$(TargetDatabase)" 
     OutputPath = "$(IntermediateOutputPath)" 
     OutputFileName = "$(TargetDatabase)SchemaCompare.sql" 
     IgnoreChecks ="true"/> 
</Target> 
+0

Où cette fonctionnalité est-elle allée dans VS2010? – CodeGrue

1

Depuis maintenant 10 ans, j'ai utilisé DbGhost pour implémenter la gestion des changements de sql dans la majorité des consultations auxquelles j'ai participé; c'est une surprise sans fin à l'absence de gestion des changements SQL pour rivaliser avec celle prévue pour le code de l'application. Le support technique est incomparable pour la mise en œuvre d'une approche d'intégration continue de la prise en charge des bases de données, ainsi que pour les processus de mise à niveau et de mise à niveau. Plus récemment, je l'ai appliqué au projet Monorail/nHibernate sur lequel je travaille qui génère des scripts de mise à niveau à partir de notre modèle de domaine POCO qui spécifie notre base de données. Ceux-ci sont créés et appliqués en utilisant notre build CruiseControl à chaque check-in.

Plus spécifiquement pour votre situation, vous pouvez pointer DbGhost vers la version de version (v1.0) de votre base de données et écrire vos données statiques et source. Cela peut ensuite être entré dans le contrôle de la source. Ce sont des étapes facultatives mais un bon point de départ. Peut également comparer (et/ou créer) une base de données générée à partir de la source ou d'une base de données courante (par exemple v1.1) et fournir un rapport de comparaison, un script de mise à niveau ou mettre à niveau la base de données cible. Nous l'utilisons pour générer tous les scripts de mise à niveau (rollforward et rollback) pour mettre à niveau entre chaque delta. En 10 ans, chaque fois que j'ai trouvé un problème avec le produit, les gens de soutien ont toujours poliment souligné une erreur dans mon processus ou l'un des nombreux points d'extension dans le processus que je dois utiliser pour passer mon problème. Il gère certainement la suppression des colonnes, des index, des données, absolument tout. Les paramètres vous permettent d'effectuer uniquement de simples modifications automatiquement et peuvent échouer sur les avertissements ou supprimer des objets (colonnes/tables), tous maintenables dans les fichiers de paramètres XML (nous avons plus de paramètres sympathiques dans la construction de développement).

Je ne considérerais pas le développement de Sql Server sans cela et cela a révolutionné mon développement SQL.

Si vous avez besoin de plus de détails sur un processus recommandé ou d'autres étapes prescriptives, faites-le moi savoir.

5

espoir que je peux encore aider:

Vous devriez être en mesure de le faire avec un outil de comparaison bonne base de données qui prend en charge l'interface de ligne de commande. Dans ce cas, vous devrez créer un script de chauve-souris simple et l'ajouter au planificateur de tâches.

Je sais que ApexSQL Diff prend en charge cette fonctionnalité et je suis assez sûr que SQL Compare de Red Gate a la même option dans la version pro.