Banco de Dados Evolutivo – Parte 12

Nesse post da série Banco de Dados Evolutivo, você aprenderá como versionar a sua base de dados para dessa forma conseguir evoluir o seu database de Produção por versões (não como tem feito em Homologação – por changesets). Paralelo a isso, aprenderá também como executar o comando DIFF database através da ferramenta de versionamento de banco de dados Liquibase.


no post anterior (Parte 11) você finalizou a primeira versão do banco de dados da Adventure Works.

Para que seja possível uma fácil identificação das refatorações correspondentes a cada versão, dentro da tabela de controle databasechangelog existe uma coluna chamada tag. Dentro dessa coluna você deverá assinalar no registro da última alteração realizada a que versão o conjunto de mudanças pertence.

Podemos adicionar a tag de versão de três formas:

  1. Fazendo um UPDATE manual na tabela databasechangelog;
  2. Usando o comando tag ‘<Nome da Versão>’ via linha de comando (veja mais sobre esse comando dentre outros aqui);
  3. Usar um arquivo XML com uma refatoração de denominada tagDatabase;

A forma que irei demonstrar neste post será através do arquivo XML. Dessa forma, reduzimos ao máximo a intervenção humana ao nosso fluxo alterações.

Utilize o comando da Listagem 1 para criação do XML com a refatoração de adição da tag com a versão da base de dados denominada changelog_5.xml.

 <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_1.0">
     <tagDatabase tag="versao_1.0"/>
 </changeSet>

 </databaseChangeLog>
 

Listagem 1. Comando usado para criação do arquivo changelog_5.xml que adicionará à tabela databasechangeset a versão do conjunto de alterações.

Utilize o comando da Listagem 2 dentro do arquivo master_1.0.xml (como você já deve estar se habituando a fazer).

<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_1.0/changelog_2.xml" />
<include file="C:/changelog/versao_1.0/changelog_3.xml" />
<include file="C:/changelog/versao_1.0/changelog_4.xml" />
<include file="C:/changelog/versao_1.0/changelog_5.xml" />

</databaseChangeLog>
 

Listagem 2. Comando usado dentro do arquivo master_1.0.xml para que seja possível a adição da versão da base de dados de homologação.

Depois de de você ter feito todas essas alterações em homologação está na hora do sistema de produção da Adventure Works receber as modificações e passar a usá-las. Para que seja possível usar a ferramenta de versionamento de banco de dados Liquibase no ambiente de produção é necessário que, assim como fizemos um arquivo liquibaseHomolog.properties para o banco de homologação, façamos um outro chamado liquibaseProd.properties com todas as informações para que o Liquibase possa se conectar à base de produção. Segue o código de criação na Listagem 3.

driver: com.microsoft.sqlserver.jdbc.SQLServerDriver 
classpath: C:/liquibase-3.0.8-bin/sqljdbc4.jar 
url: jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks_Prod 
username: 
password: 
changeLogFile: C:/changelog/master.xml

Listagem 3. Comando usado para criar o arquivo liquibaseProd.properties. Salve-o no diretório C:\liquibase-3.0.8-bin\ junto ao outro arquivo properties para a base de Homologação.

Agora que você possui livre acesso ao banco de dados de Produção através do Liquibase, veja abaixo as duas formas de commitar as alterações executadas em ambiente de Homologação no ambiente de Produção.

O Comando DIFF Database

O comando DIFF da ferramento Liquibase consiste em analisar a estrutura DDL de dois bancos de dados e identificar as diferenças de entre ambas as bases (Veja a Parte 4 do conjunto de posts).

Para que seja possível usar e executar um DIFF entre duas bases será preciso tanto especificar os dados da base de referência (base a qual o Liquibase usará de parâmetro para gerar o arquivo XML de refatorações) quanto o diretório e arquivo onde guardaremos essas alterações. Segue o comando que comparará as bases na Listagem 4.

java -jar C:/liquibase-3.0.8-bin/liquibase.jar --driver=com.microsoft.sqlserver.jdbc.SQLServerDriver --classpath=C:/liquibase-3.0.8-bin/sqljdbc4.jar --url=jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks_Prod --defaultSchemaName=Person --username= --password= --changeLogFile=C:/changelog/diff_Prod-Homolog.xml diffChangeLog --referenceUrl=jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks_Homolog --referenceUsername= --referencePassword=

Listagem 4. Comando usado para gerar um DIFF entre as bases de Produção e Homologação da Adventure Works.

Observe que você não usará ainda o arquivo liquibaseProd.properties, logo, dentro dele passamos como parâmetro o arquivo master.xml. Caso você apontasse o arquivo de configuração, o Liquibase salvaria o XML de refatorações dentro do arquivo master.xml.

Fora usado o parâmetro –defaultSchemaName para dizer ao Liquibase que schema da base de dados ele precisa verificar. Se você não o usasse, a ferramenta iria buscar as alterações no Schema Default do Database (nesse caso, o schema dbo).

Observe também que o comando usado pra o DIFF entre as bases é o diffChangeLog.

Se aberto o arquivo gerado, teremos o código conforme da Listagem 5.

 <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="arthurluz (generated)" id="1437256942611-1">
        <addColumn tableName="Person">
            <column name="Cpf" type="varchar(11)">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet author="arthurluz (generated)" id="1437256942611-2">
        <addColumn tableName="Person">
            <column name="FullName" type="varchar(255)"/>
        </addColumn>
    </changeSet>

    <changeSet author="arthurluz (generated)" id="1437256942611-3">
        <dropColumn columnName="FirstName" tableName="Person"/>
    </changeSet>

    <changeSet author="arthurluz (generated)" id="1437256942611-4">
        <dropColumn columnName="LastName" tableName="Person"/>
    </changeSet>

</databaseChangeLog>

Figura 7. Comando do arquivo diff_Prod-Homolog.xml gerado através do comando diffChangeLog.

Se lido e verificado com bastante atenção o arquivo XML que foi gerado através do comando diffChangeLog será possível observar um grande problema. Ele não entende o merge columns que fora feito. Ao contrario, está solicitando a exclusão das colunas FirstName e LastName (claro, se o fizer estará excluido os dados também) e adicionando a coluna FullName.

Existe uma falha fundamental com o comando DIFF. Apesar de fazer um bom trabalho mostrando as diferenças estruturais, ele não entende a semântica das mudanças.

Por exemplo, se você renomear uma coluna de “nome” para “descricao”, o comando diff irá mostrar que há uma coluna “nome” que precisa ser eliminada e uma coluna “descricao” precisa ser adicionada. Se você seguir esta sugestão, você terá uma base de dados correta a nível de DDL, mas você irá perder todos os valiosos dados.

Por esse motivo, o aconselhamento é que o comando DIFF seja usado muito pouco e com muito cuidado. Veremos a seguir a outra maneira (a forma mais indicada) para commitar em produção as alterações que já foram executadas em homologação.

Gravando em Produção as primeiras refatorações – Continuação

De uma forma bem simples use o comando da Listagem 6 para executar em Produção todas as refatorações que foram criadas, executadas e testadas em ambiente de homologação.

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

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

Observe que o comando criou na base de dados de Produção da Adventure Works as tabelas de controle databasechangelog e databasechangeloglock.

Caso seja feito um SELECT na tabela databasechangelog em ambiente de Produção será possível observar que todas as refatorações que foram estão em Homologação agora também fazem parte do ambiente de Produção conforme a Figura 1.

Captura de Tela 2015-07-18 às 18.57.08
Figura 1. retorno do SELECT executado na tabela de controle databasechangelog na base de Produção.

No próximo post da série Banco de Dados Evolutivo veremos como executar modificações maiores e mais robustas através da bundled change SQL.

Anúncios

Um comentário sobre “Banco de Dados Evolutivo – Parte 12

  1. Pingback: Banco de Dados Evolutivo – Parte 14 | Arthur Luz | Data's Light

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s