3.9 KiB
aliases | tags | date | zero-link | parents | linked | |||
---|---|---|---|---|---|---|---|---|
|
2023-11-02 |
|
|
Проблема
При создании VIEW в Liquibase способом аналогичным таблице возникает проблема поддержки этой VIEW, так как она может часто меняться. Также будет проблема, когда меняется исходная таблица, которую использует вьюха. Еще больше проблем, если к одной таблице подвязано N вьюх. Через пару изменений становится очень сложно находить актуальный скрипт создания VIEW, чтобы его изменить.
Решение
Для решений этой проблемы все VIEW выносятся в отдельный changeLog файл. Этот changeLog файл всегда будет в конце списка в master changeLog-файле, потому что вьюхи необходимо создавать по уже созданным актуальным базам данных.
Пример master changeLog файла.
<?xml version="1.1" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<include file="v.1.0.0/changelog.xml" relativeToChangelogFile="true"/>
<!-- VIEWS -->
<include file="views/changelog.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
При этом в chageLog файле для создания вьюх необходимо поддерживать следующий порядок.
- Сначала идет changeSet, который удаляет вьюху, если она уже существует
- Потом идет changeSet, который создает новую вьюху.
Важным здесь является указывание следующий параметров changeSet-а:
runAlways="true"
- говорит Liquibase всегда выполнять этот changeSet, даже если он был уже выполнен ранее.runOnChange="true"
- говорит Liquibase игнорировать несовпадение чек-суммы данного changeSet-а.
Пример changeSet-ов.
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<changeSet id="drop-view" author="uPagge" runAlways="true" runOnChange="true">
<preConditions onFail="CONTINUE">
<viewExists viewName="view_name"/>
</preConditions>
<dropView viewName="view_name"/>
</changeSet>
<changeSet id="create-view" author="uPagge" runAlways="true" runOnChange="true">
<preConditions onFail="CONTINUE">
<not>
<viewExists viewName="view_name"/>
</not>
</preConditions>
<createView viewName="view_name">
...SQL FOR CREATE VIEW...
</createView>
</changeSet>
</databaseChangeLog>
Таким образом у нас появляется единое место, которое содержит актуальные структуры наших VIEW.