Eu tenho um aplicativo que possui um banco de dados e algumas versões do aplicativo apresentam alterações de esquema. Para facilitar a instalação (?), imaginei que desejaria criar uma metatabela que contém a versão atual do esquema e criar um único script que atualize o esquema de qualquer versão anterior para a versão atual.
Algo assim (pseudocódigo):
if (select v from version) = 1
create table newtable ...
update version set v = 2
end
if (select v from version) = 2
alter table newtable add column newcolumn ...
update newtable set newcolumn = ...
update version set v = 3
end
if (select v from version) = 3
...
end
...
Existem muitos problemas aqui.
A mistura de DDL e DML pode levar a problemas, como adicionar uma nova coluna e tentar atualizá-la no mesmo lote causará um erro de que a coluna não existe. Então pensei que deveria sempre separá-los em diferentes etapas, e cada etapa deveria ser um lote diferente. Obviamente, cada etapa de alteração terminará em um DML para alterar o número da versão, mas tudo bem. Deve haver transações dentro dos lotes DML e não vamos nos preocupar com os lotes DDL.
Também quero ter certeza de que, durante uma execução, apenas uma etapa seja executada, porque o tratamento de erros pode ser um pesadelo. Parar o script após uma etapa também não é trivial, nem no SSMS nem no SQLCMD. No meu exemplo acima, se começarmos na versão 1, ela será atualizada para a 2, depois para a 3, depois para a 4 etc. Então pensei em inverter a ordem das alterações. Primeiro vem a mudança de 3 para 4, depois de 2 para 3, depois de 1 para 2, desta forma, apenas uma etapa é executada por vez.
Isso parece bom? Há outras coisas a considerar?