mysql - 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 之前和之后使用了模式语句(如果我没有得到任何解决方案,我将不得不这样做)。
如果有人知道我的问题的无风险解决方案,那就太好了。
解决方案
您可以使用这两个参数liquibaseSchemaName 和 defaultSchemaName。liquibaseSchemaName 用于内部 liquibase 表,而 defaultSchemaName 指定用于数据库连接的默认模式名称。
推荐阅读
- python - PyODBC 错误:无结果。以前的 SQL 不是使用“SET NOCOUNT ON”的查询
- retrofit2 - 如果没有数据,如何使用 API 响应更新 Room DB?
- maven - 如何让 Maven Surefire 退出当前正在寻找测试的位置?
- enums - kotlin 从字符串到枚举的安全转换
- powershell - 运行脚本后保持电源外壳控制台打开
- javascript - 反应本机文本颜色不起作用
- javascript - 数组是否有 javascript 方法来知道最短元素?
- java - java中接受两种类型而不重复代码的单一方法
- excel - Outlook 共享帐户不会为所有用户同步
- plsql - PLSQL:CASE 结果中的多个值