Banco de Dados Evolutivo – Parte 10

Nesse post da série Banco de Dados Evolutivo você aprenderá uma nova refatoração  (Bundled Changes). A AddNotNullConstraint


A nova coluna de nome Cpf que adiciona na nossa base AdventureWorks_Homolog através da Bundled Change addColumn (veja a Parte 9 da série) aceita NULL como valor de entrada. Porém, vamos supor que na nossa regra de negócios esse novo dado deverá ser obrigatório. Precisamos, dessa forma, adicionar a essa coluna uma constraint NOT NULL. Para isso, usaremos a refatoração de nome AddNotNullConstraint.

Criaremos agora um novo arquivo XML de nome changelog_3.xml contendo essa nova alteração DDL na nossa base de homologação. Para isso, 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="add not null constraint - coluna Cpf">
     <addNotNullConstraint columnDataType="varchar(11)"
         columnName="Cpf"
		defaultNullValue="SR"
		schemaName="Person"
		tableName="Person"/>
</changeSet>

</databaseChangeLog>

Listagem 1. Comando usado dentro do arquivo changelog_3.xml para adicionar a constraint NOT NULL na coluna Cpf.

Após criado o XML adicionaremos a nova refatoração dentro do arquivo master_1.0.xml conforme a 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_1.0/changelog_2.xml" />
<include file="C:/changelog/versao_1.0/changelog_3.xml" />

</databaseChangeLog>

Listagem 2. Comando usado dentro do arquivo master_1.0.xml para adicionar a tag de include da refatoração contida no arquivo changelog_3.xml.

Agora execute o comando da Listagem 3 para realizar a refatoração na base de Homologação.

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.

Se tudo foi executado corretamente você perceberá que agora nossa coluna Cpf não aceitará mais INSERTs de valores NULL e também que os campos que estavam nulos receberam um valor de entrada DEFAULT SR. Para verificarmos se realmente não é mais possível inserir nessa coluna registros com valor NULL, execute o INSERT da Listagem 4 na base de dados AdventureWorks_Homolog.

USE [AdventureWorks_Homolog]
GO

INSERT INTO [Person].[BusinessEntity]
           ([rowguid]
           ,[ModifiedDate])
     VALUES
           (NEWID(),
           GETDATE())
GO

INSERT INTO [Person].[Person]
           ([BusinessEntityID]
           ,[PersonType]
           ,[NameStyle]
           ,[Title]
           ,[FirstName]
           ,[MiddleName]
           ,[LastName]
           ,[Suffix]
           ,[EmailPromotion]
           ,[AdditionalContactInfo]
           ,[Demographics]
           ,[rowguid]
           ,[ModifiedDate]
           ,[Cpf])
     VALUES
           (20778,
           'IN',
			0,
           'Sr',
           'Arthur',
			NULL,
           'Luz',
           NULL,
			0,
			NULL,
			NULL,
           '3FBB4564-B55B-459A-A324-A9E0CD99D610',
           GETDATE(),
           NULL)
GO

Listagem 4. Comando utilizado para inserir na tabela Person.Person um novo registro para testarmos a modificação realizada. Para isso é necessário que seja inserido um novo registro primeiramente na tabela Person.BusinessEntity.

Ao executar o comando, o seguinte erro será apresentado:

Cannot insert the value NULL into column ‘Cpf’, table ‘AdventureWorks_Homolog.Person.Person’; column does not allow nulls. INSERT fails.

Captura de Tela 2015-07-10 às 21.36.41
Figura 1. SELECT na tabela Person.Person. Note também que, graças ao atributo DefaultNotNull adicionamos aos registros anteriores valor SR.

Se ao invés de usarmos o valor NULL na coluna Cpf do INSERT acima adicionarmos o valor ‘00000000000’ no INSERT da tabela Person.Person, obteremos o resultado conforme a Figura 1.

Vamos acompanhar também nossa tabela de controle de alterações, a databasechangelog. Execute o SELECT da Listagem 5 na nossa base de dados de Homologação. Dessa forma será possível ver as duas alterações executadas com base nos arquivos changelog_2.xml e changelog_3.xml, mas não mais a que estava no arquivo changelog_1.xml, logo, realizamos um ROLLBACK dessa alteração. O resultado retornado será conforme a Figura 2.

Captura de Tela 2015-07-10 às 21.39.57
Figura 2. SELECT na tabela de controle databasechangelog na base de Homologação.

No próximo post você aprenderá como efetuar uma refatoração mergeColumn através da ferramenta de versionamento de banco de dados Liquibase. Aprenderá também como usar o comando SQL OUTPUT – UpdateSQL. Através desse comando é possível transformar os XMLs criados para refatorações em comandos SQL.

Anúncios

5 comentários sobre “Banco de Dados Evolutivo – Parte 10

  1. Roberto

    Arthur,

    Muito bom, efetuei todos os passos e agora começo a entender como vou organizar a evolução do meu banco.
    Estou tentando executar as tag SQL e SQL FILE. Pois diante da minha situação atual são as que melhor vão me atender, tendo em vista que já tenho todos os scripts de evolução das bases de dados e gostaria de usar o liquibase para evoluir o banco de forma mais automática apenas apontando meus arquivos de SQL no XML e ele os executar.
    Estou realmente ansioso pelos próximos postes, ótimo trabalho!

    Curtido por 1 pessoa

    1. Roberto,

      Fico grato e lisonjeado mais uma vez pelo comentário.

      Não se preocupe. Em breve vou demonstrar o uso do changeset SQL.

      Veremos antes o comando UpdateSQL. Ele é muito importante pois transforma o conteúdo XML em SQL.

      Depois o comando Rollback (outro comando importantíssimo no uso de versões de sistema). Depois disso, finalmente o changeset SQL.

      Muito obrigado pelo comentário e pela credibilidade ao conteúdo!

      Grande abraço!

      Curtir

      1. Roberto

        Arthur,

        Só adiantando um pouco. Pelo que pude entender na documentação as TAGs SQL e SQL FiLE não possuem Rollback. No caso desse comando de RollBack que vai postar ele serviria para desfazer alterações das TAGs de SQL ?

        Curtido por 1 pessoa

      2. Sim.

        O comando Rollback funciona com as as bundled changes SQL se você, na construção do XML, puser uma tag de Rollback com um comando SQL desfazendo o que fez na alteração.

        😀

        Curtir

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