Banco de Dados Evolutivo – Parte 14

Esse é o último post da série Banco de Dados Evolutivo. Nessa etapa você irá migrar a base de dados de Produção para a versão 2 e aprenderá como executar o comando ROLLBACK <versão>.


Depois de ter desnormalizado a base de dados de Homologação da Adventure Works (veja o a Parte 13 do conjunto de posts da série) será necessário adicionar à tabela databasechangelog a nova versão do database.

Para isso, assim como já fora feito na versão 1.0 (veja a Parte 12) , será necessário criar um arquivo XML de nome changelog_2.xml que atribuirá à nova modificação de sistema a versão 2.0 – use o código da Listagem 1.

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
		http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext 
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

<changeSet author="arthur" id="tagDatabase-versao_2.0">
    <tagDatabase tag="versao_2.0"/>
</changeSet>

</databaseChangeLog>

Listagem 1. Comando usado para criação do arquivo changelog_2.xml que adicionará à tabela databasechangeset a versão 2 do sistema da Adventure Works.

Altere também o arquivo master_2.0.xml para que seja possível a execução da nova refatoração através do código da Listagem 2.

<databaseChangeLog
       xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
       xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
       http://www.liquibase.org/xml/ns/dbchangelog-ext 
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

<include file="C:/changelog/versao_2.0/changelog_1.xml" />
<include file="C:/changelog/versao_2.0/changelog_2.xml" />

</databaseChangeLog> 

Listagem 2. Comando usado dentro do arquivo XML master_2.0.xml.

Como você já deve estar familiarizado, abra o cmd e, a partir da pasta raiz de sistema, execute o update na base de homologação através do Liquibase usando o código da Listagem 3.

java -jar C:\liquibase-3.0.8-bin\liquibase.jar --defaultsFile=C:\liquibase-3.0.8-bin\liquibaseHomolog.properties update

Listagem 3. Comando usado no cmd para execução do comando UPDATE através do Liquibase em ambiente de Homologação.

Caso seja executado um SELECT na tabela de controle databasechangelog, será possível observar que a base de Homologação já se encontra em sua segunda versão conforme a Figura 1.

Figura 1. Resultado do SELECT executado na tabela databasechangelog após a adição da versão 2.
Figura 1. Retorno do SELECT na tabela databasechangelog após adição da versão 2.

Atualizando a Base de Dados de Produção – Versão 2

Nesse momento, depois de testada a ultima alteração em ambiente de homologação, será necessário atualizar a base de Produção para a ultima versão desenvolvida. Para isso, utilize o comando da Listagem 4.

java -jar C:\liquibase-3.0.8-bin\liquibase.jar --defaultsFile=C:\liquibase-3.0.8-bin\liquibaseProd.properties update

Listagem 4. Comando usado no cmd para execução do comando UPDATE através do Liquibase em ambiente de Produção.

Caso seja executado um SELECT na tabela databasechangelog em ambiente de Produção você verá que, assim como em Homologação, o sistema encontra-se na Versão 2.

O Comando Rollback <versão>

Nesse momento suponha o seguinte: Por algum motivo, será necessário que o sistema volte a ser normalizado contendo novamente os dados de tipo de telefone na tabela Person.PhoneNumberType. Dessa forma será necessário que voltemos o Banco para a Versão anterior, a versão 1, logo, esta contêm a estrutura DDL e DML anterior do banco.

Para que isso seja possível precisaremos executar um comando muito simples. Passaremos os parâmetros de conexão do Banco de Produção seguido do comando rollback <versao>.

O Liquibase irá até a tabela databasechangelog e verá quais as refatorações que não estão contidas na versão fornecida como parâmetro e executará o Rollback de todas elas. Porém é necessário lembrar do que foi mencionado na Parte 13 do conjunto de posts. Se a refatoração usada não possuir Auto Rollback, é preciso que você adicione a tag <rollback> … </rollback> e crie a refatoriação contrária. Caso contrário, não será possível desfazer o que está feito na versão atual.

Execute o comando da Listagem 5 para execução do Rollback <versao>.

java -jar C:/liquibase-3.0.8-bin/liquibase.jar --defaultsFile=C:/liquibase-3.0.8-bin/liquibaseProd.properties rollback versao_1.0

Listagem 5. Comando usado no cmd para execução do comando ROLLBACK <versão>. Através é possível retroceder até uma versão anterior desejada.

Conforme já vimos na primeira refatoração que executamos (veja a Parte 7 do conjunto de posts), é necessário que o arquivo XML que contenha a refatoração desfeita seja retirado do arquivo pai da versão (nesse caso o arquivo master_2.0.xml). Caso contrário a refatoração será reexecutada quando uma nova mudança for inserida.


Conclusão

O Liquibase é uma poderosa ferramenta de versionamento de Banco de Dados. Ela não se resume somente a isso que foi exposto nessa série de 14 posts. Esse foi somente um simples overview do que é possível fazer através dela (para mais informações consulte a documentação oficial da ferramenta).

Adaptando as técnicas citadas nos Partes 01, 02, 03 e 04 ao seu negócio e usando corretamente o Liquibase como fora ensinado da etapa 05 à 14 dos posts será possível gerenciar o versionamento de qualquer banco de dados, em qualquer ambiente, facilitando, dessa forma, o controle de versão de seu sistema como um todo.

15 comentários sobre “Banco de Dados Evolutivo – Parte 14

  1. Roberto

    Arthur,

    Muito obrigado por todo o conteúdo oferecido, consegui sem problemas vir até o ultimo poste, já até fazendo as adaptações nos diretórios e xml para as estruturas que já possuo aqui. A melhor parte é que estou desenvolvendo um pequeno projeto juntamente com os desenvolvedores aqui pra fazer uma interface do liquibase =D mais é muito simples e muito especifico sobre o que estou precisando aqui.
    Por fim gostaria de pedir encarecidamente que esse não seja o ultimo poste e que se possível ainda demostre como usar a tag SQL FILE que realmente estou precisando e não entendi direito o exemplo do xml na site da documentação do liquibase.

    XML
    (esse eu entendo =D)
    (não entendi)

    Se puder me ajudar com esse ultimo ficarei muito grato.

    Curtido por 1 pessoa

  2. Roberto, tenha uma ótima tarde. Tudo bem?

    Fico muito feliz mesmo de saber que o conteúdo demonstrado foi útil e te ajudou de alguma forma.

    Quanto ao novo post (o que chamarei de Banco de Dados Evolutivo – Parte 15) o farei conforme você pediu.

    Até a Segunda feira da próxima semana o farei. 🙂

    Espero que aprecie. Grande abraço!

    Curtir

  3. Roberto

    Poxa tô tentando aqui usar o SQL File mais não sei usar o TAG se podia me passar uma cola de como fica o xml entre as TAGs changeSet pra ver se eu saiu do outro lado rsrsrsrs

    Mais lembrando que isso não deve anular em hipótese alguma a parte 15 kkkkk

    Curtido por 1 pessoa

  4. Roberto

    Um pequeno conhecimento que quero compartilhar que talvez possa incrementar ou ajudar no seu post.

    na tag sqlFile tem o comando (encoding=”UTF-16LE) e o (encoding=”UTF-8). Pelo que entendi o padrão é o (encoding=”UTF-8) que acredito ser o padrão americano sem acentos ou outros caracteres reservados ao nosso padrão e o (encoding=”UTF-16LE) que possui suporte a tudo que precisamos. Isso conseguiu me trazer um certo atraso na composição dos meus XMLs até entender pq eu tinha q usar um ou outro dependendo do script no caso de insert que possui string ele se faz bastante necessário (encoding=”UTF-16LE).
    Se não for pedir muito gostaria que comentasse sobre essa configuração do seu post e peço desculpas se estiver falando alguma bobagem.

    Curtir

  5. Roberto, ótimo dia!

    Desculpe a demora para responder o ultimo comentário, mas é que essa semana que se passou foi tremendamente corrida. 🙂

    Bom, vamos ao que interessa!

    Só iria postar sobre essa tag por pedido teu, porém, como você já conseguiu usá-la, creio que não é mais necessário.

    Quanto ao que você disse mais acima, não achei muitas coisas a respeito desse assunto, mas posso afirmar que esse parâmetro encoding não está relacionado à collation do banco de dados ou database.

    Provavelmente, está relacionado ao nome do arquivo passado como parâmetro.

    Quanto à diferença entre o UTF-8 e o UTF-16 pesquisei (também não tinha essa informação) e achei o seguinte:

    “UTF-8 tem uma vantagem caso os caracteres mais prevalentes sejam ASCII. Nesse caso, a maioria dos personagens ocupam somente um byte cada.

    UTF-16 é melhor onde ASCII não é predominante pois ele usa dois bytes por caractere. UTF-8 vai começar a usar três ou mais bytes para os caracteres de ordem superior, onde UTF-16 mantém-se em apenas 2 a maior parte do tempo.”

    Espero ter ajudado!

    Qualquer dúvida continuo a disposição! 😀

    Curtir

  6. Roberto

    Muito obrigado por essas informações entretanto usando o liquibase o cmd reportava esses erros esperava encontrar UTF-8 ou UTF-16, acho q ainda não sei o motivo então pelo qual ele pedi ou pedi outro.
    Outro ponto muito importante agora que realmente preciso de ajuda é com alguns erros genéricos que não sei identificar se são do jdbc ou do próprio liquibase.
    No meu caso estou passando o script para alteração de uma SP, inclusive já consegui alterá la com outros scripts anteriores, porem no último que estou alterando ele lança um erro muito difícil de compreender. Enche a tela de ‘?’ e no fim informar Incorrect syntax near ‘0x2d2d’
    Estou procurando resultados para esse erro porem sem sucesso até o momento.

    Curtido por 1 pessoa

    1. Roberto, ótimo dia!

      Obrigado pelo retorno do comentário anterior.

      Quanto a esse erro, por favor, verifique se você não esqueceu de fechar as tags XML changeSet e databaseChangeLog no final dos scripts! 😀

      Peço que sempre que encontrar algum problema ou solução de alguma coisa, compartilhe. Será sempre um grande prazer ajudar ou aprender com você! 🙂

      Curtir

Deixe um comentário