Hoje discutimos técnicas de implantação de banco de dados, tivemos algumas falhas recentes em nosso processo atual e vimos situações em que gostaríamos de reverter uma implantação, mas a versão antiga do aplicativo nunca havia sido testada em relação à nova versão do base de dados.
Por um lado, há implantações no estilo de migração, nas quais você tem uma instrução de versão para cima e uma versão para baixo (sejam elas escritas em SQL ou na linguagem do aplicativo) e seu aplicativo sabe qual versão precisa acessar.
Isso é simples e, como não reverteremos com frequência, os desenvolvedores estão interessados em simples. No entanto, há riscos ao adicionar um campo / tabela e esse campo é preenchido antes de você reverter. Ou pior, onde você solta dados relevantes para a versão anterior.
Por outro lado, podemos considerar uma abordagem de upgrade, reversão e rollforward em que a reversão não é tão drástica quanto nas migrações. Por exemplo, a atualização pode adicionar um campo não anulável; a reversão o torna anulável para que o aplicativo antigo não se importe; o rollforward preenche os campos nulos e o torna não anulável novamente.
Isso retém os dados, mas é complicado de codificar e testar (infelizmente, nossos testes de integração automatizados são praticamente inexistentes e, enquanto estamos corrigindo isso, temos um problema nesse meio tempo).
Existem maneiras seguras de mitigar os problemas com elas? Existem outras opções que devo considerar? Você já teve experiências ruins que gostaria de compartilhar e que podem me salvar depois?