SlideShare ist ein Scribd-Unternehmen logo
1 von 93
Downloaden Sie, um offline zu lesen
Zarządzanie zmianami w relacyjnych bazach
danych
Marcin Stachniuk
30 września 2015
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 1/64
O mnie
Marcin Stachniuk
Chorąży na chamberconf.pl
Speaker: WrocJUG, dbconf.pl, warsjawa.pl, careercon.pl,
chamberconf.pl
Recenzent książki: practicalunittesting.com
mstachniuk@gmail.com
mstachniuk.blogspot.com
@MarcinStachniuk
github.com/mstachniuk
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 2/64
Jak zarządzać zmianami w relacyjnych bazach danych?
Jak zarządzać zmianami w
relacyjnych bazach danych?
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 3/64
Ręcznie, bezpośrednio na bazie
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 4/64
Czyli...
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 5/64
...albo...
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 6/64
...inaczej
http://programming-motherfucker.com/
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 7/64
Word, ERwin
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 8/64
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/#features
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 9/64
Z modelu danych
Hibernate hbm2ddl:
1: spring.jpa.hibernate.ddl-auto=create-drop
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 10/64
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
Odstawmy ”Badziewie do badziewia”
Kopsnij Drina - Wielki test piw w plastiku
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 12/64
Liquibase
http://www.liquibase.org/
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 13/64
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
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
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
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
Uruchamiamy liquibase:update
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 18/64
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
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
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
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.xml
7: </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
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=TRUE
2: spring.datasource.username=liquibasedemo
3: spring.datasource.password=liquibasedemo
4: spring.datasource.driverClassName=org.h2.Driver
5:
6: liquibase.change-log=classpath:db/changelog/db.changelog.xml
7: 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
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 lock
2: INFO 24.08.15 01:17: liquibase: Creating database history table with name: PUBL
3: INFO 24.08.15 01:17: liquibase: Reading from PUBLIC.DATABASECHANGELOG
4: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classp
5: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classp
6: ...
7: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classp
8: INFO 24.08.15 01:17: liquibase: Successfully released change log lock
Cały schemat zostaje utworzony w pomocniczej bazie, w tym
zawartość tabeli DATABASECHANGELOG, robimy zrzut (dump)
tej tabeli
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 24/64
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 w
bazie produkcyjnej
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 25/64
Jak wprowadzić Liquibase do instniejącego projektu?
5. Przenosimy dane do tabeli DATABASECHANGELOG z bazy
pomocniczej 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
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 z
dymem)
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.xml
7: </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
Jak wprowadzić Liquibase do istniejącego projektu?
7. Od teraz wszelkie zmiany we wszystkich bazach (w tym na
produkcji) idą przez Liquibase’a!
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 28/64
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
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, jakie
czynności może wykonać dany użytkownik.
Możliwe role:
user
admin
changeConfiguration
orderAcceptor.
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 30/64
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
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
Efekt
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 33/64
Efekt
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 34/64
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
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_rights
5: group by role_name
6: </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.id
11: from user u join user_rights ur on u.id = ur.user_id
12: join user_rights_new urn on ur.role_name = urn.role_name
13: </sql>
14: </changeSet>
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 36/64
Po migracji danych
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 37/64
Po migracji danych
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 38/64
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
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
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
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.html
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 42/64
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
Preconditions
Gdy musimy skorzystać z innego użytkownika, zależnie od typu
bazy 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
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
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
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
Porównywanie baz danych
1: Diff Results:
2: Reference Database: liqui@localhost @ jdbc:mysql://localhost:3306/public (Defau
3: Comparison Database: LIQUIBASEDEMO @ jdbc:h2:~/liquibasedemo (Default Schema: P
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): NONE
11: Unexpected Catalog(s): NONE
12: Changed Catalog(s):
13: public
14: name changed from ’public’ to ’LIQUIBASEDEMO’
15: Missing Column(s):
16: user_rights.description
17: user_rights_new.description
18: user.email
19: ...
20: Unexpected Column(s): NONE
21: ...
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 48/64
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
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:ex
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
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
DBDoc - generowanie dokumentacji w stylu JavaDoc
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 52/64
Blokowanie wykonywania zmian
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 53/64
Blokowanie wykonywania zmian
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 54/64
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:
5: at liquibase.lockservice.StandardLockService.waitForLock(StandardLockSer
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
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
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
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
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
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
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
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
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
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ę baza
danych
Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,
JEE CDI, Spring Boot
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
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ę baza
danych
Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,
JEE CDI, Spring Boot
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
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ę baza
danych
Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,
JEE CDI, Spring Boot
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
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ę baza
danych
Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,
JEE CDI, Spring Boot
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
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ę baza
danych
Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,
JEE CDI, Spring Boot
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
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ę baza
danych
Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,
JEE CDI, Spring Boot
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
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ę baza
danych
Współpracuje z: Ant, Maven, Spring, Command Line, Servlet,
JEE CDI, Spring Boot
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
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
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
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
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
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
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
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
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
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
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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
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 prawami
uż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
Pytania
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 62/64
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
Zarządzanie zmianami w relacyjnych bazach
danych
Marcin Stachniuk
Dziękuję!
30 września 2015
Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 64/64

Weitere ähnliche Inhalte

Andere mochten auch

Полный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoПолный цикл разработки на Python + Django
Полный цикл разработки на Python + Django
Azamat Tokhtaev
 

Andere mochten auch (7)

Panmind at Ruby Social Club Milano
Panmind at Ruby Social Club MilanoPanmind at Ruby Social Club Milano
Panmind at Ruby Social Club Milano
 
RVM and Ruby Interpreters @ RSC Roma 03/2011
RVM and Ruby Interpreters @ RSC Roma 03/2011RVM and Ruby Interpreters @ RSC Roma 03/2011
RVM and Ruby Interpreters @ RSC Roma 03/2011
 
Poznaj lepiej swoje srodowisko programistyczne i zwieksz swoja produktywnosc ...
Poznaj lepiej swoje srodowisko programistyczne i zwieksz swoja produktywnosc ...Poznaj lepiej swoje srodowisko programistyczne i zwieksz swoja produktywnosc ...
Poznaj lepiej swoje srodowisko programistyczne i zwieksz swoja produktywnosc ...
 
Upieksz swoje testy! Testowanie jednostkowe dla sredniozaawansowanych.
Upieksz swoje testy! Testowanie jednostkowe dla sredniozaawansowanych.Upieksz swoje testy! Testowanie jednostkowe dla sredniozaawansowanych.
Upieksz swoje testy! Testowanie jednostkowe dla sredniozaawansowanych.
 
Полный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoПолный цикл разработки на Python + Django
Полный цикл разработки на Python + Django
 
Failcon Atlanta - A Post-mortem of a healthcare startup
Failcon Atlanta - A Post-mortem of a healthcare startupFailcon Atlanta - A Post-mortem of a healthcare startup
Failcon Atlanta - A Post-mortem of a healthcare startup
 
Penetrationtestinglovesfreesoftware libreplaner2017-christianfernandez-hispag...
Penetrationtestinglovesfreesoftware libreplaner2017-christianfernandez-hispag...Penetrationtestinglovesfreesoftware libreplaner2017-christianfernandez-hispag...
Penetrationtestinglovesfreesoftware libreplaner2017-christianfernandez-hispag...
 

Ähnlich wie Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Sofiia Lahoda
 
PostgreSQL 8.3. Ćwiczenia
PostgreSQL 8.3. ĆwiczeniaPostgreSQL 8.3. Ćwiczenia
PostgreSQL 8.3. Ćwiczenia
Wydawnictwo Helion
 
SQL. Od podstaw
SQL. Od podstawSQL. Od podstaw
SQL. Od podstaw
Wydawnictwo Helion
 
Access 2002. Tworzenie baz danych
Access 2002. Tworzenie baz danychAccess 2002. Tworzenie baz danych
Access 2002. Tworzenie baz danych
Wydawnictwo Helion
 

Ähnlich wie Liquibase - Zarządzanie zmianami w relacyjnych bazach danych (20)

Jak działa rekurencyjne CTE?
Jak działa rekurencyjne CTE?Jak działa rekurencyjne CTE?
Jak działa rekurencyjne CTE?
 
Zarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychZarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danych
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
 
Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...
Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...
Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...
 
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
 
Integracja liquibase ze stroną internetową dla zarządzania mapami
Integracja liquibase ze stroną internetową dla zarządzania mapami Integracja liquibase ze stroną internetową dla zarządzania mapami
Integracja liquibase ze stroną internetową dla zarządzania mapami
 
Inicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oInicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4o
 
M4j2
M4j2M4j2
M4j2
 
M4j2
M4j2M4j2
M4j2
 
Oracle9i. Administrowanie bazami danych od podstaw
Oracle9i. Administrowanie bazami danych od podstawOracle9i. Administrowanie bazami danych od podstaw
Oracle9i. Administrowanie bazami danych od podstaw
 
MySQL prostymi słowami
MySQL prostymi słowamiMySQL prostymi słowami
MySQL prostymi słowami
 
PostgreSQL 8.3. Ćwiczenia
PostgreSQL 8.3. ĆwiczeniaPostgreSQL 8.3. Ćwiczenia
PostgreSQL 8.3. Ćwiczenia
 
Co warto wiedzieć o bazach danych
Co warto wiedzieć o bazach danychCo warto wiedzieć o bazach danych
Co warto wiedzieć o bazach danych
 
Roman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danychRoman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danych
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
 
SQL. Od podstaw
SQL. Od podstawSQL. Od podstaw
SQL. Od podstaw
 
Cwac23 4
Cwac23 4Cwac23 4
Cwac23 4
 
Access 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczneAccess 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczne
 
Access 2002. Tworzenie baz danych
Access 2002. Tworzenie baz danychAccess 2002. Tworzenie baz danych
Access 2002. Tworzenie baz danych
 
10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
10. Analizowanie potrzeb klienta i projektowanie struktury baz danych10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
 

Mehr von MarcinStachniuk

Mehr von MarcinStachniuk (20)

GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademyGraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
 
Wroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaWroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in Java
 
[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało
 
GraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoGraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za mało
 
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learnedBruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
 
[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit
 
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.org
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learned
 
Java Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąJava Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologią
 
Automatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseAutomatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object database
 
Zastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oZastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4o
 
Wprowadzenie do J2ME
Wprowadzenie do J2MEWprowadzenie do J2ME
Wprowadzenie do J2ME
 
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
 
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
 

Liquibase - Zarządzanie zmianami w relacyjnych bazach danych

  • 1. Zarządzanie zmianami w relacyjnych bazach danych Marcin Stachniuk 30 września 2015 Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 1/64
  • 2. O mnie Marcin Stachniuk Chorąży na chamberconf.pl Speaker: WrocJUG, dbconf.pl, warsjawa.pl, careercon.pl, chamberconf.pl Recenzent książki: practicalunittesting.com mstachniuk@gmail.com mstachniuk.blogspot.com @MarcinStachniuk github.com/mstachniuk Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 2/64
  • 3. Jak zarządzać zmianami w relacyjnych bazach danych? Jak zarządzać zmianami w relacyjnych bazach danych? Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 3/64
  • 4. Ręcznie, bezpośrednio na bazie Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 4/64
  • 5. Czyli... Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 5/64
  • 6. ...albo... Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 6/64
  • 8. Word, ERwin Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 8/64
  • 9. 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/#features Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 9/64
  • 10. Z modelu danych Hibernate hbm2ddl: 1: spring.jpa.hibernate.ddl-auto=create-drop Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 10/64
  • 11. 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
  • 12. Odstawmy ”Badziewie do badziewia” Kopsnij Drina - Wielki test piw w plastiku Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 12/64
  • 13. Liquibase http://www.liquibase.org/ Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 13/64
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. Uruchamiamy liquibase:update Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 18/64
  • 19. 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
  • 20. 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
  • 21. 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
  • 22. 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.xml 7: </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
  • 23. 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=TRUE 2: spring.datasource.username=liquibasedemo 3: spring.datasource.password=liquibasedemo 4: spring.datasource.driverClassName=org.h2.Driver 5: 6: liquibase.change-log=classpath:db/changelog/db.changelog.xml 7: 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
  • 24. 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 lock 2: INFO 24.08.15 01:17: liquibase: Creating database history table with name: PUBL 3: INFO 24.08.15 01:17: liquibase: Reading from PUBLIC.DATABASECHANGELOG 4: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classp 5: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classp 6: ... 7: INFO 24.08.15 01:17: liquibase: classpath:db/changelog/db.changelog.xml: classp 8: INFO 24.08.15 01:17: liquibase: Successfully released change log lock Cały schemat zostaje utworzony w pomocniczej bazie, w tym zawartość tabeli DATABASECHANGELOG, robimy zrzut (dump) tej tabeli Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 24/64
  • 25. 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 w bazie produkcyjnej Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 25/64
  • 26. Jak wprowadzić Liquibase do instniejącego projektu? 5. Przenosimy dane do tabeli DATABASECHANGELOG z bazy pomocniczej 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
  • 27. 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 z dymem) 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.xml 7: </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
  • 28. Jak wprowadzić Liquibase do istniejącego projektu? 7. Od teraz wszelkie zmiany we wszystkich bazach (w tym na produkcji) idą przez Liquibase’a! Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 28/64
  • 29. 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
  • 30. 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, jakie czynności może wykonać dany użytkownik. Możliwe role: user admin changeConfiguration orderAcceptor. Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 30/64
  • 31. 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
  • 32. 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
  • 33. Efekt Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 33/64
  • 34. Efekt Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 34/64
  • 35. 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
  • 36. 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_rights 5: group by role_name 6: </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.id 11: from user u join user_rights ur on u.id = ur.user_id 12: join user_rights_new urn on ur.role_name = urn.role_name 13: </sql> 14: </changeSet> Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 36/64
  • 37. Po migracji danych Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 37/64
  • 38. Po migracji danych Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 38/64
  • 39. 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
  • 40. 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
  • 41. 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
  • 42. 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.html Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 42/64
  • 43. 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
  • 44. Preconditions Gdy musimy skorzystać z innego użytkownika, zależnie od typu bazy 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
  • 45. 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
  • 46. 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
  • 47. 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
  • 48. Porównywanie baz danych 1: Diff Results: 2: Reference Database: liqui@localhost @ jdbc:mysql://localhost:3306/public (Defau 3: Comparison Database: LIQUIBASEDEMO @ jdbc:h2:~/liquibasedemo (Default Schema: P 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): NONE 11: Unexpected Catalog(s): NONE 12: Changed Catalog(s): 13: public 14: name changed from ’public’ to ’LIQUIBASEDEMO’ 15: Missing Column(s): 16: user_rights.description 17: user_rights_new.description 18: user.email 19: ... 20: Unexpected Column(s): NONE 21: ... Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 48/64
  • 49. 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
  • 50. 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:ex 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
  • 51. 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
  • 52. DBDoc - generowanie dokumentacji w stylu JavaDoc Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 52/64
  • 53. Blokowanie wykonywania zmian Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 53/64
  • 54. Blokowanie wykonywania zmian Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 54/64
  • 55. 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: 5: at liquibase.lockservice.StandardLockService.waitForLock(StandardLockSer 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
  • 56. 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
  • 57. 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
  • 58. 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
  • 59. 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
  • 60. 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
  • 61. 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
  • 62. 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
  • 63. 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
  • 64. 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ę baza danych Współpracuje z: Ant, Maven, Spring, Command Line, Servlet, JEE CDI, Spring Boot Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
  • 65. 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ę baza danych Współpracuje z: Ant, Maven, Spring, Command Line, Servlet, JEE CDI, Spring Boot Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
  • 66. 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ę baza danych Współpracuje z: Ant, Maven, Spring, Command Line, Servlet, JEE CDI, Spring Boot Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
  • 67. 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ę baza danych Współpracuje z: Ant, Maven, Spring, Command Line, Servlet, JEE CDI, Spring Boot Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
  • 68. 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ę baza danych Współpracuje z: Ant, Maven, Spring, Command Line, Servlet, JEE CDI, Spring Boot Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
  • 69. 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ę baza danych Współpracuje z: Ant, Maven, Spring, Command Line, Servlet, JEE CDI, Spring Boot Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
  • 70. 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ę baza danych Współpracuje z: Ant, Maven, Spring, Command Line, Servlet, JEE CDI, Spring Boot Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 58/64
  • 71. 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
  • 72. 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
  • 73. 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
  • 74. 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
  • 75. 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
  • 76. 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
  • 77. 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
  • 78. 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
  • 79. 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
  • 80. 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
  • 81. 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 prawami uż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
  • 82. 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 prawami uż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
  • 83. 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 prawami uż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
  • 84. 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 prawami uż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
  • 85. 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 prawami uż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
  • 86. 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 prawami uż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
  • 87. 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 prawami uż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
  • 88. 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 prawami uż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
  • 89. 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 prawami uż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
  • 90. 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 prawami uż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
  • 91. Pytania Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 62/64
  • 92. 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
  • 93. Zarządzanie zmianami w relacyjnych bazach danych Marcin Stachniuk Dziękuję! 30 września 2015 Marcin Stachniuk Zarządzanie zmianami w relacyjnych bazach danych 64/64