digital-garden/knowledge/dev/Упрощаем создание view в Liquibase.md
2024-06-13 21:01:37 +03:00

72 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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.