为了修复漏洞,我升级了 dockerfile 中的 docker 镜像版本:
旧:
FROM liquibase/liquibase:4.4
新:
FROM liquibase/liquibase:4.20
但是我开始遇到错误:
addAfterColumn is not allowed on postgresql
我开始调查这个错误,发现在一些变更集中使用了
addAfterColumn
。
<changeSet author="***" id="***">
<addColumn tableName="my_table" >
<column afterColumn="existing_column"
name="new_column"
type="varchar(255)" >
<constraints nullable="true"/>
</column>
</addColumn>
</changeSet>
</databaseChangeLog>
我也发现了这个话题:
https://github.com/liquibase/liquibase/issues/3091
所以我刚刚删除了
afterColumn
,但我不确定我会遇到什么副作用?我不熟悉使用afterColumn
的原因,但如果将其删除,它可能毫无用处,但我找不到任何有用的信息。
还有其他选项可以解决该问题吗?因为编辑 liquibase 脚本会破坏现有数据库的校验和
删除“afterColumn”,以便它在新的 ENV 中工作。 为了避免在已执行更改集的 ENV 中验证失败,添加原始校验和有效:
<changeSet>
<validCheckSum>9:6a4c63a04890c57dd610abc39389b4ce</validCheckSum>
or
<validCheckSum>ANY</validCheckSum>
如此拉取请求所示,之前 liquibase 没有警告可能不应用列排序,因为数据库不支持它。因此,它在旧版本中默默失败,但现在显示错误。引用最重要的一句话:
重大更改:因为我修复了验证逻辑,所以任何在不支持该功能的数据库的 addColumn 上具有 beforeColumn 或 afterColumn 或位置属性的人现在都会收到验证错误,而不是被忽略。
您可以尝试从这里使用
modifySql
提出建议:
https://github.com/liquibase/liquibase/issues/3094#issuecomment-1195961510
<changeSet id="***" author="***">
<addColumn tableName="my_table">
<column name="new_column" type="varchar(255)"/>
</addColumn>
<modifySql dbms="postgresql">
<append value=" position 4"/>
</modifySql>
</changeSet>
看起来像在 liquibase 4.13 https://github.com/liquibase/liquibase/pull/2943 他们修复了一些不需要修复的东西https://github.com/liquibase/liquibase/ issues/3091 他们正在尝试增强/修复自己的修复。除了破坏向后兼容性(如 @gstackoverflow 在评论中所写)之外,当产品支持多种类型的数据库时,它还会破坏逻辑(对于 mySQL 没有错误,对于 Oracle/MsSQL/PostgreSQL 错误)。
removeChangeSetProperty
来解决此问题。因此,根据您的情况,解决方法是:
<removeChangeSetProperty change="addColumn" remove="afterColumn" dbms="postgresql" />
请记住,应将此行添加到使用
afterColumn
的所有变更日志中。有一个功能请求让它与 include
和 includeAll
一起使用,因此可以只声明一次:https://github.com/liquibase/liquibase/issues/5290
截至撰写本文时,即 2023 年 12 月 24 日,该问题尚未解决。