Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Управление версиями БД приложения с помощью Liquibase

CUSTIS
July 31, 2018

Управление версиями БД приложения с помощью Liquibase

Выступление Амира Кадырова, разработчика Oracle в компании «Интегратор ИТ», с докладом на CUSTIS Meetup: Russian Oracle User Group (Москва, 31 июля 2018).

CUSTIS

July 31, 2018
Tweet

More Decks by CUSTIS

Other Decks in Programming

Transcript

  1. Цели 1. Накат Dev->Test->Prod без потери изм енений; 2. Накат

    по одной кнопке; 3. Информ ация об изм енения х д.б. атрибутом БД; 4. Одна точ ка входа для наката с любой версии; 5. Возм ож ность ветвления в зависим ости от контекста (context).
  2. LiquiBase. Что и откуда. J ava-библиотека с откры ты м

    исходны м кодом , распространя ем ая на сайте liquibase.org под лицензией Apache 2.0. Dem o-версия от ком м ерч еского продукта Datical: www.datical.com . Прим ер использования : https://github.com /akk0rd87/OracleSam pleSchem as- HR
  3. ChangeSet - атом арны й набор изм енений. <changeSet author="akk0rd87"

    id="create_hr_user" context="all"> <sql> create user hr identified by "12345" default tablespace users quota 50m on users account lock; </sql> </changeSet>
  4. ChangeSet - атом арны й набор изм енений. <changeSet author="akk0rd87"

    id="data:countries" context="all"> <sql> insert into countries(countryid, country_name, region_id) values ('AR', 'Argentina', 2); insert into countries(country_id, country_name, region_id) values ('AU', 'Australia', 3); </sql>
  5. ChangeSet. XML -ком анды <changeSet author="akk0rd87" id="create table countries" context="all">

    <createTable tableName="countries"> <column name="country_id" type="char(2 byte)"> <constraints primaryKey="true" nullable="false"/> </column> <column name="country_name" type="varchar2(40 byte)"/> <column name="region_id" type="number"/> <column name="state" type="char(2)"/> </createTable> </changeSet>
  6. ChangeLog - последовательность ChangeSet-ов <?xml version="1.0" encoding="UTF-8" standalone="no"?> <databaseChangeLog ...>

    <changeSet author="akk0rd87" id="data:regions" context="all"> ... </changeSet> <changeSet author="akk0rd87" id="data:countries" context="all"> ... </changeSet> </databaseChangeLog>
  7. ChangeLog. Вложенность <?xml version="1.0" encoding="UTF-8" standalone="no"?> <databaseChangeLog ...> <include file="hr/user/user.xml"/>

    <include file="hr/schema/schema.xml"/> <include file="hr/schema/sequences.xml"/> <include file="hr/procedures/procedures.xml"/> <include file="hr/views/views.xml"/> <include file="hr/data/data.xml"/> <include file="hr/schema/fk_constraints.xml"/> </databaseChangeLog>
  8. ChangeSet. Атрибуты. Атрибут Обязательность Описание id Да Уникальный символьно-цифровой идентификатор

    author Да Автор изменений runAlways Нет Запускать при каждом вызове runOnChange Нет Запускать только при изменении context Нет Позволяет группировать changeSet-ы по окружениям
  9. ChangeSet. runOnChange, runAlways <changeSet author="akk0rd87" id="procedures:add_job_history" context="all" runOnChange="true"> <sqlFile path="hr\procedures\add_job_history.sql"

    splitStatements="false"/> </changeSet> <changeSet author="akk0rd87" id="set current_schema=hr" context="all" runAlways="true" runOnChange="true"> <sql> alter session set current_schema = "HR"; </sql> </changeSet>
  10. ChangeSet. preConditions: SQL <changeSet author="akk0rd87" id="create_ext_data_user" context="all" runAlways="true" runOnChange="true"> <preConditions

    onFail="CONTINUE"> <sqlCheck expectedResult="0">select count(*) from dba_users where username = 'EXT_DATA'</sqlCheck> </preConditions> <sql> create user ext_data identified by "12345" default tablespace users quota 100m on users; </sql> </changeSet>
  11. ChangeSet. preConditions: XML <changeSet author="akk0rd87" id="EXT_DATA.EXT_FULL_WORD_LIST" context="all" runAlways="true" runOnChange="true"> <preConditions

    onFail="CONTINUE"> <not> <tableExists tableName="EXT_FULL_WORD_LIST" schemaName="EXT_DATA"/> </not> </preConditions> <sql> ... </sql> </changeSet>
  12. Запуск из командной строки java -Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=US ^ -jar

    lib/liquibase.jar ^ --logLevel=info ^ --classpath=lib/liquibase-ojdbc.jar ^ --driver=oracle.jdbc.OracleDriver ^ --changeLogFile=install.xml ^ --url="jdbc:oracle:thin:@127.0.0.1:1521:xe" ^ --username=akk0rd87 ^ --password=12345 ^ update
  13. ChangeSet. Правка задним числом <changeSet author="akk0rd87" id="create_hr_user" context="all"> <sql> create

    user hr identified by "12345" default tablespace users quota 50m on users account lock /*create user*/; </sql> </changeSet>
  14. Команда DbDoc HTML-докум ентация на основ ании текущего состоя ния

    БД и changeLog-а: - текущий набор таблиц с поля м и; - pending changes - изм енения , которы е накатя тся , если запустить сборку; - история запуска changeSet-ов.