Nous avons discuté des techniques de déploiement de base de données aujourd'hui, après avoir connu quelques échecs récents dans notre processus actuel et vu des situations où nous aimerions annuler un déploiement, mais l'ancienne version de l'application n'avait jamais été testée par rapport à la nouvelle version de la base de données.
D'une part, il existe des déploiements de style migration, où vous avez une instruction de version vers le haut et une instruction de version vers le bas (que celles-ci soient écrites en SQL ou dans le langage de votre application) et votre application sait à quelle version elle doit accéder.
Ce sont simples, et comme nous ne reviendrons pas souvent, les développeurs aiment le simple. Cependant, il existe des risques lorsque vous ajoutez un champ / table et que ce champ est rempli avant de revenir en arrière. Ou pire, où vous déposez des données pertinentes pour la version précédente.
D'un autre côté, nous pouvons envisager une approche de mise à niveau, de restauration et de restauration où la restauration n'est pas aussi drastique qu'avec les migrations. Par exemple, la mise à niveau peut ajouter un champ non nullable; la restauration la rend nulle pour que l'ancienne application s'en fiche; rollforward remplit les champs nuls et les rend à nouveau non nullables.
Cela conserve les données mais est compliqué à coder et à tester (malheureusement, nos tests d'intégration automatisés sont pratiquement inexistants et pendant que nous corrigeons cela, nous avons un problème entre-temps).
Existe-t-il des moyens sûrs d'atténuer les problèmes avec ces derniers? Y a-t-il d'autres options que je devrais envisager? Avez-vous eu de mauvaises expériences que vous aimeriez partager et qui pourraient me faire souffrir plus tard?