首页 > 解决方案 > Liquibase:setDefaultSchema 不起作用

问题描述

我正在使用 spring boot(2.5.2)、mySQL 8.0 和 Liquibae 4.4.1 创建基于模式的多租户应用程序。

我希望我的所有租户表和 liquibase 内部表都应该在我在运行迁移之前指定的租户模式中创建。

liquibase.setDefaultSchema(tenantSchema); --sets the schema for changesets
liquibase.setLiquibaseSchema(tenantSchema); -- sets schema for liquibase internal tables

我可以看到 liquibase 内部表正在租户架构中正确创建。

但是 liquibase 总是针对公共模式执行我的变更集。看起来在 liquibase 迁移之前设置默认模式没有效果。我正在使用基于 sql 的变更集,我不想切换到 xml。

我找到了一种解决方法,但它是有风险的。我正在寻找更好的解决方案。

解决方法:

在运行迁移之前,我将当前租户的架构保存在 jvm argumanet 中,如下所示

System.setProperty("changeSetSchemaName", tenant.getSchema());

然后在我的更改集中,我读取了这个模式值并显式设置了模式名称,如下所示

--liquibase formatted sql
--changeset author-id:alter_xxx_table
use ${changeSetSchemaName}          --switch to tenant schema
alter table table_name add column new_column data_type;     --execute sql
use master;    --switch back to master schema                                          
--rollback .... 

这确实有效,但我不得不更改每一个变更集。如果我忘记这样做,就会发生一些意想不到的事情。我可以添加单元测试来解析变更集并验证在 sql 之前和之后使用了模式语句(如果我没有得到任何解决方案,我将不得不这样做)。

如果有人知道我的问题的无风险解决方案,那就太好了。

标签: mysqlliquibasedatabase-schemamulti-tenant

解决方案


您可以使用这两个参数liquibaseSchemaName 和 defaultSchemaName。liquibaseSchemaName 用于内部 liquibase 表,而 defaultSchemaName 指定用于数据库连接的默认模式名称。


推荐阅读