oracle Liquibase:删除的表格重新出现

kcwpcxri  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(166)

我们正在使用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-Files。因此在示例中,我们添加了一个foobar. yaml。在foobar.yaml中,我们现在添加了一个新的changes:

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


在导入yaml后,表就像预期的那样消失了。现在奇怪的是,在重新导入后,Liquibase导入了更改集FOOBAR-1,FOOBAR-2和FOOBAR-3,就像它不知道它们已经被导入一样,但是为什么以及如何才能确保Liquibase不会重试已经在数据库表中的更改集呢?文件名有影响吗?我不希望如此。
数据库日志表看起来像这样(ID,DATEEXECUTED,ORDEREEXECUTED,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)不会再次执行。

aoyhnmkz

aoyhnmkz1#

以下属性组合创建唯一的changeSet标识符:

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

查看documentation
每个更改日志包含id和author标签。id标签、author标签、搜索路径位置和更改日志文件的名称为更改日志创建了唯一的标识符。
为了确保liquibase不执行已经运行的changeSets,你需要保持上述所有属性不变,并且不改变databasechangelog表。
以任何方式改变现有的changeset都不是一个好的做法。这是一个“只向前”的事情。如果你需要进行更改,创建新的changeset并保留现有的。
这背后的主要思想是在所有环境之间保持DB模式的一致性。

相关问题