首页 > 解决方案 > 如何重用包含视图代码的变更集

问题描述

问题:

liquibase我在由changeSets驱动的数据库中有几个视图。

有时我需要重新创建这些视图。原因总是不同:

为此,我只需创建一个新的 changeLog 文件并复制粘贴所有包含所有视图代码的 changeSet 并进行必要的修改。

当视图代码更改时 - 没关系 - 不同的更改日志包含不同的视图代码。

然而,有些情况下必须重新创建视图,但视图代码根本没有改变。

例如,表a和视图b

create table a(id int primary key);
create view b as select id from a;

后来,我决定将a.id列类型更改为bigint

alter table a alter id type bigint

此更改需要b重新创建视图。所以,现在我必须使用与以前的变更集完全相同的视图代码创建新的变更集。

有什么方法可以避免使用liquibaseandpostgresql吗?

标签: postgresqlliquibase

解决方案


想到了两种解决方案:

1(脏的)

每个 Liquibase changeSet 都有自己的 ID。您可以打开databasechangelog表并删除需要重新运行的变更集 ID 的记录。

这样 Liquibase 会认为这些 changeSets 还没有运行,它们将被再次执行。

2(清洁工)

Liquibase 有一个很好的特性,叫做contexts(看看这个)。您可以将上下文添加到您可能需要重新运行的变更集(例如recreate-view)。当您实际上需要重新运行这些更改集时,您始终可以使用选择的recreate-view.

由于您需要重复执行这些变更集,您可以将runAlways="true"(查看链接)添加到这些变更集。这样它们每次都会被执行,并且通过设置所需的内容,context您可以确定 Liquibase 将处理的 changeLog 的范围。


推荐阅读