Liquibase:删除的表重新出现

问题描述 投票:0回答:1

我们正在使用 Liquibase 来部署数据库中的更改,我们在这个领域还很陌生。我现在发现了一些我不确定它是错误还是功能的东西。

例如,我们以这个 yaml 为例:

databaseChangeLog:
- changeSet:
    id: FOOBAR-1
    failOnError: false
    author: anyA
    changes:
    - createTable:
        columns:
        - column:
            constraints:
              nullable: false
            name: COLA
            type: VARCHAR2(1000 BYTE)
        - column:
            name: COLB
            type: VARCHAR2(1000 BYTE)
        - column:
            name: VOLC
            type: VARCHAR2(1000 BYTE)
        - column:
            name: COLD
            type: VARCHAR2(1000 BYTE)
        tableName: FOOBAR
- changeSet:
    id: FOOBAR-2
    failOnError: false
    author: anyA
    changes:
    - createIndex:
        columns:
        - column:
            name: COLA
        indexName: FOOBAR_PK
        tableName: FOOBAR
        unique: true
- changeSet:
    id: FOOBAR-3
    failOnError: false
    author: anyA
    changes:
    - addUniqueConstraint:
        columnNames: COLA
        constraintName: FOOBAR_PK
        forIndexName: FOOBAR_PK
        tableName: FOOBAR

在属于其他表的 yaml 中还有很多其他变更集。我们现在将此 yaml 称为 init_2023.yaml。这个 yaml 是由 Liquibase 导入的,一切正常。

为了使表彼此独立,因为我们没有数据库的版本,更像是每个表都有一个版本,我们为每个表制作了一个yaml。因此,我们通过将 init_2023.yaml 拆分为 tablename.yaml 制作了很多 yaml 文件。所以在示例中是 foobar.yaml。在 foobar.yaml 中,我们现在添加了一个新的变更集:

- changeSet:
    id: FOOBAR-4
    failOnError: false
    author: anyB
    changes:
    - dropTable:
        cascadeConstraints: true
        tableName: FOOBAR

使用 drop 导入 yaml 后,表格如预期消失了。 现在很奇怪,重新导入后,Liquibase 导入了变更集 FOOBAR-1、FOOBAR-2 和 FOOBAR-3,就像它不知道它们已经导入一样,但是为什么以及如何确保 Liquibase 不会重试以下变更集已经在 DATABASECHANGLOG 表中了吗?文件名有影响吗?我不希望如此。

DATABASECHANGLOG 表如下所示(ID、DATEEXECUTED、ORDEREXECUTED、DEPLOYMENT_ID 也不是实数,它们只是按正确的顺序排列):

|    ID    | AUTHOR |  FILENAME      |    DATEEXECUTED     | ORDEREXECUTED |       MD5SUM        | DEPLOYMENT_ID
| -------- | ------ | -------------- | ------------------- | ------------- | ------------------- |
| FOOBAR-3 | anyA   | foobar.yaml    | 23.10.2023 12:00:00 | 517           | 8:foobar3md5sum_abc | 63
| FOOBAR-2 | anyA   | foobar.yaml    | 23.10.2023 12:00:00 | 516           | 8:foobar2md5sum_def | 63
| FOOBAR-1 | anyA   | foobar.yaml    | 23.10.2023 12:00:00 | 515           | 8:foobar1md5sum_ghi | 63
| FOOBAR-4 | anyB   | foobar.yaml    | 23.10.2023 11:00:00 | 504           | 8:foobar2md5sum_def | 52
| FOOBAR-3 | anyA   | init_2023.yaml | 01.09.2023 12:00:00 | 103           | 8:foobar3md5sum_abc | 11
| FOOBAR-2 | anyA   | init_2023.yaml | 01.09.2023 12:00:00 | 102           | 8:foobar2md5sum_def | 11
| FOOBAR-1 | anyA   | init_2023.yaml | 01.09.2023 12:00:00 | 101           | 8:foobar1md5sum_ghi | 11

我的期望是已经导入(通过 ID)的变更集将不会再次执行。

database oracle liquibase drop-table
1个回答
0
投票

以下属性组合创建唯一的变更集标识符:

  • 更改设置 ID
  • 更改设置作者
  • 更改日志文件名
  • 更改日志位置

查看文档

每个变更集都包含 id 和作者标签。 id 标签、作者标签、搜索路径位置和变更日志文件的名称为变更集创建唯一标识符。

为了确保 liquibase 不执行已运行的变更集,您需要保持上述所有属性不变,而不是更改

databasechangelog
表。

以任何方式改变现有的变更集都不是一个好习惯。这是“仅向前”的事情。如果您需要进行更改,请创建新的更改集并保留现有的更改集。

这背后的主要思想是维护所有环境之间数据库模式的一致性。

© www.soinside.com 2019 - 2024. All rights reserved.