如何在多模式MS SQL Server环境中使用Flyway?

时间:2014-07-15 16:48:56

标签: sql-server database flyway schema-migration

我们有一个多租户SaaS应用程序,使用"多架构"策略,即每个客户在同一数据库实例中都有专用模式。我们使用MS SQL Server作为数据库,通过"默认模式"在模式之间切换。设置SQL Server"用户"。例如,客户A,B和C在SQL Server中配置如下:

  • 客户A:user_A,默认架构schema_A
  • 客户B:user_B,默认架构schema_B
  • 客户C:user_C,默认架构为schema_C ......依此类推。

在我们的应用程序中,我们通过设置SQL Server" user"来切换DataSource连接以指向每个客户的正确模式。在每个查询之前通过执行以下SQL来连接:

EXECUTE AS USER = 'user_A';

在尝试使用Flyway管理模式版本状态时,这给我们带来了一些问题 - 以全局方式。由于flyway的模式支持仅接受模式名称列表,因此不适用于MS SQL Server。 Flyway对随DataSource配置提供的用户的默认架构执行迁移;在SQL Server的情况下,"用户"需要根据客户/架构而变化。

理想情况下,我们会有一个像FlywayCallback.beforeEachSchemaMigrate(Connection)这样的回调,让我们通过执行" Execute as User"来设置每个模式所需的用户上下文。每个模式的每次迁移之前的语句不知道为什么那个钩子不在那里?

flyway的另一个缺点是在模式列表中使用第一个模式的惯例,作为持有schema_version表的模式。在基于SQL Server的多租户环境中不需要这样做。因为我们不能假设包含schema_version表的模式也是真正的Customer模式。请记住像我们这样的SaaS应用程序,每个租户/客户的架构都是动态创建/销毁的。当用户签名时,部分配置过程会根据某些约定创建新架构。所以架构列表对我们来说是动态的。

理想情况下,我们可以告诉Flyway使用给定的模式来创建schema_version表,而不尝试在该模式上运行迁移。通常,这将是dbo架构(这是SQL Server中的默认架构)。我们使用dbo模式来保存所有租户中具有全局性的表,schema_version将被视为全局表。

因此,在成功迁移之后,我们的数据库应如下所示:

 - dbo.schema_version
 - schema_A.my_tables
 - schema_B.my_tables
 - schema_C.my_tables

以上所有架构都在dbo.schema_version表格中,并且由#{1}}表格指示和控制。

这目前可能吗?

1 个答案:

答案 0 :(得分:0)

你必须以不同的方式解决问题。而不是每个人都执行一个Flyway,而是每个模式一个。您可以将Flyway包装在一个循环中,并为每个迭代的一个租户提供正确的配置。每个租户最终会得到一个schema_version表,但它们都可以单独命名并仍然存在于dbo架构中。