UNIVERSIDADE FEDERAL DE SÃO CARLOS
DEPARTAMENTO DE COMPUTAÇÃO
Liquibase: Gerenciamento de
Alterações em Banco de Dados
Paulo Eduardo Papotti
2012
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Você nunca desenvolve código sem controle de versão, por que você
desenvolve seu banco de dados sem ele?
Introdução
Grande parte das aplicações que são desenvolvidas em um ambiente empresarial, são
aplicações corporativas que exigem a gestão de grandes quantidades de dados. As equipes de
desenvolvimento de trabalho em tais projetos muitas vezes tratam o banco de dados como
uma entidade completamente separada da aplicação. Isso às vezes decorre de uma estrutura
organizacional que separa a equipe de banco de dados das equipes de desenvolvimento de
aplicativos. Outras vezes, é simplesmente o que as equipes estão acostumadas a fazer. De
qualquer maneira, essa separação pode levar a algumas das seguintes práticas (ou falta dela):
Alterações realizadas manualmente no banco de dados.
As alterações de banco de dados nem sempre são compartilhadas com todos os
membros das equipes.
Abordagens inconsistentes para a realização de alterações no banco de dados.
Mecanismos manuais são ineficazes para gerenciar as mudanças de uma versão do
banco de dados para a próxima.
Estas são práticas manuais deixam, muitas vezes, desenvolvedores fora de sincronia
com as alterações de dados. Além disso, podem levar aos usuários da aplicação a enfrentarem
problemas com dados inconsistentes ou corrompidos. Dessa forma, tarefas como recuperar o
histórico de alterações e desfaze-las pode ser um processo difícil e trabalhoso.
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Sobre a Liquibase
Liquibase é uma biblioteca independente de banco de dados de código aberto utilizada
para rastrear, gerenciar e aplicar alterações em banco de dados. Ela foi criada em 2006 para
facilitar o rastreamento de alterações de banco de dados, especialmente em ambientes de
desenvolvimento ágil de software.
Bancos de Dados Suportados
Banco de Dados
Comentários
MySQL
Sem restrições
PostgreSQL
É necessária a versão 8.2 ou superior
funcionalidade “drop all database objects”.
Oracle
Driver da versão 11g é necessário quando utilizar a
ferramenta de diff em bancos de dados com AL32UTF8 ou
AL16UTF16
MS-SQL
Sem restrições
Sybase Enterprise
É necessário ASE versão 12.0 ou superior. A opção “select
into” precisa estar ativada no banco de dados. O melhor
driver é o JTDS. Sybase não suporta o uso de transações para
DDL então rollbacks não funcionarão na ocorrência de falhas.
Chaves estrangeiras não podem ser excluídas, podendo
comprometer as funcionalidades de rollback e dropAll.
Sybase Anywhere
Sem restrições desde a versão 1.9
DB2
Sem restrições
Apache Derby
Sem restrições
HSQL
Sem restrições
H2
Sem restrições
Informix
Sem restrições
para
usar
a
InterSystems Caché Sem restrições
Firebird
Sem restrições
SAPDB
Sem restrições
SQLite
Sem restrições desde a versão 1.8
Sistemas Operacionais Suportados
Por ser implementada em Java, a Liquibase é independente de plataforma. Dessa
forma, pode ser utilizada em qualquer sistema operacional que suporte Java.
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Site Oficial da Liquibase
O site oficial da Liquibase é http://www.liquibase.org/
Download
A Liquibase pode ser baixada em: http://www.liquibase.org/download
Requisitos
A Liquibase requer o Java (versão 1.5 ou superior) instalado e configurado no
computador.
Instalação
Extrair o arquivo baixado em uma pasta de seu computador. Dentro da pasta, você
encontrará um arquivo com a extensão JAR (Java Application Runtime). Esse jar é tudo que é
necessário para executar a Liquibase por meio de linha de comando, Ant, Maven, Spring ou
Servlet Container. Nesse tutorial utilizaremos a execução por meio de linha de comando.
Download do Código Fonte
O
código
fonte
da
Liquibase
pode
ser
consultado
em
https://github.com/liquibase/liquibase
Arquivos de ChangeLogs
Arquivos de ChangeLog são documentos no formato XML utilizados para descrever
alterações ou refatorações em um banco de dados relacional usando a Liquibase. Um arquivo
de ChangeLog deve conter uma tag <databaseChangeLog>, exemplificado da seguinte forma:
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
.
.
.
</databaseChangeLog>
Em um arquivo de ChangeLog, a tag <databaseChangeLog> pode conter, dentre
outras, as seguintes sub-tags:
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
<changeSet>: descreve uma determinada alteração/refatoração a ser realizada no
banco de dados.
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<changeSet id="1" author="Paulo">
<createTable tableName="departamento">
<column name="sigla" type="varchar(10)">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="nome" type="varchar(50)">
<constraints nullable="false"/>
</column>
<column name="ativo" type="boolean" defaultValueBoolean="true"/>
</createTable>
</changeSet>
</databaseChangeLog>
<preConditions>: usada para definir condições que devem ser satisfeitas para
que uma alteração/refatoração seja realizada. Todas as possíveis pré-condições que
podem ser contempladas, por um arquivo de ChangeLog, podem ser encontradas em
http://liquibase.org/manual/preconditions.
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<preConditions>
<dbms type="oracle"/>
<runningAs username="SYSTEM"/>
</preConditions>
<changeSet id="1" author="bob">
<preConditions onFail="WARN">
<sqlCheck expectedResult="0">
select count(*) from departamento
</sqlCheck>
</preConditions>
<comment>
Comentários devem ser colocados sempre depois das pré-condições.
</comment>
<dropTable tableName="departamento"/>
</changeSet>
</databaseChangeLog>
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
<include>: permite incluir novos arquivos contendo alterações/refatorações com o
intuito de quebrar os arquivos de ChageLog em várias partes.
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<include file="com/example/news/news.changelog.xml"/>
<include file="com/example/directory/directory.changelog.xml"/>
</databaseChangeLog>
ChangeSet
Como já foi mencionado, a tag <changeSet> é utilizadas para especificar
alterações/refatorações em um banco de dados. Na Liquibase, cada alteração/refatoração
realizada é unicamente identificada pela combinação do atributo id da alteração/refatoração
realizada, do atributo author e do caminho do arquivo de changelog.
Quando a Liquibase executa um arquivo de changelog, ela lê as tags <changeSet> em
ordem e para cada tag dessas, consulta em uma tabela “databasechangelog” no banco de
dados para verificar se a combinação “id/author/caminho” já foi executada. Caso o
<changeSet> já tiver sido executado, o mesmo é ignorado a não ser que esteja marcado com a
opção “runAlways”. Após todos os <changeSet> serem processados e executados, uma nova
linha com id/author/caminho é inserida na tabela “databasechangelog”.
A tabela “databasechangelog” armazena o histórico de alterações realizadas no banco
de dados. Fazendo a consulta abaixo, é possível consultar essas alterações.
Select * from databasechangelog;
Exemplo de registros armazenados na tabela databasechangelog:
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Atributos da tag <changeSet>
id
Um identificador alfanumérico [obrigatório]
author
O criador do changeSet [obrigatório]
dbms
O identificador do banco de dados que o changeSet será aplicado. Por exemplo:
“mysql”, “oracle”, “postgresql”.
runAlways
Executa o changeSet toda vez que o arquivo de changelog for executado, mesmo que
já tenha sido executado antes. [true ou false]
runOnChange
Executa o changeSet da primeira vez e sempre que o changeSet for alterado. [true
ou false].
context
Executa o changeSet se um context particular foi passado como parâmetro durante a
execução. Qualquer string pode ser utilizada como sendo o nome do contexto. Por
exemplo: “teste”, “versão-final”.
runInTransaction
Define se o changeSet deve ser executado em uma única transação (se possível). O
padrão é true.
failOnError
Define se a migração deve falhar se ocorrer algum erro durante a execução do
changeSet. O padrão é true.
Sub-Tags da tag <changeSet>
<comment>
Define um comentário para o changeSet.
<preConditions>
Pré-condições que devem ser satisfeitas para que o changeSet seja executado.
<Tags de Refatoração> As alterações a serem executadas pelo chageSet, chamadas refatorações.
<rollback>
Código SQL ou tags de refatorações necessárias para desfazer o changeSet.
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Tags de Refatoração
A seguir, serão mostradas as possíveis refatorações atualmente oferecidas pela
Liquibase. Para cada refatoração, é apresentado um exemplo de uso e o link para a
documentação completa no site oficial da Liquibase.
Refatorações Estruturais
Add Column
<addColumn tableName="person">
<column name="firstname" type="varchar(255)"/>
</addColumn>
Documentação: http://liquibase.org/manual/add_column
Rename Column
<renameColumn tableName="person"
oldColumnName="fname" newColumnName="firstName"/>
Documentação: http://liquibase.org/manual/rename_column
Modify Data Type
<modifyColumn tableName="person">
<column name="firstname" type="varchar(5000)"/>
</modifyColumn>
Documentação: http://liquibase.org/manual/modify_datatype_refactoring
Drop Column
<dropColumn tableName="person" columnName="ssn"/>
Documentação: http://liquibase.org/manual/drop_column
Alter Sequence
<alterSequence sequenceName="seq_employee_id" incrementBy="10"/>
Documentação: http://liquibase.org/manual/alter_sequence
Liquibase: Gerenciamento de Alterações em Banco de Dados
Create Table
<createTable tableName="person">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="firstname" type="varchar(255)"/>
<column name="lastname" type="varchar(255)"/>
<column name="username" type="varchar(255)">
<constraints unique="true" nullable="false"/>
</column>
<column name="testid" type="int" />
</createTable>
Documentação: http://liquibase.org/manual/create_table
Rename Table
<renameTable oldTableName="employee" newTableName="person"/>
Documentação: http://liquibase.org/manual/rename_table
Drop Table
<dropTable tableName="person" schemaName="mySchema"/>
Documentação: http://liquibase.org/manual/drop_table
Create View
<createView viewName="personView">
select id, firstname from person
</createView>
Documentação: http://liquibase.org/manual/create_view
Rename View
<renameView oldViewName="personView" newViewName="people"/>
Documentação: http://liquibase.org/manual/rename_view
Drop View
<dropView viewName="personView"/>
Documentação: http://liquibase.org/manual/drop_view
2012
Liquibase: Gerenciamento de Alterações em Banco de Dados
Merge Columns
<mergeColumns tableName="person"
column1Name="phoneAreaCode"
joinString="-"
column2Name="phoneSuffix"
finalColumnName="phone"
finalColumnType="varchar(50)"
/>
Documentação: http://liquibase.org/manual/merge_columns
Create Stored Procedure
<createProcedure>
CREATE OR REPLACE PROCEDURE testHello
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello From The Database!');
END;
</createProcedure>
Documentação: http://liquibase.org/manual/create_stored_procedure
Refatorações de Qualidade de Dados
Add Lookup Table
<addLookupTable
existingTableName="address" existingColumnName="state"
newTableName="state" newColumnName="abbreviation"
constraintName="fk_address_state"
/>
Documentação: http://liquibase.org/manual/add_lookup_table
Add Not-Null Constraint
<addNotNullConstraint
tableName="employee"
columnName="employer_id"
defaultNullValue="1" />
Documentação: http://liquibase.org/manual/add_not-null_constraint
Remove Not-Null Constraint
2012
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
<dropNotNullConstraint tableName="employee" columnName="employer_id"/>
Documentação: http://liquibase.org/manual/remove_not-null_constraint
Add Unique Constraint
<addUniqueConstraint tableName="person"
columnNames="id"
constraintName="pk_person"/>
Documentação: http://liquibase.org/manual/add_unique_constraint
Drop Unique Constraint
<dropUniqueConstraint tableName="person" constraintName="pk_person"/>
Documentação: http://liquibase.org/manual/drop_unique_constraint
Create Sequence
<createSequence sequenceName="seq_employee_id"/>
Documentação: http://liquibase.org/manual/create_sequence
Drop Sequence
<dropSequence sequenceName="seq_employee_id"/>
Documentação: http://liquibase.org/manual/drop_sequence
Add Auto-Increment
<addAutoIncrement tableName="person" columnName="id" columnDataType="int"/>
Documentação: http://liquibase.org/manual/add_auto-increment
Add Default Value
<addDefaultValue tableName="file"
columnName="fileName"
defaultValue="New File"/>
Documentação: http://liquibase.org/manual/add_default_value
Drop Default Value
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
<dropDefaultValue tableName="file" columnName="fileName"/>
Documentação: http://liquibase.org/manual/drop_default_value
Refatorações de Integridade Referencial
Add Foreign Key Constraint
<addForeignKeyConstraint constraintName="fk_address_person"
baseTableName="address" baseColumnNames="person_id"
referencedTableName="person" referencedColumnNames="id"/>
Documentação: http://liquibase.org/manual/add_foreign_key_constraint
Drop Foreign Key Constraint
<dropForeignKeyConstraint
constraintName="fk_address_person"
baseTableName="address"/>
Documentação: http://liquibase.org/manual/drop_foreign_key_constraint
Drop All Foreign Key Constraints
<dropAllForeignKeyConstraints
baseTableName="address"/>
Documentação: http://liquibase.org/manual/drop_all_foreign_key_constraints
Add Primary Key Constraint
<addPrimaryKey tableName="person"
columnNames="id"
constraintName="pk_person"/>
Documentação: http://liquibase.org/manual/add_primary_key_constraint
Drop Primary Key Constraint
<dropPrimaryKey tableName="person" constraintName="pk_person"/>
Documentação: http://liquibase.org/manual/drop_primary_key_constraint
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Transformações
Insert Data
<insert tableName="People">
<column name="id" valueNumeric="2"/>
<column name="firstname" value="Fred"/>
<column name="lastname" value="Johnson"/>
<column name="username" value="fjohnson"/>
<column name="testid" valueNumeric="2"/>
</insert>
Documentação: http://liquibase.org/manual/insert_data
Load Data
<loadData tableName="users" file="com/sample/users.csv">
<column name="id" type="NUMERIC"/>
<column name="firstname" type="STRING"/>
<column name="lastname" type="STRING"/>
<column name="username" type="STRING"/>
</loadData>
Documentação: http://liquibase.org/manual/load_data
Load Update Data
<loadUpdateData tableName="users" file="com/sample/users.csv" primaryKey="id">
<column name="id" type="NUMERIC"/>
<column name="firstname" type="STRING"/>
<column name="lastname" type="STRING"/>
<column name="username" type="STRING"/>
</loadUpdateData>
Documentação: http://liquibase.org/manual/load_update_data
Update Data
<update tableName="People">
<column name="firstname" value="Fred"/>
<column name="lastname" value="Johnson"/>
<column name="username" value="fjohnson"/>
<where>id=2</where>
</update>
Documentação: http://liquibase.org/manual/update_data
Liquibase: Gerenciamento de Alterações em Banco de Dados
Delete Data
<delete tableName="People">
<where>id=2</where>
</delete>
Documentação: http://liquibase.org/manual/delete_data
Tag Database
<tagDatabase tag="version_1.3"/>
Documentação: http://liquibase.org/manual/tag_database
Stop
<stop>Halted LiquiBase for debugging</stop>
Documentação: http://liquibase.org/manual/stop
Refatorações Arquiteturais
Create Index
<createIndex tableName="user" indexName="idx_user_username">
<column name="username"/>
</createIndex>
Documentação: http://liquibase.org/manual/create_index
Drop Index
<dropIndex indexName="idx_user_username" tableName="table_name" />
Documentação: http://liquibase.org/manual/drop_index
2012
Liquibase: Gerenciamento de Alterações em Banco de Dados
Refatorações de Customização
Modifying Generated SQL
<changeSet id="1" author="nvoxland">
<createTable tableName="person">
<column name="id" type="bigint"/>
<column name="firstname" type="varchar(255)"/>
<column name="lastname" type="varchar(255)"/>
</createTable>
<modifySql>
<replace replace="bigint" with="long"/>
</modifySql>
<modifySql dbms="mysql">
<append value=" engine innodb"/>
</modifySql>
</changeSet>
Documentação: http://liquibase.org/manual/modify_sql
Custom SQL
<sql>insert into person (id, name) values (1, 'Bob')</sql>
Documentação: http://liquibase.org/manual/custom_sql
Custom SQL File
<sqlFile path="sample.sql"/>
Documentação: http://liquibase.org/manual/custom_sql_file
Custom Refactoring Class
<customChange class="com.example.ExampleCustomChange">
<param name="tableName" value="person"/>
<param name="columnName" value="employee_id"/>
</customChange>
Documentação: http://liquibase.org/manual/custom_refactoring_class
Execute Shell Command
<executeCommand executable="mysqldump" os="Windows XP">
<arg value="--add-drop-database"/>
<arg value="--compress"/>
<arg value="dbName"/>
</executeCommand>
Documentação: http://liquibase.org/manual/execute_shell_command
2012
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Geração de arquivos de ChangeLog
Ao iniciar o uso da Liquibase em um banco de dados já existente é útil realizar a
geração do arquivo de changelog para a criação do banco de dados existente. Isso é possível
através do comando generateChangeLog. No entanto, esse comando possui limitações e não
consegue recuperar stored procedures, functions, packages e triggers, por exemplo.
Exemplo:
liquibase --driver=oracle.jdbc.OracleDriver
--classpath=\path\to\classes:jdbcdriver.jar
--changeLogFile=com/example/db.changelog.xml
--url="jdbc:oracle:thin:@localhost:1521:XE"
--username=oracle
--password=oracle generateChangeLog
Ferramenta de Diff
A Liquibase também oferece uma ferramenta para realizar Diffs entre banco de dados
existentes. Para realizar o diff, a Liquibase deve ser executada passando os dados de cada
banco (driver, url, usuário e senha) e usar o comando diff.
Exemplo:
java -jar liquibase.jar
--driver=org.postgresql.Driver
--classpath=postgresql.jar
--changeLogFile=splitColumn.changelog.xml
--url="jdbc:postgresql://localhost:5432/liquibase"
--username=postgres
--password=postgres
diff
--referenceUrl="jdbc:postgresql://localhost:5432/liquibase"
--referenceUsername=postgres
--referencePassword=postgres
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Exemplo de resultado do diff entre duas bases de dadosw
Ferramenta DBDoc
A Liquibase tem a opção de gerar a documentação do banco de dados a partir da
informação contida em um arquivo de changeLog e no banco de dados existente. A
documentação gerada é baseada no estilo “JavaDoc”1. Para gerar essa documentação, o
comando dbDoc é utilizado.
Exemplo:
java –jar liquibase.jar
--driver=oracle.jdbc.OracleDriver
--url=jdbc:oracle:thin:@testdb:1521:test
--username=bob
--password=bob
--changeLogFile=path/to/changelog.xml
dbDoc
/docs/dbdoc
1
http://www.oracle.com/technetwork/java/javase/documentation/index-jsp-135444.html
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Resultado da geração da documentação por meio do dbDoc.
Exemplos de Refatorações usando a Liquibase
A seguir, são apresentados alguns exemplos de aplicações de refatorações em banco
de dados, usando a Liquibase. Para os exemplos a seguir, foi utilizado o banco de dados
PostgreSQL, disponível em: http://www.postgresql.org/download/. O JAR do driver para
acesso
via
JDBC,
usado
pela
Liquibase,
pode
ser
encontrado
em:
http://jdbc.postgresql.org/download.html. Além disso, é necessário o JAR da liquibase que
pode ser encontrado em: http://liquibase.org/download.
Para cada refatoração, é apresentado: 1) um script SQL do cenário anterior à
refatoração; 2) o arquivo de changelog que descreve a refatoração e 3) o comando que deve
executado para aplicar a refatoração.
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Para executar os exemplos, deve-se executar os seguintes passos:
1. Conectar no banco de dados.
2. Criar/Acessar a base de dados e executar o Script SQL do cenário da
refatoração.
Liquibase: Gerenciamento de Alterações em Banco de Dados
3. Criar o arquivo de changelog no formato XML.
4. Executar o comando para aplicar a refatoração.
2012
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
5. Testar a refatoração realizada no banco de dados.
1- MoveColumn
Script do cenário
CREATE TABLE PESSOA (
ID INT NOT NULL,
NOME VARCHAR(50) NOT NULL,
SALARIO FLOAT NOT NULL,
CONSTRAINT PK_PESSOA PRIMARY KEY(ID)
);
CREATE TABLE FUNCIONARIO (
ID INT NOT NULL,
IDPESSOA INT NOT NULL,
CONSTRAINT PK_FUNCIONARIO PRIMARY KEY(ID),
CONSTRAINT FK_FUNCIONARIO FOREIGN KEY(IDPESSOA) REFERENCES PESSOA(ID)
);
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
PESSOA
PESSOA
PESSOA
PESSOA
PESSOA
VALUES
VALUES
VALUES
VALUES
VALUES
(1,'p1',100);
(2,'p2',200);
(3,'p3',300);
(4,'p4',400);
(5,'p5',500);
Liquibase: Gerenciamento de Alterações em Banco de Dados
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
FUNCIONARIO
FUNCIONARIO
FUNCIONARIO
FUNCIONARIO
VALUES
VALUES
VALUES
VALUES
2012
(1,1);
(2,2);
(3,3);
(4,4);
moveColumn.changelog.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
<changeSet id="1" author="Paulo">
<addColumn tableName="FUNCIONARIO">
<column name="SALARIO" type="FLOAT"/>
</addColumn>
<sql>
UPDATE FUNCIONARIO
SET SALARIO = (SELECT SALARIO FROM PESSOA WHERE PESSOA.ID
= FUNCIONARIO.IDPESSOA);
</sql>
<dropColumn tableName="PESSOA" columnName="SALARIO"/>
</changeSet>
</databaseChangeLog>
Comando
java
-jar
liquibase.jar
--driver=org.postgresql.Driver
-classpath=postgresql.jar --changeLogFile=moveColumn.changelog.xml -url="jdbc:postgresql://localhost:5432/liquibase" --username=postgres -password=postgres migrate
2- SplitColumn
Script do cenário
CREATE TABLE PESSOA (
ID INT NOT NULL,
NOME VARCHAR(50) NOT NULL,
CONSTRAINT PK_PESSOA PRIMARY KEY(ID)
);
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
PESSOA
PESSOA
PESSOA
PESSOA
VALUES
VALUES
VALUES
VALUES
(1,'Paulo Ricardo dos Santos');
(2,'Joao Alberto da Silva Cunha');
(3,'José Henrique Roberto Silva');
(4,'Renato de Oliveira Silva');
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
splitColumn.changelog.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
<changeSet id="1" author="Paulo">
<addColumn tableName="PESSOA">
<column name="PRIMEIRONOME" type="VARCHAR(50)"/>
</addColumn>
<addColumn tableName="pessoa">
<column name="NOMEDOMEIO" type="VARCHAR(50)"/>
</addColumn>
<addColumn tableName="pessoa">
<column name="ULTIMONOME" type="VARCHAR(50)"/>
</addColumn>
<sql>
UPDATE PESSOA
SET PRIMEIRONOME = SUBSTRING(NOME, '^\\w+'),
ULTIMONOME = SUBSTRING(NOME, '\\S+$'),
NOMEDOMEIO = REGEXP_REPLACE(REGEXP_REPLACE(NOME,
'^\\w+\\s' , ''),'\\s\\S+$', '');
</sql>
<dropColumn tableName="PESSOA" columnName="NOME"/>
</changeSet>
</databaseChangeLog>
Comando
java -jar liquibase.jar --driver=org.postgresql.Driver -classpath=postgresql.jar --changeLogFile=splitColumn.changelog.xml -url="jdbc:postgresql://localhost:5432/liquibase" --username=postgres -password=postgres migrate
3- DropDefaultValue
Script do cenário
CREATE TABLE PESSOA (
ID INT NOT NULL,
NOME VARCHAR(50) NOT NULL,
CONSTRAINT PK_PESSOA PRIMARY KEY(ID)
);
CREATE TABLE FUNCIONARIO (
ID INT NOT NULL,
IDPESSOA INT NOT NULL,
SALARIO FLOAT NOT NULL,
TIPOSALARIO CHAR(1) DEFAULT 'M',
CONSTRAINT PK_FUNCIONARIO PRIMARY KEY(ID),
CONSTRAINT FK_FUNCIONARIO FOREIGN KEY(IDPESSOA) REFERENCES PESSOA(ID)
);
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
dropDefaultValue.changelog.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
<changeSet id="1" author="Paulo">
<dropDefaultValue tableName="FUNCIONARIO"
columnName="TIPOSALARIO"/>
</changeSet>
</databaseChangeLog>
Comando
java -jar liquibase.jar --driver=org.postgresql.Driver -classpath=postgresql.jar -changeLogFile=dropDefaultValue.changelog.xml -url="jdbc:postgresql://localhost:5432/liquibase" --username=postgres -password=postgres migrate
4- AddForeignKeyConstraint
Script do cenário
CREATE TABLE PESSOA (
ID INT NOT NULL,
NOME VARCHAR(50) NOT NULL,
CONSTRAINT PK_PESSOA PRIMARY KEY(ID)
);
CREATE TABLE FUNCIONARIO (
ID INT NOT NULL,
IDPESSOA INT NOT NULL,
SALARIO FLOAT NOT NULL,
TIPOSALARIO CHAR(1),
CBO INT NOT NULL,
CONSTRAINT PK_FUNCIONARIO PRIMARY KEY(ID),
CONSTRAINT FK_FUNCIONARIO FOREIGN KEY(IDPESSOA) REFERENCES PESSOA(ID)
);
CREATE TABLE CBO (
CBO INT NOT NULL,
DESCRICAO VARCHAR(50) NOT NULL,
CONSTRAINT PK_CBO PRIMARY KEY(CBO)
);
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
addForeignKeyConstraint.changelog.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
<changeSet id="1" author="Paulo">
<addForeignKeyConstraint constraintName="FK_FUNCIONARIO_CBO"
baseTableName="FUNCIONARIO" baseColumnNames="CBO"
referencedTableName="CBO" referencedColumnNames="CBO"/>
</changeSet>
</databaseChangeLog>
Comando
java -jar liquibase.jar --driver=org.postgresql.Driver -classpath=postgresql.jar -changeLogFile=addForeignKeyConstraint.changelog.xml -url="jdbc:postgresql://localhost:5432/liquibase" --username=postgres -password=postgres migrate
5- IntroduceIndex
Script do cenário
CREATE TABLE PESSOA (
ID INT NOT NULL,
PRIMEIRONOME VARCHAR(50) NOT NULL,
NOMEDOMEIO VARCHAR(50) NOT NULL,
ULTIMONOME VARCHAR(50) NOT NULL,
CPF CHAR(11) NOT NULL,
CONSTRAINT PK_PESSOA PRIMARY KEY(ID)
);
IntroduceIndex.changelog.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
<changeSet id="1" author="Paulo">
<createIndex tableName="PESSOA" indexName="PESSOACPF"
unique="true">
<column name="CPF"/>
</createIndex>
</changeSet>
</databaseChangeLog>
Liquibase: Gerenciamento de Alterações em Banco de Dados
2012
Comando
java -jar liquibase.jar --driver=org.postgresql.Driver -classpath=postgresql.jar --changeLogFile=introduceIndex.changelog.xml
--url="jdbc:postgresql://localhost:5432/liquibase" --username=postgres
--password=postgres migrate
6- IntroduceNewColumn
Script do cenário
CREATE TABLE PESSOA (
ID INT NOT NULL,
PRIMEIRONOME VARCHAR(50) NOT NULL,
NOMEDOMEIO VARCHAR(50) NOT NULL,
ULTIMONOME VARCHAR(50) NOT NULL,
CPF CHAR(11) NOT NULL UNIQUE,
CONSTRAINT PK_PESSOA PRIMARY KEY(ID)
);
IntroduceNewColumn.changelog.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
<changeSet id="1" author="Paulo">
<addColumn tableName="PESSOA">
<column name="DATANASCIMENTO" type="DATE"/>
</addColumn>
</changeSet>
</databaseChangeLog>
Comando
java -jar liquibase.jar --driver=org.postgresql.Driver -classpath=postgresql.jar -changeLogFile=introduceNewColumn.changelog.xml -url="jdbc:postgresql://localhost:5432/liquibase" --username=postgres -password=postgres migrate
Fonte
Site oficial da Liquibase: www.liquibase.org