Oracle迁移PostgreSQL后Liquibase锁设置失败,是否可配置语句替代改列类型
Oracle迁移PostgreSQL后Liquibase锁表异常解决方案
问题原因
Oracle中databasechangeloglock表的LOCKED列是NUMBER(1)类型,迁移到PostgreSQL后被转为int4,但Liquibase默认生成的锁表更新语句使用boolean类型值(TRUE/FALSE),PostgreSQL不支持整数与布尔值直接比较,触发报错:
ERROR: operator does not exist: integer = boolean
可行解决方案
方案1:修改PostgreSQL列类型为boolean
直接将LOCKED列转换为boolean类型,适配Liquibase默认语句逻辑:
ALTER TABLE databasechangeloglock ALTER COLUMN LOCKED TYPE boolean USING CASE WHEN LOCKED = 1 THEN TRUE ELSE FALSE END;
转换完成后,Liquibase原始的锁表更新语句即可正常执行。
方案2:配置Liquibase适配整数类型列
无需修改表结构,通过Liquibase参数指定锁表列的类型为INT,让它生成用0/1替代TRUE/FALSE的兼容语句:
- 在
liquibase.properties配置文件中添加:lockColumnType: INT - 或在命令行执行时附加参数:
liquibase update --lock-column-type=INT - 也可以在changelog文件的根标签中配置:
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd" lockColumnType="INT">
配置生效后,Liquibase会生成如下适配int4列的更新语句:
UPDATE databasechangeloglock SET LOCKED = 1, LOCKEDBY = '<<<machine name>>>', LOCKGRANTED = '2024-11-01 17:17:38.911' WHERE ID = 1 AND LOCKED = 0
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

