72 lines
3.9 KiB
Markdown
72 lines
3.9 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date: "[[2023-11-02]]"
|
|||
|
zero-link:
|
|||
|
- "[[00 Разработка]]"
|
|||
|
parents:
|
|||
|
- "[[Liquibase]]"
|
|||
|
linked:
|
|||
|
---
|
|||
|
## Проблема
|
|||
|
При создании VIEW в Liquibase способом аналогичным таблице возникает проблема поддержки этой VIEW, так как она может часто меняться. Также будет проблема, когда меняется исходная таблица, которую использует вьюха. Еще больше проблем, если к одной таблице подвязано N вьюх. Через пару изменений становится очень сложно находить актуальный скрипт создания VIEW, чтобы его изменить.
|
|||
|
## Решение
|
|||
|
Для решений этой проблемы все VIEW выносятся в отдельный changeLog файл. Этот changeLog файл всегда будет в конце списка в master changeLog-файле, потому что вьюхи необходимо создавать по уже созданным актуальным базам данных.
|
|||
|
|
|||
|
Пример master changeLog файла.
|
|||
|
|
|||
|
```xml
|
|||
|
<?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
|
|||
|
<?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.
|