【问题标题】:How to reuse changeSets containing view code如何重用包含视图代码的变更集
【发布时间】:2021-11-02 13:11:23
【问题描述】:

问题:

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

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

  • 错误
  • 要求更改
  • 基础表更改

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

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

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

例如,表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 娱乐。 所以,现在我必须使用与以前的变更集完全相同的代码视图创建新的变更集。

有没有办法使用liquibasepostgresql 来避免这种情况?

【问题讨论】:

    标签: postgresql liquibase


    【解决方案1】:

    我就是这样做的:

    <changeSet id="#6" author="hungpv" runOnChange="true" runOrder="last">
        <sqlFile
            endDelimiter="\nGO"
            splitStatements="true" 
            path="db/run-on-change/views/V_LICENSE_PLATE.sql" />
        <rollback>
        </rollback>
    </changeSet>
    

    看,我们有runOnChange=truerunOrder=last。这意味着这个V_LICENSE_PLATE.sql 文件将在每次更改时运行,在所有其他更改集运行并完成之后。在您的情况下,您可以使用 runAlways=true 而不是 runOnChange

    例如:您在 changeSet #200(最新)更改列的数据类型,并在 changeset #6 处具有以下代码

    <changeSet id="#6" author="acc15" runAlways="true" runOrder="last">
        <sqlFile
            endDelimiter="\nGO"
            splitStatements="true" 
            path="db/run-always/views/V_XXX.sql" />
        <rollback>
        </rollback>
    </changeSet>
    

    liquibase通过所有changeSets(不带runOrder=last)后,会继续执行最后一个runOrder和任务完成的changeSets

    P/s:确保您的 db.changelog.xml 的 xsi:schemaLocation 必须包含 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd

    【讨论】:

      【解决方案2】:

      想到了两种解决方案:

      1(肮脏的)

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

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

      2(更清洁的)

      Liquibase 有一个很好的功能,叫做contexts(请查看this)。您可以向可能需要重新运行的变更集添加上下文(例如recreate-view)。当您实际上需要重新运行这些变更集时,您始终可以使用所选的recreate-view 运行 Liquibase。

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

      【讨论】:

        猜你喜欢
        • 2012-01-22
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 2011-02-07
        • 1970-01-01
        • 2015-12-21
        • 2020-01-14
        • 1970-01-01
        相关资源
        最近更新 更多