Share
Embed
Управление версиями БД приложения с помощью Liquibase
Выступление Амира Кадырова, разработчика Oracle в компании «Интегратор ИТ», с докладом на CUSTIS Meetup: Russian Oracle User Group (Москва, 31 июля 2018).
CUSTIS
July 31, 2018
Transcript
26 slides
-
Цели 1. Накат Dev->Test->Prod без потери изм енений; 2. Накат
по одной кнопке; 3. Информ ация об изм енения х д.б. атрибутом БД; 4. Одна точ ка входа для наката с любой версии; 5. Возм ож ность ветвления в зависим ости от контекста (context). -
LiquiBase. Что и откуда. J ava-библиотека с откры ты м
исходны м кодом , распространя ем ая на сайте liquibase.org под лицензией Apache 2.0. Dem o-версия от ком м ерч еского продукта Datical: www.datical.com . Прим ер использования : https://github.com /akk0rd87/OracleSam pleSchem as- HR -
Типичная структура каталогов в СКВ +db +patches |-packages |-release_1.0.0 |-views
|-release_1.0.1 |-procedures |-release_1.0.2 |-types |-release_1.0.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> -
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> -
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> -
ChangeSet. Вызов SQL -файла. <changeSet author="akk0rd87" id="views:emp_details_view" context="all" runOnChange="true"> <sqlFile
path="hr\views\emp_details_view.sql"/> </changeSet> -
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> -
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> -
ChangeSet. Атрибуты. Атрибут Обязательность Описание id Да Уникальный символьно-цифровой идентификатор
author Да Автор изменений runAlways Нет Запускать при каждом вызове runOnChange Нет Запускать только при изменении context Нет Позволяет группировать changeSet-ы по окружениям -
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> -
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> -
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> -
ChangeSet. Comments. <changeSet author="akk0rd87" id="set current_schema=hr" context="all" runAlways="true" runOnChange="true"> <comment>Change
current schema</comment> <sql> alter session set current_schema = "HR"; </sql> </changeSet> -
Запуск из командной строки 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 -
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> -
Команда DbDoc HTML-докум ентация на основ ании текущего состоя ния
БД и changeLog-а: - текущий набор таблиц с поля м и; - pending changes - изм енения , которы е накатя тся , если запустить сборку; - история запуска changeSet-ов.