【发布时间】:2018-02-15 04:17:14
【问题描述】:
我有一个多租户应用程序。每个租户在数据库中都有自己的架构。所有的模式在逻辑上都是相同的,唯一的区别是模式名称(实际的模式)。
我希望能够运行 liquibase:update schemaName=my-schema 来更新给定架构。
我的changelogs.xml 看起来像这样:
<createTable tableName="myTable" schemaName="${schemaName}">
其中schemaName 被参数化,并作为动态属性获得。但是,问题在于databasechangelog 和databasechangeloglock 表仅存在于默认模式中,该模式用于打开与数据库的连接。我在liquibase.properties 中配置了这个。
liquibase.properties
url: jdbc:postgresql://localhost:5431/my-db?currentSchema=public
现在作为参数给出的模式和属性中定义的模式不匹配,即。作为参数给出的架构没有自己的databasechangelog 和databasechangeloglock,而是根据public 架构中的这些表验证自己。
错误
Error setting up or running Liquibase: Validation Failed:
[ERROR] 1 change sets check sum
[ERROR] 001-add-table-mytable.xml::001::wesleyy was: 7:fb1f721005e26807efc07bde45f459b9 but is now: 7:0722a27fccf7137a326a1e50685a22fc
看起来schemaName 参数更改了校验和。
有没有办法:
- 以某种方式从校验和中排除
schemaName?或 - 在每个给定的
schemaName上动态生成databasechangelog和databasechangeloglock?
【问题讨论】:
-
Liquibase 仅使用单个
databasechangelog表。不需要多个表,因为更改日志存储了更改集标识符,并且对于每个更改集都是唯一的(即使您将更改日志拆分为多个文件)如果您想在不同的架构中创建该单个表,您可以使用defaultSchemaName:liquibase.org/documentation/command_line.html -
@a_horse_with_no_name 那么你将如何处理多个模式呢?因为当您尝试在另一个架构上更新时,它会报告 checkSum 违规...
标签: postgresql liquibase