在我的liquibase项目中,我有一个sql视图,它定义在一个名为create_myview. sql
的文件中。
每次对视图进行更改时,即删除或重命名一列,而不是创建包含ALTER
语句的新更改集,而是更改此文件中的视图定义本身。
此文件将runOnChange属性设置为true,以便在进行更改时,删除视图并在下次运行liquibase更新时重新创建。因此,当其内容更改时,可以一遍又一遍地运行相同的文件,即它是“可重新运行的”。
由于视图的先前定义会随着每次更改而被覆盖,因此回滚到以前的版本是一个挑战,我无法找到最好的方法来做到这一点。
目前,我存储以前视图定义的唯一方法是通过git分支,即每次视图更改我都会创建一个新分支。
理想情况下,我希望签出一个旧分支并能够回滚到当前签出的定义。我希望能够轻松地在版本之间跳转。
在我的项目中定义的其他不可重新运行的变更集使用--rollback
标记,该标记在sql文件中指定,并为每个表更改提供逆sql操作,例如,如果使用一次更改语句将一列添加到表中,则指定的逆sql语句如下所示:
-- rollback ALTER TABLE x DROP COLUMN name;
在我的可重跑视图文件中使用此标记的等效方法是将整个先前的视图定义复制到此回滚标记中,这似乎不是最佳实践。
但是,liquibase rollback
在没有指定--rollback标记的情况下似乎无法工作。
文件结构:
myDB/
changelog/
ver1/
rerunnable/
create_myview.sql
rerunnable.myDB.xml
myDB.changelog-root.xml
这就是我如何进行更改并将视图从一个版本更新到下一个版本。
>
签出新分支
git checkout -b c-01
添加更改以查看
create_myview. sql:
-- changeset john:c-01 runOnChange:true
DROP VIEW my_view IF EXISTS my_view;
CREATE my_view AS
SELECT name, date
FROM my_table;
...
rerunnable. myDB.xml
<changeSet author="john" id="c-01">
<tagDatabase tag="1.0.0"/>
</changeSet>
接下来,在删除date
列时对视图进行更新。
git checkout-b c-02
-- changeset john:c-02 runOnChange:true
DROP VIEW my_view IF EXISTS my_view;
CREATE my_view AS
SELECT name
FROM my_table;
...
<changeSet author="john" id="c-02">
<tagDatabase tag="2.0.0"/>
</changeSet>
liquibase更新
此时,数据库中的视图已更新为最新更新,没有日期列,数据库echangelog如下所示:
从这一点上,我无法回滚到c-01/1.0.0的视图。
我期望/希望可能的行为是这样的:
不幸的是,liquibase update什么都不做,liquibase rollback指定我需要一个--rollback语句。
runOnly
属性在这里可以作为一个很好的解决方案吗?
对于那些不在Liquibase论坛上的人,我在那里回答了这个问题:
https://forum.liquibase.org/t/how-do-i-manage-rolling-back-changes-made-to-rerunnable-runonchange-true-changelogs-that-contain-stored-logic/7780