如何在多租户应用程序中更新所有租户的所有架构?

时间:2010-06-03 15:57:47

标签: sql-server sql-server-2008 schema multi-tenant database-schema

我正在开发一个多租户应用。我选择了“共享数据库/单独模式”方法。

我的想法是拥有默认架构(dbo),并在部署此架构时,对租户的架构进行更新(tenantAtenantB,{{1} });换句话说,制作同步模式。

如何将租户的架构与默认架构同步?

我正在使用SQL Server 2008。

2 个答案:

答案 0 :(得分:5)

您需要的第一件事是存储架构版本信息的表或其他机制。如果没有别的,那么您可以将应用程序和架构绑定在一起。没有什么比针对错误的架构的应用程序版本更加痛苦 - 失败,破坏数据等。

应用程序应拒绝或关闭,如果它不是正确的版本 - 当它不正确时你可能会得到一些反击,但保护你免受数据库破坏有价值数据的真正糟糕的一天。

您需要一种方法来跟踪更改,例如Subversion或其他 - 来自SQL,您可以导出初始模式。从这里开始,您将需要一种机制来使用SQL比较等工具跟踪更改,然后跟踪架构更改并匹配目标数据库中版本号的更新。

我们将每个delta保存在我们构建的升级实用程序下面的单独文件夹中。此实用程序登录到服务器,读取版本信息,然后应用数据库中下一个版本的转换脚本,直到它的子文件夹中找不到更多升级脚本。这使我们能够升级数据库,无论它与当前版本的年龄有多大。如果租户有独特的数据转换,这些将变得棘手。

当然,您应该始终备份写入外部文件的数据库,最好使用人类可识别的版本号,这样您就可以找到它并在脚本出现故障时将其恢复。最终它只会计划如何恢复和恢复。


我看到新版VS 2010中有某种架构升级工具,但我还没有使用它。这可能对你有用。

答案 1 :(得分:1)

据我所知,没有魔术命令可以同步模式。您需要使用内置或购买的工具(查看Red Gate's SQL Compare和SQL Examiner - 您需要调整它们来比较不同的模式)。

虽然同步通常可能是棘手的事情。如果您添加了一列,是否还需要在该列中填入数据?如果将列拆分为两个新列,则必须有类似的转换代码。

我的建议是非常仔细地跟踪您针对dbo架构运行的任何脚本,并确保它们在适当时也针对其他架构运行。然后,您可以使用SQL Compare之类的工具作为偶尔的健全性检查来查找任何意外的差异。