Pergunta

Eu quero configurar um mecanismo para controlar alterações de esquema DB, como o descrito em esta resposta :

Para cada alteração feita ao banco de dados, você escrever uma nova migração. Migrações têm tipicamente dois métodos: um "up" método em que as mudanças são aplicadas e um método "para baixo" no que as mudanças são desfeitas. Uma única comando traz o banco de dados até data, e também pode ser usado para trazer o banco de dados para uma versão específica do o esquema.

A minha pergunta é a seguinte: É cada comando DDL em um "up" reversível método? Em outras palavras, podemos sempre fornecer um método "para baixo"? Você pode imaginar qualquer comando DDL que não pode ser "para baixo" ed?

Por favor, não consideram o problema da migração de dados típico, onde durante o "up" método temos perda de dados: por exemplo, alterar um tipo de campo de datetime (DateOfBirth) para int (YearOfBirth) estamos a perder dados que não podem ser restaurados.

Foi útil?

Solução

no sql server cada comando DDL que eu conheço é um up / down par.

Outras dicas

Além de perda de dados, todas as migrações que já fiz é reversível. Dito isto, o Rails oferece uma maneira de marcar uma migração como "destrutiva":

Algumas transformações são destrutivos de uma maneira que não pode ser revertida. Migrações desse tipo deve levantar um ActiveRecord :: IrreversibleMigration exceção em seu método para baixo.

Veja a documentação da API aqui .

Sim, você já identificou casos em que você perde dados, seja transformando-o ou simplesmente deixar cair coluna no "up" migração.

Outro exemplo é que você pode deixar cair um objeto de seqüência, perdendo assim o seu estado. A migração "para baixo" seria recriar a seqüência, mas seria começar de novo em 1. Isso pode causar valores duplicados a ser gerada pela seqüência. Não é um problema se você estiver executando uma migração em um banco de dados vazio, e você quer que a seqüência para iniciar em 1 de qualquer maneira, mas se você tiver um número de linhas de dados, você iria querer a seqüência a ser redefinido para o maior valor atualmente em uso, o que é difícil de fazer de forma confiável, a menos que você tem um bloqueio exclusivo na tabela.

Qualquer outro DDL que é dependente do estado de dados no banco de dados tem problemas semelhantes. Isso provavelmente não é um bom design de esquema em primeiro lugar, eu só estou tentando pensar em todos os casos que se encaixam a sua pergunta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top