Nous utilisons une solution très simple mais efficace.
Pour les nouvelles installations, nous avons un fichier metadata.sql dans le référentiel qui contient tout le schéma de base de données, puis dans le processus de construction, nous utilisons ce fichier pour générer la base de données.
Pour les mises à jour, nous ajoutons les mises à jour dans le logiciel codé en dur. Nous le gardons codé en dur parce que nous n'aimons pas résoudre les problèmes avant que ce ne soit vraiment un problème, et ce genre de chose ne s'est pas avéré être un problème jusqu'à présent.
Donc, dans notre logiciel, nous avons quelque chose comme ceci :
RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');
Ce code va vérifier si la base de données est en version 1 (qui est stockée dans une table créée automatiquement), si elle est obsolète, alors la commande est exécutée.
Pour mettre à jour metadata.sql dans le référentiel, nous exécutons ces mises à niveau localement, puis extrayons les métadonnées complètes de la base de données.
La seule chose qui arrive de temps en temps, c'est d'oublier de commiter metadata.sql, mais ce n'est pas un problème majeur car c'est facile à tester sur le processus de construction et aussi la seule chose qui pourrait arriver est de faire un nouvelle installation avec une base de données obsolète et mise à jour lors de la première utilisation.
De plus, nous ne prenons pas en charge les rétrogradations, mais c'est par conception, si quelque chose se brise sur une mise à jour, nous avons restauré la version précédente et corrigé la mise à jour avant de réessayer.