Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

93
Zarządzanie zmianami w relacyjnych bazach danych Marcin Stachniuk 30 września 2015 Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 1/64

Transcript of Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Page 1: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Zarządzanie zmianami w relacyjnych bazachdanych

Marcin Stachniuk

30 września 2015

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 1/64

Page 2: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

O mnie

Marcin Stachniuk

Chorąży na chamberconf.pl

Speaker: WrocJUG, dbconf.pl, warsjawa.pl, careercon.pl,chamberconf.pl

Recenzent książki: practicalunittesting.com

[email protected]

mstachniuk.blogspot.com

@MarcinStachniuk

github.com/mstachniuk

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 2/64

Page 3: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak zarządzać zmianami w relacyjnych bazach danych?

Jak zarządzać zmianami wrelacyjnych bazach danych?

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 3/64

Page 4: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Ręcznie, bezpośrednio na bazie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 4/64

Page 5: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Czyli...

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 5/64

Page 6: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

...albo...

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 6/64

Page 7: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

...inaczej

http://programming-motherfucker.com/Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 7/64

Page 8: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Word, ERwin

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 8/64

Page 9: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Odpalając SQL-e

Możliwe rozwiązania:

Flyway

c5-db-migration

dbdeploy.com

MyBatis Migrations

MIGRATEdb

DbMaintain

AutoPatch

Porównanie systemów: http://flywaydb.org/#featuresMarcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 9/64

Page 10: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Z modelu danych

Hibernate hbm2ddl:

1: spring.jpa.hibernate.ddl-auto=create-drop

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 10/64

Page 11: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Z poziomu kodu Javy

migrate4j

1: public class Migration_1 implements Migration {2:3: public void up() {4: createTable(5: table("simple_table",6: column("id", INTEGER, primarykey(), notnull()),7: column("desc", VARCHAR, length(50), defaultValue("NA"))));8: }9:10: public void down() {11: dropTable("simple_table");12: }13: }

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 11/64

Page 12: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Odstawmy ”Badziewie do badziewia”

Kopsnij Drina - Wielki test piw w plastikuMarcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 12/64

Page 13: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase

http://www.liquibase.org/Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 13/64

Page 14: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 14/64

Page 15: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 15/64

Page 16: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Zapisujemy zmiany w changelog’u w XML’u

db.changelog.xml

1: <changeSet id="Release2-01" author="staszek">2: <createTable tableName="user">3: <column name="id" type="INT">4: <constraints nullable="false"/>5: </column>6: <column name="email" type="VARCHAR(255)">7: <constraints unique="true" nullable="false"/>8: </column>9: <column name="password" type="VARCHAR(255)">10: <constraints nullable="false"/>11: </column>12: </createTable>13: </changeSet>14:15: <changeSet id="Release2-02" author="staszek">16: <addPrimaryKey tableName="user" columnNames="id"/>17: </changeSet>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 16/64

Page 17: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Zapisujemy zmiany w changelog’u w XML’u

Lub w innym wspieranym formacie:

YAML

JSON

SQL

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 17/64

Page 18: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Uruchamiamy liquibase:update

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 18/64

Page 19: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Wspierane bazy danych

MySQL

PostgreSQL

Oracle

Sql Server

Sybase

DB2

Derby

HSQLDB

H2

Informix

Firebird

SQLite

InterSystems Cache

SAP MaxDB

IBM DB2 for iSeries

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 19/64

Page 20: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 20/64

Page 21: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do nowego projektu?

1. Podpinamy zależność

1: <dependency>2: <groupId>org.liquibase</groupId>3: <artifactId>liquibase-core</artifactId>4: <version>3.4.1</version>5: </dependency>

2. Wprowadzamy zmiany w:src/main/resources/db/changelog/db.changelog.xml

3. Konfigurujemy bazę

4. Wyłączmy hbm2ddl

1: spring.jpa.hibernate.ddl-auto=none

5. I działa!

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 21/64

Page 22: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do istniejącego projektu?

1. Generujemy changelog’a dla istniejącego stanu bazy

1: <plugin>2: <groupId>org.liquibase</groupId>3: <artifactId>liquibase-maven-plugin</artifactId>4: <version>3.4.1</version>5: <configuration>6: <changeLogFile>src/main/resources/db/changelog/db.changelog.xml7: </changeLogFile>8: <driver>com.mysql.jdbc.Driver</driver>9: <url>jdbc:mysql://localhost:3306/public</url>10: <username>liqui</username>11: <password>liqui</password>12: <dropFirst>false</dropFirst>13: </configuration>14: </plugin>

1: mvn liquibase:generateChangeLog

I zapisujemy w:src/main/resources/db/changelog/db.changelog.xml

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 22/64

Page 23: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do istniejącego projektu?

2. Dodajemy pomocniczą bazę „na boku” (może być inna)

1: spring.datasource.url=jdbc:h2:~/liquibasedemo;AUTO_SERVER=TRUE2: spring.datasource.username=liquibasedemo3: spring.datasource.password=liquibasedemo4: spring.datasource.driverClassName=org.h2.Driver5:6: liquibase.change-log=classpath:db/changelog/db.changelog.xml7: liquibase.dropFirst=false

i Liquibase’a do projektu:

1: <dependency>2: <groupId>org.liquibase</groupId>3: <artifactId>liquibase-core</artifactId>4: <version>3.4.0</version>5: </dependency>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 23/64

Page 24: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do istniejącego projektu?

3. Uruchamiamy aplikację z konfiguracją pomocniczej bazy

1: INFO 24.08.15 01:17: liquibase: Successfully acquired change log lock2: INFO 24.08.15 01:17: liquibase: Creating database history table with name: PUBLIC.DATABASECHANGELOG3: INFO 24.08.15 01:17: liquibase: Reading from PUBLIC.DATABASECHANGELOG4: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classpath:db/changelog/db.changelog.xml::1418571045624-1::staszek (generated): Table actors created5: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classpath:db/changelog/db.changelog.xml::1418571045624-1::staszek (generated): ChangeSet classpath:db/changelog/db.changelog.xml::1418571045624-1::staszek (generated) ran successfully in 10ms6: ...7: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classpath:db/changelog/db.changelog.xml::1418571045624-123::staszek (generated): ChangeSet classpath:db/changelog/db.changelog.xml::1418571045624-123::staszek (generated) ran successfully in 1ms8: INFO 24.08.15 01:17: liquibase: Successfully released change log lock

Cały schemat zostaje utworzony w pomocniczej bazie, w tymzawartość tabeli DATABASECHANGELOG, robimy zrzut (dump)tej tabeli

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 24/64

Page 25: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do istniejącego projektu?

4. Uruchamiamy aplikację z bazą produkcyjną, lub:

1: mvn liquibase:update

Kończy się błędem, ale tworzy tabele specyficzne dla Liquibase’a wbazie produkcyjnej

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 25/64

Page 26: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do instniejącego projektu?

5. Przenosimy dane do tabeli DATABASECHANGELOG z bazypomocniczej na produkcję

1: INSERT INTO DATABASECHANGELOG (ID,AUTHOR,FILENAME,DATEEXECUTED,ORDEREXECUTED,2: EXECTYPE,MD5SUM,DESCRIPTION,COMMENTS,TAG,LIQUIBASE,CONTEXTS,LABELS)3: VALUES (’1418571045624-1’,’staszek (generated)’,4: ’classpath:db/changelog/db.changelog.xml’,{ts ’2015-08-24 01:17:43’},1,5: ’EXECUTED’,’7:d3bab03ce07bf314c15ccdcfe271ac7d’,’createTable’,’’,null,6: ’3.4.0’,null,null);7: INSERT INTO DATABASECHANGELOG (ID,AUTHOR,FILENAME,DATEEXECUTED,ORDEREXECUTED,8: EXECTYPE,MD5SUM,DESCRIPTION,COMMENTS,TAG,LIQUIBASE,CONTEXTS,LABELS)9: VALUES (’1418571045624-2’,’staszek (generated)’,10: ’classpath:db/changelog/db.changelog.xml’,{ts ’2015-08-24 01:17:43’},2,11: ’EXECUTED’,’7:91c184917b4a9dfb9a502f7b2f237530’,’createTable’,’’,null,12: ’3.4.0’,null,null);13: ...

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 26/64

Page 27: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do istniejącego projektu?

6. Zmieniamy konfigurację liquibase-maven-plugin’a, aby korzystałz bazy pomocniczej (aby przypadkiem nie puścić produkcji zdymem)

1: <plugin>2: <groupId>org.liquibase</groupId>3: <artifactId>liquibase-maven-plugin</artifactId>4: <version>3.4.1</version>5: <configuration>6: <changeLogFile>src/main/resources/db/changelog/db.changelog.xml7: </changeLogFile>8: <driver>org.h2.Driver</driver>9: <url>jdbc:h2:~/liquibasedemo;AUTO_SERVER=TRUE</url>10: <username>liquibasedemo</username>11: <password>liquibasedemo</password>12: <dropFirst>false</dropFirst>13: </configuration>14: </plugin>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 27/64

Page 28: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Jak wprowadzić Liquibase do istniejącego projektu?

7. Od teraz wszelkie zmiany we wszystkich bazach (w tym naprodukcji) idą przez Liquibase’a!

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 28/64

Page 29: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 29/64

Page 30: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Tworzenie nowych tabel

Przykładowe wymaganie projektowe:

Chcę mieć możliwość definiowania użytkownik i ról.

Każdy użytkownik może posiadać kilka ról w systemie.

Na poziomie roli mogę zdefiniować w przyszłości, jakieczynności może wykonać dany użytkownik.Możliwe role:

useradminchangeConfigurationorderAcceptor.

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 30/64

Page 31: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Tworzenie nowych tabel

1: <changeSet id="Release2-01" author="staszek">2: <createTable tableName="user">3: <column name="id" type="INT">4: <constraints nullable="false"/>5: </column>6: <column name="email" type="VARCHAR(255)">7: <constraints unique="true" nullable="false"/>8: </column>9: <column name="password" type="VARCHAR(255)">10: <constraints nullable="false"/>11: </column>12: </createTable>13: </changeSet>14:15: <changeSet id="Release2-02" author="staszek">16: <addPrimaryKey tableName="user" columnNames="id"/>17: </changeSet>18:19: <changeSet id="Release2-03" author="staszek">20: <addAutoIncrement tableName="user" columnName="id" columnDataType="INT"/>21: </changeSet>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 31/64

Page 32: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Tworzenie kluczy obcych

1: <changeSet id="Release2-04" author="staszek">2: <createTable tableName="user_rights">3: <column name="id" type="INT">4: <constraints nullable="false"/>5: </column>6: <column name="user_id" type="INT">7: <constraints nullable="false"/>8: </column>9: <column name="role_name" type="VARCHAR(128)">10: <constraints nullable="false"/>11: </column>12: <column name="description" type="VARCHAR(512)">13: <constraints nullable="false"/>14: </column>15: </createTable>16: </changeSet>17: ...18: <changeSet id="Release2-07" author="staszek">19: <addForeignKeyConstraint baseTableName="user_rights"20: baseColumnNames="user_id" constraintName="user_rights_fk"21: referencedTableName="user" referencedColumnNames="id"/>22: </changeSet>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 32/64

Page 33: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Efekt

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 33/64

Page 34: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Efekt

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 34/64

Page 35: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 35/64

Page 36: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Migracja danych

1: <changeSet id="Release3-07" author="staszek">2: <sql>3: insert into user_rights_new select min(id) as id, role_name,4: description from user_rights5: group by role_name6: </sql>7: </changeSet>8: <changeSet id="Release3-08" author="staszek">9: <sql>10: insert into user_rights_x(user_id, right_id) select u.id, urn.id11: from user u join user_rights ur on u.id = ur.user_id12: join user_rights_new urn on ur.role_name = urn.role_name13: </sql>14: </changeSet>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 36/64

Page 37: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Po migracji danych

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 37/64

Page 38: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Po migracji danych

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 38/64

Page 39: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 39/64

Page 40: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Modelowanie róźnic w bazach danych

za pomocą tag’a dbms:1: <changeSet id="Release5-01" author="staszek" dbms="h2, mysql, hsqldb">2: <createTable tableName="settings">3: <column name="id" type="INT">4: <constraints primaryKey="true" nullable="false"/>5: </column>6: <column name="is_active" type="bool"/>7: </createTable>8: </changeSet>9:10: <changeSet id="Release5-01" author="staszek" dbms="db2">11: <createTable tableName="settings">12: <column name="id" type="INT">13: <constraints primaryKey="true" nullable="false"/>14: </column>15: <column name="is_active" type="decimal(1)"/>16: </createTable>17: </changeSet>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 40/64

Page 41: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Modelowanie róźnic w bazach danych

za pomocą parameters (properties):

1: <property name="blob.type" value="blob" dbms="oracle,h2"/>2: <property name="blob.type" value="longtext" dbms="mysql"/>3:4: <changeSet id="Release6-01" author="staszek" dbms="db2, h2">5: <createTable tableName="big_binary_data">6: <column name="id" type="INT">7: <constraints primaryKey="true" nullable="false"/>8: </column>9: <column name="binary_data" type="${blob.type}"/>10: </createTable>11: </changeSet>

Property można przekazać z zewnątrz. Można również uzależnićod kontekstu.

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 41/64

Page 42: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Context’y

application.properties

1: liquibase.contexts = web-test

1: <changeSet id="Release7-01" author="staszek" context="int-test, web-test">2: <insert tableName="settings">3: <column name="id" valueNumeric="1"/>4: <column name="is_active" valueBoolean="true"/>5: </insert>6: </changeSet>

Uwaga!

Jeśli nie zdefiniujemy żadnego kontekstu to WSZYSTKIE zostanąwykonane!

http://www.liquibase.org/documentation/contexts.htmlMarcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 42/64

Page 43: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 43/64

Page 44: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Preconditions

Gdy musimy skorzystać z innego użytkownika, zależnie od typubazy danych

1: <preConditions>2: <or>3: <and>4: <dbms type="oracle" />5: <runningAs username="SYSTEM" />6: </and>7: <and>8: <dbms type="mssql" />9: <runningAs username="sa" />10: </and>11: </or>12: </preConditions>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 44/64

Page 45: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Generowanie rollback’ów

Dla operacji typu:

create table

rename column

add column

rollback może zostać wygenerowany automatycznie.

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 45/64

Page 46: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Generowanie rollback’ów

Dla innych operacji możemy sami sobie zdefiniować:

1: <changeSet id="Release7-01" author="staszek" context="int-test, web-test">2: <insert tableName="settings">3: <column name="id" valueNumeric="1"/>4: <column name="is_active" valueBoolean="true"/>5: </insert>6: <rollback>7: <delete tableName="settings">8: <where>id = 1</where>9: </delete>10: </rollback>11: </changeSet>

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 46/64

Page 47: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Porównywanie baz danych

Diff mode

1: sh liquibase \2: --classpath="h2-1.3.174.jar:mysql-connector-java-5.1.36.jar" \3: --driver=org.h2.Driver \4: --url="jdbc:h2:~/liquibasedemo;AUTO_SERVER=TRUE" \5: --username=liquibasedemo \6: --password=liquibasedemo \7: diff \8: --referenceUrl=jdbc:mysql://localhost:3306/public \9: --referenceUsername=liqui \10: --referencePassword=liqui

działa w linii komend i ant’cie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 47/64

Page 48: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Porównywanie baz danych

1: Diff Results:2: Reference Database: liqui@localhost @ jdbc:mysql://localhost:3306/public (Default Schema: public)3: Comparison Database: LIQUIBASEDEMO @ jdbc:h2:~/liquibasedemo (Default Schema: PUBLIC)4: Product Name:5: Reference: ’MySQL’6: Target: ’H2’7: Product Version:8: Reference: ’5.6.24’9: Target: ’1.3.174 (2013-10-19)’10: Missing Catalog(s): NONE11: Unexpected Catalog(s): NONE12: Changed Catalog(s):13: public14: name changed from ’public’ to ’LIQUIBASEDEMO’15: Missing Column(s):16: user_rights.description17: user_rights_new.description18: user.email19: ...20: Unexpected Column(s): NONE21: ...

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 48/64

Page 49: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Porównywanie baz danych

DiffChangeLog mode

1: sh liquibase \2: --classpath="h2-1.3.174.jar:mysql-connector-java-5.1.36.jar" \3: --driver=org.h2.Driver \4: --url="jdbc:h2:~/liquibasedemo;AUTO_SERVER=TRUE" \5: --username=liquibasedemo \6: --password=liquibasedemo \7: diffChangeLog \8: --referenceUrl=jdbc:mysql://localhost:3306/public \9: --referenceUsername=liqui \10: --referencePassword=liqui

działa w linii komend i ant’cie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 49/64

Page 50: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Porównywanie baz danych

1: <?xml version="1.0" encoding="UTF-8" standalone="no"?>2: <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">3: <changeSet author="staszek (generated)" id="1442839118428-1">4: <createTable tableName="user">5: <column autoIncrement="true" name="id" type="INT">6: <constraints primaryKey="true" primaryKeyName="PRIMARY"/>7: </column>8: <column name="email" type="VARCHAR(255)">9: <constraints nullable="false"/>10: </column>11: <column name="password" type="VARCHAR(255)">12: <constraints nullable="false"/>13: </column>14: </createTable>15: </changeSet>16: <changeSet author="staszek (generated)" id="1442839118428-2">17: <createTable tableName="user_rights">18: <column autoIncrement="true" name="id" type="INT">19: <constraints primaryKey="true" primaryKeyName="PRIMARY"/>20: </column>21: <column name="user_id" type="INT">22: ...

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 50/64

Page 51: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

DBDoc - generowanie dokumentacji w stylu JavaDoc

Działa tylko z poziomu command line

1: sh liquibase \2: --classpath="h2-1.3.174.jar" \3: --driver="org.h2.Driver" \4: --url="jdbc:h2:~/liquibasedemo;AUTO_SERVER=TRUE" \5: --username=liquibasedemo \6: --password=liquibasedemo \7: --changeLogFile=db.changelog.xml \8: dbDoc ./dbdoc

Trochę niedopracowane narzędzie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 51/64

Page 52: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

DBDoc - generowanie dokumentacji w stylu JavaDoc

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 52/64

Page 53: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Blokowanie wykonywania zmian

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 53/64

Page 54: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Blokowanie wykonywania zmian

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 54/64

Page 55: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Blokowanie wykonywania zmian, jak sobie z tym radzić

1: INFO 21.09.15 16:23: liquibase: Waiting for changelog lock....2: INFO 21.09.15 16:24: liquibase: Waiting for changelog lock....3: ...4: Caused by: liquibase.exception.LockException: Could not acquire change log lock.Currently locked by fe80:0:0:0:1234:5678:9abc:def0%awdl0 (fe80:0:0:0:1234:5678:9abc:def0%awdl0) since 21.09.15 16:14

5: at liquibase.lockservice.StandardLockService.waitForLock(StandardLockService.java:175)6: at liquibase.Liquibase.update(Liquibase.java:192)

1: select * from DATABASECHANGELOGLOCK

1: mvn liquibase:releaseLocks

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 55/64

Page 56: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Dobre praktyki korzystania z Liquibase

Organizacja Changelog’ów w wiele plików (plik / release)

Zarządzanie wszystkim co się da przez Liquibase

Jedna zmiana na jeden ChangeSet

Konwencja nazewnicza dla ID w ChangeSet’ach

Komentarze w ChangeSet’ach

Myśl od rolback’u

Unikaj rollback’u (bądź fast-forward)

http://www.liquibase.org/bestpractices.html

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 56/64

Page 57: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Dobre praktyki korzystania z Liquibase

Organizacja Changelog’ów w wiele plików (plik / release)

Zarządzanie wszystkim co się da przez Liquibase

Jedna zmiana na jeden ChangeSet

Konwencja nazewnicza dla ID w ChangeSet’ach

Komentarze w ChangeSet’ach

Myśl od rolback’u

Unikaj rollback’u (bądź fast-forward)

http://www.liquibase.org/bestpractices.html

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 56/64

Page 58: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Dobre praktyki korzystania z Liquibase

Organizacja Changelog’ów w wiele plików (plik / release)

Zarządzanie wszystkim co się da przez Liquibase

Jedna zmiana na jeden ChangeSet

Konwencja nazewnicza dla ID w ChangeSet’ach

Komentarze w ChangeSet’ach

Myśl od rolback’u

Unikaj rollback’u (bądź fast-forward)

http://www.liquibase.org/bestpractices.html

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 56/64

Page 59: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Dobre praktyki korzystania z Liquibase

Organizacja Changelog’ów w wiele plików (plik / release)

Zarządzanie wszystkim co się da przez Liquibase

Jedna zmiana na jeden ChangeSet

Konwencja nazewnicza dla ID w ChangeSet’ach

Komentarze w ChangeSet’ach

Myśl od rolback’u

Unikaj rollback’u (bądź fast-forward)

http://www.liquibase.org/bestpractices.html

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 56/64

Page 60: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Dobre praktyki korzystania z Liquibase

Organizacja Changelog’ów w wiele plików (plik / release)

Zarządzanie wszystkim co się da przez Liquibase

Jedna zmiana na jeden ChangeSet

Konwencja nazewnicza dla ID w ChangeSet’ach

Komentarze w ChangeSet’ach

Myśl od rolback’u

Unikaj rollback’u (bądź fast-forward)

http://www.liquibase.org/bestpractices.html

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 56/64

Page 61: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Dobre praktyki korzystania z Liquibase

Organizacja Changelog’ów w wiele plików (plik / release)

Zarządzanie wszystkim co się da przez Liquibase

Jedna zmiana na jeden ChangeSet

Konwencja nazewnicza dla ID w ChangeSet’ach

Komentarze w ChangeSet’ach

Myśl od rolback’u

Unikaj rollback’u (bądź fast-forward)

http://www.liquibase.org/bestpractices.html

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 56/64

Page 62: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Dobre praktyki korzystania z Liquibase

Organizacja Changelog’ów w wiele plików (plik / release)

Zarządzanie wszystkim co się da przez Liquibase

Jedna zmiana na jeden ChangeSet

Konwencja nazewnicza dla ID w ChangeSet’ach

Komentarze w ChangeSet’ach

Myśl od rolback’u

Unikaj rollback’u (bądź fast-forward)

http://www.liquibase.org/bestpractices.html

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 56/64

Page 63: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Agenda

1 Jak zarządzać zmianami w relacyjnej bazie danych?

2 Jak działa Liquibase?

3 Od czego zaczać?

4 Tworzenie nowych obiektów bazodanowych

5 Migracja danych

6 Różnice w bazach danych

7 Co jeszcze?

8 Podsumowanie

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 57/64

Page 64: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - podstawowe właściwości

Raz definiujemy wygląd naszej bazy

Uruchamiamy na wielu wspieranych bazach danych

Mamy dokumentację zmian

Możemy generować różnice (diff’y)

Generuje SQL do review dla DBA

Wykonuje migrację od punktu w jakim znajduje się bazadanych

Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,JEE CDI, Spring Boot

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64

Page 65: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - podstawowe właściwości

Raz definiujemy wygląd naszej bazy

Uruchamiamy na wielu wspieranych bazach danych

Mamy dokumentację zmian

Możemy generować różnice (diff’y)

Generuje SQL do review dla DBA

Wykonuje migrację od punktu w jakim znajduje się bazadanych

Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,JEE CDI, Spring Boot

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64

Page 66: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - podstawowe właściwości

Raz definiujemy wygląd naszej bazy

Uruchamiamy na wielu wspieranych bazach danych

Mamy dokumentację zmian

Możemy generować różnice (diff’y)

Generuje SQL do review dla DBA

Wykonuje migrację od punktu w jakim znajduje się bazadanych

Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,JEE CDI, Spring Boot

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64

Page 67: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - podstawowe właściwości

Raz definiujemy wygląd naszej bazy

Uruchamiamy na wielu wspieranych bazach danych

Mamy dokumentację zmian

Możemy generować różnice (diff’y)

Generuje SQL do review dla DBA

Wykonuje migrację od punktu w jakim znajduje się bazadanych

Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,JEE CDI, Spring Boot

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64

Page 68: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - podstawowe właściwości

Raz definiujemy wygląd naszej bazy

Uruchamiamy na wielu wspieranych bazach danych

Mamy dokumentację zmian

Możemy generować różnice (diff’y)

Generuje SQL do review dla DBA

Wykonuje migrację od punktu w jakim znajduje się bazadanych

Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,JEE CDI, Spring Boot

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64

Page 69: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - podstawowe właściwości

Raz definiujemy wygląd naszej bazy

Uruchamiamy na wielu wspieranych bazach danych

Mamy dokumentację zmian

Możemy generować różnice (diff’y)

Generuje SQL do review dla DBA

Wykonuje migrację od punktu w jakim znajduje się bazadanych

Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,JEE CDI, Spring Boot

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64

Page 70: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - podstawowe właściwości

Raz definiujemy wygląd naszej bazy

Uruchamiamy na wielu wspieranych bazach danych

Mamy dokumentację zmian

Możemy generować różnice (diff’y)

Generuje SQL do review dla DBA

Wykonuje migrację od punktu w jakim znajduje się bazadanych

Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,JEE CDI, Spring Boot

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64

Page 71: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - co zyskujemy

Eliminacja błędów Copy Paste

Bezbolesne aktualizacje, nawet ze starych wersji

Pełna automatyzacja procesu

Schemat bazy jest wersjonowany razem z kodem

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 59/64

Page 72: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - co zyskujemy

Eliminacja błędów Copy Paste

Bezbolesne aktualizacje, nawet ze starych wersji

Pełna automatyzacja procesu

Schemat bazy jest wersjonowany razem z kodem

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 59/64

Page 73: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - co zyskujemy

Eliminacja błędów Copy Paste

Bezbolesne aktualizacje, nawet ze starych wersji

Pełna automatyzacja procesu

Schemat bazy jest wersjonowany razem z kodem

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 59/64

Page 74: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Liquibase - co zyskujemy

Eliminacja błędów Copy Paste

Bezbolesne aktualizacje, nawet ze starych wersji

Pełna automatyzacja procesu

Schemat bazy jest wersjonowany razem z kodem

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 59/64

Page 75: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Inne dobre praktyki korzystania z relacyjnych baz danych

Każdy developer może mieć instancję bazy na swojej maszynie

Automatyczne testy integracyjne na bazie docelowej(specyficzne błędy dla danej bazy)

Automatyczne testy na wszystkich wspieranych bazach

Mechanizm czyszczenia bazy na potrzeby testów (backup,dbUnit, inne)

Tworzenie danych do automatycznych testów

Zautomatyzowane przenoszenie danych z produkcji (nażądanie)

Test produkcyjnego deploymentu

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 60/64

Page 76: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Inne dobre praktyki korzystania z relacyjnych baz danych

Każdy developer może mieć instancję bazy na swojej maszynie

Automatyczne testy integracyjne na bazie docelowej(specyficzne błędy dla danej bazy)

Automatyczne testy na wszystkich wspieranych bazach

Mechanizm czyszczenia bazy na potrzeby testów (backup,dbUnit, inne)

Tworzenie danych do automatycznych testów

Zautomatyzowane przenoszenie danych z produkcji (nażądanie)

Test produkcyjnego deploymentu

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 60/64

Page 77: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Inne dobre praktyki korzystania z relacyjnych baz danych

Każdy developer może mieć instancję bazy na swojej maszynie

Automatyczne testy integracyjne na bazie docelowej(specyficzne błędy dla danej bazy)

Automatyczne testy na wszystkich wspieranych bazach

Mechanizm czyszczenia bazy na potrzeby testów (backup,dbUnit, inne)

Tworzenie danych do automatycznych testów

Zautomatyzowane przenoszenie danych z produkcji (nażądanie)

Test produkcyjnego deploymentu

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 60/64

Page 78: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Inne dobre praktyki korzystania z relacyjnych baz danych

Każdy developer może mieć instancję bazy na swojej maszynie

Automatyczne testy integracyjne na bazie docelowej(specyficzne błędy dla danej bazy)

Automatyczne testy na wszystkich wspieranych bazach

Mechanizm czyszczenia bazy na potrzeby testów (backup,dbUnit, inne)

Tworzenie danych do automatycznych testów

Zautomatyzowane przenoszenie danych z produkcji (nażądanie)

Test produkcyjnego deploymentu

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 60/64

Page 79: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Inne dobre praktyki korzystania z relacyjnych baz danych

Każdy developer może mieć instancję bazy na swojej maszynie

Automatyczne testy integracyjne na bazie docelowej(specyficzne błędy dla danej bazy)

Automatyczne testy na wszystkich wspieranych bazach

Mechanizm czyszczenia bazy na potrzeby testów (backup,dbUnit, inne)

Tworzenie danych do automatycznych testów

Zautomatyzowane przenoszenie danych z produkcji (nażądanie)

Test produkcyjnego deploymentu

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 60/64

Page 80: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Inne dobre praktyki korzystania z relacyjnych baz danych

Każdy developer może mieć instancję bazy na swojej maszynie

Automatyczne testy integracyjne na bazie docelowej(specyficzne błędy dla danej bazy)

Automatyczne testy na wszystkich wspieranych bazach

Mechanizm czyszczenia bazy na potrzeby testów (backup,dbUnit, inne)

Tworzenie danych do automatycznych testów

Zautomatyzowane przenoszenie danych z produkcji (nażądanie)

Test produkcyjnego deploymentu

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 60/64

Page 81: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 82: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 83: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 84: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 85: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 86: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 87: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 88: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 89: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 90: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

A co gdy trzeba nam czegoś więcej?

Datical DB www.datical.com/product/

Wsparcie dla funkcji, procedur składowanych, pakietów,synonimów, triggerów, walidacji więzów integralności,walidacji zależnych obiektów, zarządzanie prawamiużytkowników, przestrzenie tabel, partycje, duże voluminy

Integracja z CVS, SVN i Git

Build tools (Jenkins, Bamboo, Puppet,...)

Preview Schema Changes

Corporate Standards Enforcement

Organizational Collaboration

Audit and Compliance Support

Easy of Use (GUI-dashboard)

www.datical.com/liquibase/

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 61/64

Page 91: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Pytania

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 62/64

Page 92: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Więcej informacji

Marcin Stachniuk Blog: mstachniuk.blogspot.com

Liquibase: http://www.liquibase.org/

Feature Comparison (Flyway): http://flywaydb.org/#features

Liquibase best practices:http://www.liquibase.org/bestpractices.html

Examples: https://github.com/mstachniuk/movies-database

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 63/64

Page 93: Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Zarządzanie zmianami w relacyjnych bazachdanych

Marcin Stachniuk

Dziękuję!30 września 2015

Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 64/64