【问题标题】:Liquibase exclude schema name from changelogLiquibase 从变更日志中排除模式名称
【发布时间】:2018-02-15 04:17:14
【问题描述】:

我有一个多租户应用程序。每个租户在数据库中都有自己的架构。所有的模式在逻辑上都是相同的,唯一的区别是模式名称(实际的模式)。

我希望能够运行 liquibase:update schemaName=my-schema 来更新给定架构。

我的changelogs.xml 看起来像这样:

<createTable tableName="myTable" schemaName="${schemaName}">

其中schemaName 被参数化,并作为动态属性获得。但是,问题在于databasechangelogdatabasechangeloglock 表仅存在于默认模式中,该模式用于打开与数据库的连接。我在liquibase.properties 中配置了这个。

liquibase.properties

url: jdbc:postgresql://localhost:5431/my-db?currentSchema=public

现在作为参数给出的模式和属性中定义的模式不匹配,即。作为参数给出的架构没有自己的databasechangelogdatabasechangeloglock,而是根据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 参数更改了校验和。

有没有办法:

  1. 以某种方式从校验和中排除schemaName?或
  2. 在每个给定的schemaName上动态生成databasechangelogdatabasechangeloglock

【问题讨论】:

  • Liquibase 仅使用单个 databasechangelog 表。不需要多个表,因为更改日志存储了更改集标识符,并且对于每个更改集都是唯一的(即使您将更改日志拆分为多个文件)如果您想在不同的架构中创建该单个表,您可以使用defaultSchemaName:liquibase.org/documentation/command_line.html
  • @a_horse_with_no_name 那么你将如何处理多个模式呢?因为当您尝试在另一个架构上更新时,它会报告 checkSum 违规...

标签: postgresql liquibase


【解决方案1】:

运行 liquibase 时,使用可选参数 "--liquibaseSchemaName=[schemaName]"

Liquibase 将在 [schemaName] 中创建/使用更改日志表,而不是您连接的默认用户。

由于每个架构/租户都有自己的变更日志副本,因此不会因架构名称的更改而导致任何校验和问题。

【讨论】:

  • 如何将该选项传递给 liquibase maven 插件?
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2016-08-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
相关资源
最近更新 更多