Introdução ao Liquibase Rollback
1. Visão geral
Em nossoprevious article, mostramos Liquibase como uma ferramenta para gerenciar dados e esquemas de banco de dados.
Neste artigo, vamos olhar mais para o recurso de reversão - e como podemos desfazer uma operação Liquibase.
Naturalmente, esse é um recurso crítico de qualquer sistema de nível de produção.
2. Categorias de migrações Liquibase
Existem duas categorias de operações Liquibase, resultando em uma geração diferente de uma declaração de reversão:
-
automatic, onde a migração pode gerar deterministicamente as etapas necessárias para o rollback
-
manual, onde precisamos emitir um comando de rollback porque a instrução de migração não pode ser usada para identificar a instrução de forma determinística
Por exemplo,the rollback of a “create table” statement would be to “drop” the created table. Isso pode ser determinado sem dúvida e, portanto, a instrução de reversão pode ser gerada automaticamente.
Por outro lado,the rollback statement for a “drop table” command is not possible to be determined. Não é possível determinar o último estado da tabela e, portanto, a instrução de rollback não pode ser gerada automaticamente. These types of migration statements require a manual rollback instructions.
3. Escrevendo uma instrução de reversão simples
Vamos escrever um changeset simples que criará uma tabela quando executado e adicionará uma instrução de rollback ao changeset:
O exemplo acima se enquadra na primeira categoria mencionada acima. Ele criará uma instrução de reversão automaticamente se não adicionarmos uma. Mas podemos substituir o comportamento padrão criando nossa declaração de reversão.
Podemos executar a migração usando o comando:
mvn liquibase:update
Após a execução, podemos reverter a ação usando:
mvn liquibase:rollback
Isso executa o segmento de reversão do conjunto de alterações e deve reverter a tarefa concluída durante o estágio de atualização. Mas se emitirmos esse comando sozinhos, a construção falhará.
A razão para isso é - não especificamos o limite de reversão; o banco de dados será completamente eliminado, revertendo para o estágio inicial. Portanto, é obrigatório definir uma das três restrições abaixo para limitar a operação de reversão quando a condição for satisfeita:
-
rollbackTag
-
rollbackCount
-
rollbackDate
3.1. Revertendo para uma tag
Podemos definir um estado específico do nosso banco de dados como uma tag. Portanto, podemos fazer referência a esse estado. Reverter para o nome da tag "1.0" se parece com:
mvn liquibase:rollback -Dliquibase.rollbackTag=1.0
Isso executa instruções de reversão de todos os conjuntos de alterações executados após a tag "1.0".
3.2. Revertendo por contagem
Aqui, definimos quantos conjuntos de alterações precisamos ser revertidos. Se definirmos como um, a última execução do conjunto de alterações será revertida:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
3.3. Revertendo à Data
Como podemos definir um destino de reversão como uma data, portanto, qualquer conjunto de alterações executado após esse dia será revertido:
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
O formato de data deve ser um formato de dados ISO ou deve corresponder ao valor deDateFormat.getDateInstance() da plataforma de execução.
4. Opções de Rollback Changeset
Vamos explorar quais são os possíveis usos da instrução rollback em changesets.
4.1. Reversão de várias instruções
Uma única tag de reversão pode incluir mais de uma instrução a ser executada:
Aqui deixamos cair duas tabelas na mesma tag de reversão. Também podemos dividir a tarefa em várias instruções.
4.2. Várias tags de reversão
Em um changeset, podemos ter mais de uma tag de reversão. Eles são executados na ordem de aparência no changeset:
4.3. Consulte outro conjunto de alterações para reversão
Podemos nos referir a outro conjunto de alterações, possivelmente o conjunto de alterações original, se quisermos alterar alguns detalhes do banco de dados. Isso reduzirá a duplicação de código e poderá reverter corretamente as alterações feitas:
4.4. Tag de rollback vazia
Por padrão, o Liquibase tenta gerar um script de reversão, se não tivermos fornecido. Se precisarmos quebrar esse recurso, podemos ter uma tag de reversão vazia para que a operação de reversão não seja revertida:
5. Opções de comando de reversão
Além de reverter um banco de dados para um estado anterior, o Liquibase pode ser usado de várias maneiras diferentes. Ou seja, gerar o SQL de reversão, criar script de reversão futura e, finalmente, podemos testar a migração e a reversão, ambas em uma única etapa.
5.1. Gerar script de reversão
Assim como a reversão, temos três opções em mãos para gerar a reversão SQL. Esses são:
-
rollbackSQL<tag> - um script para reverter o banco de dados para a tag mencionada
-
rollbackToDateSQL<date/time> - um script SQL para reverter o banco de dados para o estado na data / hora mencionada
-
rollbackCountSQL<value> - um script SQL para reverter o banco de dados para o estado mencionado pelo número de etapas anteriores
Vejamos um dos exemplos em ação:
mvn liquibase:rollbackCountSQL 2
5.2. Gerar script de reversão futura
Este comando gera os comandos SQL de reversão necessários para trazer o banco de dados ao estado atual a partir do estado, no qual os conjuntos de alterações elegíveis para execução no momento foram concluídos. Isso será muito útil se houver a necessidade de fornecer um script de reversão para uma alteração que estamos prestes a executar:
Isso será muito útil se houver a necessidade de fornecer um script de reversão para uma alteração que estamos prestes a executar:
mvn liquibase:futureRollbackSQL
5.3. Executar atualização de teste de reversão
Este comando executa a atualização do banco de dados e, em seguida, reverte os conjuntos de alterações para trazer o banco de dados ao estado atual. A reversão futura e a reversão de teste de atualização não alteram o banco de dados atual após a conclusão da execução. Mas a reversão de teste de atualização executa a migração real e depois a reverte.
Isso pode ser usado para testar a execução de alterações de atualização sem alterar permanentemente o banco de dados:
mvn liquibase:updateTestingRollback
6. Conclusão
Neste tutorial rápido, exploramos alguns recursos de linha de comando e conjunto de alterações da funcionalidade de reversão do Liquibase.
Como sempre, o código-fonte pode ser encontradoover on GitHub.