Il y a eu une discussion sur le wiki de la communauté SO pour savoir si les objets de base de données doivent être contrôlés par version. Cependant, je n'ai pas vu beaucoup de discussions sur les meilleures pratiques pour créer un processus d'automatisation de construction pour les objets de base de données.
Cela a été un point de discussion controversé pour mon équipe - d'autant plus que les développeurs et les administrateurs de bases de données ont souvent des objectifs, des approches et des préoccupations différents lors de l'évaluation des avantages et des risques d'une approche d'automatisation du déploiement de bases de données.
J'aimerais entendre quelques idées de la communauté SO sur les pratiques qui ont été efficaces dans le monde réel.
Je me rends compte qu'il est quelque peu subjectif de savoir quelles pratiques sont vraiment les meilleures, mais je pense qu'un bon dialogue sur le travail pourrait être utile à de nombreuses personnes.
Voici quelques-unes de mes questions teaser sur les sujets de préoccupation de ce sujet. Celles-ci ne sont pas censées être une liste définitive - mais plutôt un point de départ pour aider les gens à comprendre ce que je recherche.
- Les environnements de test et de production doivent-ils être créés à partir du contrôle de code source?
- Les deux devraient-ils être construits à l'aide de l'automatisation - ou la production devrait-elle être construite en copiant des objets à partir d'un environnement de test stable et finalisé?
- Comment gérez-vous les différences potentielles entre les environnements de test et de production dans les scripts de déploiement?
- Comment testez-vous que les scripts de déploiement fonctionneront aussi efficacement en production qu'en test?
- Quels types d'objets doivent être contrôlés par version?
- Juste du code (procédures, packages, déclencheurs, java, etc.)?
- Index?
- Contraintes?
- Définitions de table?
- Scripts de changement de table? (par exemple, scripts ALTER)
- Tout?
- Quels types d'objets ne doivent pas être contrôlés par version?
- Des séquences?
- Des subventions?
- Comptes utilisateur?
- Comment les objets de base de données doivent-ils être organisés dans votre référentiel SCM?
- Comment gérez-vous des choses ponctuelles comme les scripts de conversion ou les scripts ALTER?
- Comment gérez-vous la suppression d'objets de la base de données?
- Qui devrait être responsable de la promotion des objets du développement au niveau de test?
- Comment coordonnez-vous les changements de plusieurs développeurs?
- Comment gérez-vous le branchement des objets de base de données utilisés par plusieurs systèmes?
- Quelles exceptions, le cas échéant, peuvent être raisonnablement faites à ce processus?
- Problèmes de sécurité?
- Données avec des problèmes de désidentification?
- Des scripts qui ne peuvent pas être entièrement automatisés?
- Comment pouvez-vous rendre le processus résilient et exécutoire?
- À l'erreur du développeur?
- À des problèmes environnementaux inattendus?
- Pour la reprise après sinistre?
- Comment convaincre les décideurs que les avantages de DB-SCM justifient vraiment le coût?
- Preuves anecdotiques?
- Recherche industrielle?
- Recommandations de bonnes pratiques de l'industrie?
- Faire appel aux autorités reconnues?
- L'analyse coûts-avantages?
- Qui devrait «posséder» les objets de base de données dans ce modèle?
- Développeurs?
- DBA?
- Analystes de données?
- Plus d'un?
Réponses:
Voici quelques réponses à vos questions:
la source
Je traite le SQL comme un code source lorsque cela est possible
Si je peux l'écrire dans le SQL conforme à la norme, il va généralement dans un fichier de mon contrôle de source. Le fichier définira autant que possible comme les SP, les instructions Table CREATE.
J'inclus également des données factices pour les tests dans le contrôle de code source:
Et puis je résume toutes mes requêtes SQL afin de pouvoir construire l'ensemble du projet pour MySQL, Oracle, MSSQL ou autre.
L'automatisation de la construction et des tests utilise ces scripts de construction car ils sont aussi importants que la source de l'application et teste tout, de l'intégrité aux déclencheurs, aux procédures et à la journalisation.
la source
Nous utilisons l'intégration continue via TeamCity. À chaque enregistrement dans le contrôle de code source, la base de données et toutes les données de test sont reconstruites à partir de zéro, puis le code, puis les tests unitaires sont exécutés par rapport au code. Si vous utilisez un outil de génération de code tel que CodeSmith, il peut également être placé dans votre processus de construction pour générer votre couche d'accès aux données à chaque construction, en vous assurant que toutes vos couches «correspondent» et ne produisent pas d'erreurs dues à paramètres SP incompatibles ou colonnes manquantes.
Chaque build possède sa propre collection de scripts SQL qui sont stockés dans le répertoire $ project \ SQL \ du contrôle de code source, affectés d'un préfixe numérique et exécutés dans l'ordre. De cette façon, nous pratiquons notre procédure de déploiement à chaque build.
En fonction de la table de recherche, la plupart de nos valeurs de recherche sont également stockées dans des scripts et exécutées pour s'assurer que les données de configuration correspondent à ce que nous attendons, par exemple "reason_codes" ou "country_codes". De cette façon, nous pouvons modifier les données de recherche dans le développement, les tester, puis les «promouvoir» via le contrôle qualité et la production, au lieu d'utiliser un outil pour modifier les valeurs de recherche en production, ce qui peut être dangereux pour la disponibilité.
Nous créons également un ensemble de scripts "rollback" qui annulent les modifications de notre base de données, au cas où une construction en production deviendrait fausse. Vous pouvez tester les scripts de restauration en les exécutant, puis en réexécutant les tests unitaires pour la version build one inférieure à la vôtre, après l'exécution de ses scripts de déploiement.
la source
+1 pour Liquibase : LiquiBase est une bibliothèque open source (LGPL) indépendante de la base de données pour le suivi, la gestion et l'application des modifications de base de données. Il est construit sur une prémisse simple: toutes les modifications de la base de données (structure et données) sont stockées de manière descriptive XML et archivées dans le contrôle de code source. Le bon point, que les modifications DML sont stockées sémantiquement, pas seulement diff, afin que vous puissiez suivre l'objectif des modifications.
Il pourrait être combiné avec le contrôle de version GIT pour une meilleure interaction. Je vais configurer notre environnement dev-prod pour l'essayer.
Vous pouvez également utiliser Maven, les systèmes de construction Ant pour créer du code de production à partir de scripts.
Le moins est que LiquiBase ne s'intègre pas dans les IDE SQL répandus et que vous devez effectuer vous-même les opérations de base.
En plus de cela, vous pouvez utiliser DBUnit pour les tests DB - cet outil permet d'utiliser des scripts de génération de données pour tester votre environnement de production avec un nettoyage ultérieur.
A MON HUMBLE AVIS:
Nous avons fait face à tous les problèmes mentionnés avec les changements de code, la fusion, la réécriture dans notre base de données de production de facturation. Ce sujet est idéal pour découvrir tout cela.
la source
En posant des "questions teaser", vous semblez être plus intéressé par une discussion que l'opinion de quelqu'un sur les réponses finales. La liste de diffusion active (> 2500 membres) agileDatabases a répondu à bon nombre de ces questions et constitue, d'après mon expérience, un forum sophistiqué et civil pour ce type de discussion.
la source
Je suis fondamentalement d'accord avec chaque réponse donnée par van . Pour plus de perspicacité, ma base de référence pour la gestion de base de données est la série K. Scott Allen (une lecture incontournable , à mon humble avis. Et l'opinion de Jeff aussi semble-t-il).
Create.sql
. Cela peut inclure l' insertion de données statiques (listes ...).Create.sql
:Create.cmd
. Son objectif est principalement de vérifier les pré-requis (outils, variables d'environnement ...) et d'envoyer des paramètres au script SQL. Il peut également charger en masse des données statiques à partir de fichiers CSV pour des problèmes de performances.Create.cmd
fichier.À mon humble avis, le chargement dynamique des données devrait nécessiter une autre étape, en fonction de votre environnement. Les développeurs voudront charger leur base de données avec des données de test, des fichiers indésirables ou aucune donnée, tandis qu'à l'autre extrémité, les responsables de la production voudront charger les données de production. J'envisagerais également de stocker les données de test dans le contrôle de source (pour faciliter les tests unitaires, par exemple).
Une fois la première version de la base de données mise en production, vous aurez besoin non seulement de scripts de construction (principalement pour les développeurs), mais également de scripts de mise à niveau (basés sur les mêmes principes):
Upgrade.sql
fichier (qui peut en appeler d'autres) qui permet de mettre à niveau la version N-1 vers la version N (N étant la version en cours de publication). Je stocke ce script dans un dossier nomméN-1
.Upgrade.cmd
. Il peut récupérer la version actuelle (CV) de la base de données via une simple instruction SELECT, lancer leUpgrade.sql
script stocké sous leCV
dossier et effectuer une boucle jusqu'à ce qu'aucun dossier ne soit trouvé. De cette façon, vous pouvez automatiquement passer de, disons, N-3 à N.Les problèmes avec ceci sont:
Quant à quel type d'objets de base de données voulez-vous avoir sous contrôle de code source? Eh bien, je dirais autant que possible, mais pas plus ;-) Si vous voulez créer des utilisateurs avec des mots de passe, obtenez-leur un mot de passe par défaut (login / login, pratique pour les tests unitaires), et faites du changement de mot de passe une opération manuelle . Cela se produit souvent avec Oracle où les schémas sont également des utilisateurs ...
la source
Nous avons notre projet Silverlight avec la base de données MSSQL dans le contrôle de version Git. Le moyen le plus simple est de vous assurer que vous avez une base de données allégée (en termes de contenu) et de faire un vidage complet à partir de Visual Studio. Ensuite, vous pouvez faire 'sqlcmd' à partir de votre script de construction pour recréer la base de données sur chaque machine de développement.
Pour le déploiement, cela n'est pas possible car les bases de données sont trop volumineuses: c'est la raison principale pour les avoir dans une base de données en premier lieu.
la source
Je crois fermement qu'une base de données doit faire partie du contrôle de code source et, dans une large mesure, du processus de construction. S'il s'agit du contrôle de code source, j'ai les mêmes protections de codage lors de l'écriture d'une procédure stockée en SQL que lors de l'écriture d'une classe en C #. Je fais cela en incluant un répertoire de scripts DB sous mon arborescence source. Ce répertoire de script n'a pas nécessairement un fichier pour un objet dans la base de données. Ce serait une douleur dans le cul! Je développe dans ma base de données juste comme je le ferais dans mon projet de code. Ensuite, lorsque je suis prêt à m'enregistrer, je fais une différence entre la dernière version de ma base de données et celle sur laquelle je travaille. J'utilise SQL Compare pour cela et il génère un script de toutes les modifications. Ce script est ensuite enregistré dans mon répertoire db_update avec une convention de dénomination spécifique 1234_TasksCompletedInThisIteration où le numéro est le numéro suivant dans l'ensemble de scripts déjà présents, et le nom décrit ce qui est fait lors de cet archivage. Je fais de cette façon car comme une partie de mon processus de construction, je commence avec une nouvelle base de données qui est ensuite construite par programme en utilisant les scripts de ce répertoire. J'ai écrit une tâche NAnt personnalisée qui itère à travers chaque script en exécutant son contenu sur la base de données nue. Évidemment, si j'ai besoin de certaines données pour entrer dans la base de données, j'ai également des scripts d'insertion de données. Cela présente également de nombreux avantages. Premièrement, toutes mes affaires sont versionnées. Deuxièmement, chaque version est une nouvelle version, ce qui signifie qu'il n'y aura pas de trucs sournois dans mon processus de développement (comme des données sales qui causent des bizarreries dans le système). Troisièmement, lorsqu'un nouveau membre est ajouté à l'équipe de développement, il doit simplement être informé des dernières mises à jour et son développeur local est conçu pour lui à la volée. Quatre, je peux exécuter des cas de test (je ne l'ai pas appelé un «test unitaire»!) Sur ma base de données car l'état de la base de données est réinitialisé à chaque build (ce qui signifie que je peux tester mes référentiels sans me soucier d'ajouter des données de test au db).
Ce n'est pas pour tout le monde.
Ce n'est pas pour tous les projets. Je travaille généralement sur des projets de champs verts ce qui me permet cette commodité!
la source
Plutôt que d'entrer dans les arguments de la tour blanche, voici une solution qui a très bien fonctionné pour moi sur les problèmes du monde réel.
Construire une base de données à partir de zéro peut se résumer à la gestion de scripts SQL.
DBdeploy est un outil qui vérifie l'état actuel d'une base de données - par exemple, quels scripts ont été précédemment exécutés sur elle, quels scripts sont disponibles pour être exécutés et par conséquent quels scripts doivent être exécutés.
Il rassemblera ensuite tous les scripts nécessaires et les exécutera. Il enregistre ensuite les scripts exécutés.
Ce n'est pas l'outil le plus joli ni le plus complexe, mais avec une gestion minutieuse, il peut très bien fonctionner. C'est open source et facilement extensible. Une fois que l'exécution des scripts est bien gérée, il est facile d'ajouter des composants supplémentaires tels qu'un script shell qui extrait les derniers scripts et exécute dbdeploy sur une instance particulière.
Voir une bonne introduction ici:
http://code.google.com/p/dbdeploy/wiki/GettingStarted
la source
Vous constaterez peut-être que Liquibase gère une grande partie de ce que vous recherchez.
la source
Chaque développeur doit avoir sa propre base de données locale et utiliser le contrôle du code source pour publier dans l'équipe. Ma solution est ici: http://dbsourcetools.codeplex.com/ Amusez-vous bien, - Nathan
la source