Existe-t-il un système de contrôle de version pour les modifications de la structure de la base de données ?

StackOverflow https://stackoverflow.com/questions/308

Question

Je rencontre souvent le problème suivant.

Je travaille sur certaines modifications apportées à un projet qui nécessitent de nouvelles tables ou colonnes dans la base de données.J'effectue les modifications de la base de données et continue mon travail.Habituellement, je me souviens d'écrire les modifications afin qu'elles puissent être répliquées sur le système live.Cependant, je ne me souviens pas toujours de ce que j'ai modifié et je ne me souviens pas toujours de l'écrire.

Donc, j'appuie sur le système live et j'obtiens une grosse erreur évidente indiquant qu'il n'y a pas de NewColumnX, pouah.

Même si ce n’est peut-être pas la meilleure pratique dans cette situation, existe-t-il un système de contrôle de version pour les bases de données ?Je ne me soucie pas de la technologie de base de données spécifique.Je veux juste savoir s'il en existe un.Si cela fonctionne avec MS SQL Server, alors tant mieux.

Était-ce utile?

La solution

Dans Ruby on Rails, il existe un concept de migration -- un script rapide pour changer la base de données.

Vous générez un fichier de migration, qui contient des règles pour augmenter la version de la base de données (comme l'ajout d'une colonne) et des règles pour rétrograder la version (comme la suppression d'une colonne).Chaque migration est numérotée et un tableau garde une trace de votre version actuelle de base de données.

À migrer vers le haut, vous exécutez une commande appelée "db:migrate" qui examine votre version et applique les scripts nécessaires.Vous pouvez migrer vers le bas de la même manière.

Les scripts de migration eux-mêmes sont conservés dans un système de contrôle de version : chaque fois que vous modifiez la base de données, vous archivez un nouveau script, et tout développeur peut l'appliquer pour amener sa base de données locale à la dernière version.

Autres conseils

Je suis un peu old-school, dans la mesure où j'utilise des fichiers sources pour créer la base de données.Il existe en fait 2 fichiers - project-database.sql et project-updates.sql - le premier pour le schéma et les données persistantes, et le second pour les modifications.Bien entendu, les deux sont sous contrôle de source.

Lorsque la base de données change, je mets d'abord à jour le schéma principal dans project-database.sql, puis je copie les informations pertinentes dans project-updates.sql, par exemple les instructions ALTER TABLE.Je peux ensuite appliquer les mises à jour à la base de données de développement, tester, itérer jusqu'à ce que ce soit bien fait.Ensuite, archivez les fichiers, testez à nouveau et appliquez-les à la production.

De plus, j'ai généralement une table dans la base de données - Config - telle que :

SQL

CREATE TABLE Config
(
    cfg_tag VARCHAR(50),
    cfg_value VARCHAR(100)
);

INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');

Ensuite, j'ajoute ce qui suit à la section de mise à jour :

UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';

Le db_version n'est modifié que lorsque la base de données est recréée et que le db_revision me donne une indication de la distance entre la base de données et la ligne de base.

Je pouvais conserver les mises à jour dans leurs propres fichiers séparés, mais j'ai choisi de les mélanger toutes ensemble et d'utiliser le copier-coller pour extraire les sections pertinentes.Un peu plus de ménage s'impose, c'est-à-dire supprimer ':' de $Revision 1.1 $ pour les geler.

MonBatis (anciennement iBatis) possède un migration de schéma, outil à utiliser en ligne de commande.Il est écrit en Java mais peut être utilisé avec n'importe quel projet.

Pour parvenir à une bonne pratique de gestion des modifications de bases de données, nous devons identifier quelques objectifs clés.Ainsi, le système de migration de schéma MyBatis (ou MyBatis Migrations en abrégé) cherche à :

  • Travaillez avec n’importe quelle base de données, nouvelle ou existante
  • Tirer parti du système de contrôle de source (par ex.Subversion)
  • Permettre aux développeurs ou équipes simultanés de travailler de manière indépendante
  • Permettre des conflits très visibles et facilement gérables
  • Autoriser la migration vers l’avant et vers l’arrière (évoluer, dévolution respectivement)
  • Rendre l'état actuel de la base de données facilement accessible et compréhensible
  • Permettre les migrations malgré les privilèges d'accès ou la bureaucratie
  • Travaillez avec n’importe quelle méthodologie
  • Encourage les bonnes pratiques cohérentes

Redgate a un produit appelé Contrôle de source SQL.Il s'intègre à TFS, SVN, SourceGear Vault, Vault Pro, Mercurial, Perforce et Git.

Je recommande fortement Delta SQL.Je l'utilise simplement pour générer les scripts de comparaison lorsque j'ai fini de coder ma fonctionnalité et de vérifier ces scripts dans mon outil de contrôle de source (Mercurial :))

Ils ont à la fois une version SQL Server et Oracle.

Je me demande que personne n'ait mentionné l'outil open source liquibase qui est basé sur Java et devrait fonctionner pour presque toutes les bases de données prenant en charge jdbc.Par rapport aux rails, il utilise XML au lieu de Ruby pour effectuer les modifications de schéma.Bien que je n'aime pas le XML pour les langages spécifiques à un domaine, l'avantage très intéressant du XML est que Liquibase sait comment annuler certaines opérations comme

<createTable tableName="USER"> 
   <column name="firstname" type="varchar(255)"/>
</createTable>

Vous n'avez donc pas besoin de gérer cela vous-même

Les instructions SQL pures ou les importations de données sont également prises en charge.

La plupart des moteurs de bases de données devraient prendre en charge le transfert de votre base de données dans un fichier.Je sais que MySQL le fait, de toute façon.Ce sera juste un fichier texte, vous pourrez donc le soumettre à Subversion, ou à tout ce que vous utilisez.Il serait également facile d'exécuter une comparaison sur les fichiers.

Si vous utilisez SQL Server, il serait difficile de battre Data Dude (alias Database Edition de Visual Studio).Une fois que vous avez compris, effectuer une comparaison de schéma entre votre version contrôlée par la source de la base de données et la version en production est un jeu d'enfant.Et en un clic, vous pouvez générer votre DDL diff.

Il y a une instruction vidéo sur MSDN, c'est très utile.

Je connais DBMS_METADATA et Toad, mais si quelqu'un pouvait proposer un Data Dude pour Oracle, la vie serait vraiment douce.

Demandez à vos instructions de création de table initiales dans le contrôleur de version, puis ajoutez des instructions de modification de table, mais ne modifiez jamais les fichiers, modifiez simplement les fichiers idéalement nommés de manière séquentielle, ou même en tant que "ensemble de modifications", afin que vous puissiez trouver toutes les modifications pour un déploiement particulier.

La partie la plus difficile que je puisse voir est le suivi des dépendances, par exemple, pour un déploiement particulier, la table B devra peut-être être mise à jour avant la table A.

Pour Oracle, j'utilise Crapaud, qui peut transférer un schéma vers un certain nombre de fichiers discrets (par exemple, un fichier par table).J'ai quelques scripts qui gèrent cette collection dans Perforce, mais je pense que cela devrait être facilement réalisable dans n'importe quel système de contrôle de révision.

Jetez un œil au package Oracle DBMS_METADATA.

En particulier, les méthodes suivantes sont particulièrement utiles :

  • DBMS_METADATA.GET_DDL
  • DBMS_METADATA.SET_TRANSFORM_PARAM
  • DBMS_METADATA.GET_GRANTED_DDL

Une fois que vous êtes familiarisé avec leur fonctionnement (assez explicite), vous pouvez écrire un script simple pour transférer les résultats de ces méthodes dans des fichiers texte pouvant être placés sous contrôle de code source.Bonne chance!

Je ne sais pas s'il existe quelque chose d'aussi simple pour MSSQL.

J'écris mes scripts de version de base de données en parallèle avec le codage et je conserve les scripts de version dans une section spécifique au projet dans SS.Si j'apporte une modification au code qui nécessite une modification de la base de données, je mets à jour le script de publication en même temps.Avant la sortie, j'exécute le script de publication sur une base de données de développement propre (copiée en termes de structure depuis la production) et j'effectue mes tests finaux dessus.

Je fais cela de temps en temps depuis des années : gérer (ou essayer de gérer) les versions de schéma.Les meilleures approches dépendent des outils dont vous disposez.Si vous pouvez obtenir l'outil Quest Software "Schema Manager", vous serez en bonne forme.Oracle possède son propre outil de qualité inférieure, également appelé « Schema Manager » (ce qui prête à confusion ?) que je ne recommande pas.

Sans outil automatisé (voir d'autres commentaires ici sur Data Dude), vous utiliserez directement des scripts et des fichiers DDL.Choisissez une approche, documentez-la et suivez-la rigoureusement.J'aime avoir la possibilité de recréer la base de données à tout moment, je préfère donc avoir une exportation DDL complète de l'intégralité de la base de données (si je suis le DBA), ou du schéma du développeur (si je suis en produit -Mode de développement).

PLSQL Developer, un outil d'All Arround Automations, dispose d'un plugin pour les référentiels qui fonctionne correctement (mais pas très bien) avec Visual Source Safe.

Depuis le Web :

Le plug-in de contrôle de version fournit une intégration étroite entre l'IDE de développement PL/SQL >> et tout système de contrôle de version prenant en charge la spécification d'interface Microsoft SCC.>>Cela inclut les systèmes de contrôle de version les plus populaires tels que Microsoft Visual SourceSafe, >>Merant PVCS et MKS Source Integrity.

http://www.allroundautomations.com/plsvcs.html

Studio d'urgence vous permet d'inverser le schéma de votre base de données dans l'outil et vous pouvez ensuite le comparer aux bases de données actives.

Exemple:Inversez votre schéma de développement dans ER Studio : comparez-le à la production et il répertoriera toutes les différences.Il peut scripter les modifications ou simplement les appliquer automatiquement.

Une fois que vous avez un schéma dans ER Studio, vous pouvez soit enregistrer le script de création, soit l'enregistrer en tant que binaire propriétaire et l'enregistrer dans le contrôle de version.Si jamais vous souhaitez revenir à une version antérieure du schéma, consultez-la simplement et transférez-la sur votre plate-forme de base de données.

Il existe un "framework de migration de base de données" PHP5 appelé Ruckusing.Je ne l'ai pas utilisé, mais le exemples montrez l'idée, si vous utilisez le langage pour créer la base de données au fur et à mesure des besoins, il vous suffit de suivre les fichiers sources.

Vous pouvez utiliser Outils de données Microsoft SQL Server dans Visual Studio pour générer des scripts pour les objets de base de données dans le cadre d'un projet SQL Server.Vous pouvez ensuite ajouter les scripts au contrôle de source à l’aide de l’intégration du contrôle de source intégrée à Visual Studio.De plus, les projets SQL Server vous permettent de vérifier les objets de la base de données à l'aide d'un compilateur et de générer des scripts de déploiement pour mettre à jour une base de données existante ou en créer une nouvelle.

Nous avons utilisé Édition de base de données MS Team System avec un assez bon succès.Il s'intègre plus ou moins de manière transparente au contrôle de version TFS et à Visual Studio et nous permet de gérer facilement les processus, vues, etc. stockés.La résolution des conflits peut être pénible, mais l’historique des versions est complet une fois terminé.Par la suite, les migrations vers le QA et la production sont extrêmement simples.

Il est juste de dire qu’il s’agit d’un produit en version 1.0 et qu’il n’est pas sans quelques problèmes.

Schema Compare for Oracle est un outil spécialement conçu pour migrer les modifications de notre base de données Oracle vers une autre.Veuillez visiter l'URL ci-dessous pour le lien de téléchargement, où vous pourrez utiliser le logiciel pour un essai entièrement fonctionnel.

http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm

En l'absence de VCS pour les modifications de table, je les ai enregistrées dans un wiki.Au moins, je pourrai voir quand et pourquoi cela a été modifié.C'est loin d'être parfait car tout le monde ne le fait pas et nous utilisons plusieurs versions de produits, mais c'est mieux que rien.

Je recommanderais l’une des deux approches.Tout d’abord, investissez dans PowerAMC de Sybase.Edition pour entreprise.Il vous permet de concevoir des modèles de données physiques, et bien plus encore.Mais il est livré avec un référentiel qui vous permet d'archiver vos modèles.Chaque nouvel enregistrement peut être une nouvelle version, il peut comparer n'importe quelle version à n'importe quelle autre version et même à ce qui se trouve dans votre base de données à ce moment-là.Il présentera ensuite une liste de toutes les différences et demandera lesquelles doivent être migrées… puis il construira le script pour le faire.Ce n’est pas bon marché mais c’est une bonne affaire à deux fois le prix et son retour sur investissement est d’environ 6 mois.

L'autre idée est d'activer l'audit DDL (fonctionne dans Oracle).Cela créera un tableau avec chaque modification que vous apportez.Si vous interrogez les modifications à partir de l'horodatage vers lequel vous avez déplacé pour la dernière fois les modifications de votre base de données vers la production en ce moment, vous aurez une liste ordonnée de tout ce que vous avez fait.Quelques clauses Where pour éliminer les changements à somme nulle comme create table foo ;suivi de drop table foo;et vous pouvez FACILEMENT créer un script de mod.Pourquoi conserver les modifications dans un wiki, cela fait le double du travail.Laissez la base de données les suivre pour vous.

Deux recommandations de livres :"Refactoring Databases" par Ambler et Sadalage et "Agile Database Techniques" par Ambler.

Quelqu'un a mentionné les migrations Rails.Je pense qu'ils fonctionnent très bien, même en dehors des applications Rails.Je les ai utilisés sur une application ASP avec SQL Server que nous étions en train de migrer vers Rails.Vous vérifiez les scripts de migration eux-mêmes dans le VCS.Voici un article du pragmatique Dave Thomas sur le sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top