Oggi abbiamo discusso delle tecniche di distribuzione del database, avendo avuto un paio di recenti errori nel nostro processo attuale e visto situazioni in cui vorremmo ripristinare una distribuzione, ma la vecchia versione dell'applicazione non era mai stata testata rispetto alla nuova versione del Banca dati.
Da un lato, ci sono distribuzioni in stile Migrazione, in cui hai un'istruzione version-up e un'istruzione version-down (che siano scritte in SQL o nella tua lingua dell'applicazione) e la tua app sa a quale versione deve arrivare.
Questi sono semplici e, poiché non eseguiremo il rollback spesso, gli sviluppatori sono appassionati di semplice. Tuttavia, ci sono dei rischi quando si aggiunge un campo / tabella e quel campo viene popolato prima del rollback. O peggio, dove si rilasciano dati rilevanti per la versione precedente.
D'altra parte, possiamo considerare un approccio di aggiornamento, rollback e rollforward in cui il rollback non è così drastico come con le migrazioni. Ad esempio, l'aggiornamento può aggiungere un campo non annullabile; il rollback lo rende nullable in modo che alla vecchia app non interessi; rollforward popola i campi null e li rende nuovamente non annullabili.
Ciò conserva i dati ma è complicato sia per il codice che per il test (purtroppo i nostri test di integrazione automatizzata sono praticamente inesistenti e, mentre lo stiamo correggendo, nel frattempo abbiamo un problema).
Ci sono modi sicuri per mitigare i problemi con questi? Ci sono altre opzioni che dovrei prendere in considerazione? Hai avuto brutte esperienze che vorresti condividere che mi possono salvare il dolore in seguito?