Travailler sur un projet avec plusieurs branches, où chaque branche est finalement fusionnée à la branche principale, et est essentiellement isolée afin de développer une nouvelle fonctionnalité.
La base de données, qui est MS SQL Server, a un schéma partagé, mais chaque branche modifie le schéma au fur et à mesure de sa progression.
Ma principale question est de savoir quelles sont les bonnes façons de gérer le partage du schéma de la branche principale vers la branche dérivée, de sorte que les modifications apportées à la branche principale soient facilement fusionnées dans la branche dérivée, sans s'appuyer sur de nouvelles modifications dans la dérivée. branche?
Réponses:
J'ai utilisé avec succès la méthodologie suivante, élaborée dans Version Control et votre base de données :
J'entends souvent l'opinion de «en quoi est-ce différent de simplement garder les scripts de définition d'objet sous contrôle de source?». La différence est énorme, car lorsque vous déployez une nouvelle version de votre application, vous n'allez pas simplement créer une nouvelle base de données. La plupart du temps, votre application devra mettre à niveau la base de données existante, y compris les données existantes . Il s'agit d'une différence cruciale, vos étapes de mise à niveau doivent garantir l'intégrité et la cohérence des données existantes pendant la mise à niveau. Certaines opérations sont triviales dans le code (ajoutez une colonne non nullable avec une valeur par défaut au script de définition d'objet de table, c'est fait), mais elles sont en fait extrêmement douloureuses lors du déploiement réel (la table a 1,5 milliard de lignes, la colonne d'ajout s'épuiserait de l'espace de journal si cela est fait de la manière «simpleton»).
Comment cela fonctionne avec la ramification:
Notez qu'aucun outil n'est impliqué, aucun script de différence de schéma magique, aucun assistant et aucun script de clic droit-générer-impliqué. Il s'agit d'un processus 100% axé sur les développeurs, basé sur la source (scripts). Beaucoup trouvent tout ce processus complexe, mais cela fonctionne. En fait, en tant qu'utilisateur SQL Server, vous avez déjà tiré parti des résultats de ce processus dans votre utilisation quotidienne de SQL Server: SQL Server lui-même utilise un processus de mise à niveau de base de données très similaire et, comme vous vous en doutez probablement, le processus de développement de produits fait un usage intensif de ramification et le problème que vous avez mentionné est un problème très réel qui doit être résolu.
BTW, comment la ramification / intégration se produit réellement diffère entre les produits de contrôle de source, j'utilise les termes familiers du mode de fonctionnement d' intégration forcée .
la source
Bien que ma réponse ne soit pas aussi longue que celle de Remus, j'ai trouvé que c'était une très bonne solution. Je ne l'ai pas encore mis en production, donc YMMV *.
Liquibase
Il s'agit essentiellement d'un fichier XML dans lequel vous apportez des modifications de schéma à votre base de données en tant que nouveaux éléments dans le fichier XML. Par exemple:
Il a une syntaxe entièrement étoffée afin que vous puissiez faire à peu près tout ce que vous voulez dans votre base de données.
Vous spécifiez également dans votre installation Liquibase la base de données que vous souhaitez versionner. Ensuite, vous "exécutez" le .xml avec l'exécutable Java inclus (fichier jar). Cela recrée essentiellement les modifications spécifiées dans le XML dans votre base de données.
Le vrai truc, c'est que vous stockez ce fichier XML dans le même dossier versionné que votre code. Donc, dans mon cas, c'était Git. J'avais ce fichier XML dans mon dossier de projet (même niveau que /.git), puis chaque fois que je changeais de branche, le fichier XML passait à cette version de branche et j'exécutais le fichier .jar et ma base de données reflétait maintenant cette branche.
* Remarque: je n'ai pas terminé l'implémentation car j'ai eu du mal à connecter Java à SQL Server. A besoin de pilotes jdbc et autres et je n'étais pas d'humeur. Par conséquent, votre kilométrage peut varier.
la source
Chez Red Gate, nous publions bientôt une solution de gestion des versions de base de données qui exploite à la fois la comparaison SQL et le contrôle de source SQL. Cela utilise une approche de mise à niveau des scripts de migration et marque la base de données avec une propriété étendue de version qui correspond à une révision du contrôle de code source.
Nous espérons sortir à la mi-décembre. Un candidat à la sortie est disponible dès maintenant. Pour plus d'informations, visitez:
http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/migration
Nous espérons tirer parti de cette solution dans les mois à venir, alors faites-nous savoir ce que vous en pensez.
la source
Si vous et la gestion de vos modifications de schéma en générant des scripts et en gardant ces scripts sous contrôle de source, vous devriez être en mesure de traiter les modifications comme vous le feriez pour n'importe quel autre code. Vous pouvez choisir de fusionner automatiquement ou d'intervenir plus manuellement.
la source
Je suis dans une situation similaire où je travaille sur un site Web en direct et plusieurs branches de développement dans lesquelles je dois changer le schéma de la base de données.
Je l'ai résolu en écrivant un post-checkout et un hook post-fusion qui peuvent être bien utilisés avec git. Je stocke toutes mes migrations sous forme de fichiers SQL dans un répertoire séparé et les valide avec le code PHP modifié. Chaque fois que j'exécute un
ou un
git appellera automatiquement les migrations ascendantes et descendantes appropriées. Voir mon implémentation sur Github .
la source