Liquibase - 验证失败校验和已更改

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

这是我的changelog.sql的第一个版本:

-- liquibase formatted sql

-- changeset kh:1
CREATE TABLE test_table (test_id INT, test_column VARCHAR(256), PRIMARY KEY (test_id))

--changeset kh:2
INSERT INTO test_table (test_id, test_column) VALUES(3,'saket');

这是我的changelog.sql 的更新(在第一个变更集中添加了一列):

-- liquibase formatted sql

-- changeset kh:1
CREATE TABLE test_table (test_id INT, test_column VARCHAR(256), test_column2 VARCHAR(256), PRIMARY KEY (test_id))

--changeset kh:2
INSERT INTO test_table (test_id, test_column) VALUES(3,'saket');

我使用以下命令执行 liquibase 更新:

docker run --rm -v /changelog:/liquibase/changelog liquibase/liquibase \
--url=jdbc:postgresql://xxxxxxxxxx:5432/postgres \
--changelog-file=changelog.sql --username=xxxx \
--password=xxxx update

我收到此错误:

Caused by: liquibase.exception.ValidationFailedException: Validation Failed:
     1 changesets check sum
          changelog.sql::1::kh was: 8:46ea95d67274343c559a1c5ddc8ee33 but is now: 8:ab7361c532323a6a32bc79d230a46574

我知道,在生产环境中运行它时,它应该失败,以免再次错误地启动脚本,但是,在非生产环境中,它应该如何工作?

我想象了 DevOps(非生产)场景中的三种解决方案:

  1. 第一步恢复数据库并执行特定版本的变更日志。
  2. 对于非产品,忽略校验和验证
  3. 修改变更日志并添加新的变更集。-就我的口味而言,这是最不正确的

在非生产环境中,可能需要对 SQL 进行更改,直到新功能得到验证。最佳实践是什么,还有其他解决方案吗?

liquibase checksum liquibase-sql
2个回答
1
投票

校验和错误表明您正在修改已在特定数据库目标中执行的变更集。 因此,Liquibase 不明白您为什么要进行此修改。

sql语句“CREATE TABLE test_table”无法再次执行,因此添加附加列没有意义。

如果您想向已创建的表添加列,您实际上只有 2 个选择:

  1. 删除并重新创建表以包含新列
  2. 更改表格以添加新列

选项1可以通过使用Liquibase回滚,然后修改变更集,然后Liquibase更新来完成。 选项 2 可以通过添加新的变更集来完成。

两者都是 100% 有效的选项。


0
投票

当您修改旧的更改集时,应用更改集时,此校验和将存储在 DATABASECHANGELOG 表中。

如果修改了变更集,校验和会发生变化,Liquibase 将抛出错误,因为存储的校验和不再与重新计算的校验和匹配。

您可以使用 validCheckSum 标签,它告诉 Liquibase 考虑对变更集有效的特定校验和值。

<validCheckSum>your-current-checksome</validCheckSum>
© www.soinside.com 2019 - 2024. All rights reserved.