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

8

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

我的想法是有一个默认架构(dbo),并在部署此架构时对租户的架构(tenantAtenantBtenantC)进行更新;换句话说,使同步架构。

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

我正在使用SQL Server 2008。

2个回答

5
首先,您需要一个表格或其他机制来存储模式的版本信息。这样,您就可以将应用程序和模式绑定在一起。没有什么比应用程序针对错误的模式版本更痛苦的了——失败、损坏数据等等。
如果不是正确的版本,应用程序应该拒绝或关闭——当它不正确时,你可能会遭受一些反弹,但是它可以保护你免受数据库损坏有价值数据的风险。
您需要一种跟踪变化的方式,例如Subversion或其他方式——从SQL中,您可以导出初始模式。从这里开始,您需要一种机制来跟踪变化,使用像SQL比较这样的好工具,然后跟踪模式的变化,并匹配到目标数据库中的版本号更新。
我们将每个增量保存在我们构建的升级实用程序下的单独文件夹中。此实用程序登录服务器,读取版本信息,然后应用来自数据库中下一个版本的转换脚本,直到在其子文件夹中找不到更多的升级脚本为止。这使我们能够将数据库升级到当前版本,无论它有多旧。如果有唯一于租户的数据转换,这些将变得棘手。
当然,您应该始终备份写入外部文件的数据库,最好具有可识别的版本号,以便在脚本出现问题时找到它并恢复它。而且最终会出问题,所以计划好如何恢复和还原。
我看到新的VS 2010中有一种模式升级工具,但我没有使用过。那也可能对您有用。

我在考虑使用像Migrator.Net或RikMigrations这样的框架。这样,我就可以在我的构建服务器上创建一个构建,获取最新版本并执行一个命令来检查和更新我的模式。我看到的一个问题是当应用程序有许多租户时,更新模式的过程会变得缓慢和危险。你怎么想?谢谢Mike - Juliano Oliveira
如果您可以在维护窗口期间关闭应用程序,那么这是最好/最容易的。不必担心数据更新等问题。您可以有多个实例备份和迁移针对您的SQL服务器。我们所做的是设置一个前门页面,然后将特定版本的用户重定向到特定的服务器/路径。如果请求进行身份验证并且他们的数据库被标记为升级,则将它们重定向到“正在维护”页面,并且不将它们传递给应用程序。一旦它们恢复正常,他们就可以从身份验证重定向到具有新版本的服务器。 - MikeJ
我查看了 rikMigrations。我看到的问题是它没有办法处理存储过程或视图,可能是因为这些会在任何 DDL 代码执行时更新。我们在当前的脚本中包含代码来删除所有这些构件,然后为新架构重新构建这些内容。 - MikeJ

1

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

但是,仅仅进行同步通常是棘手的。如果您添加了一列,是否还需要用数据填充该列?如果您将一列拆分为两个新列,则必须有类似于此类的转换代码。

我的建议是非常小心地跟踪针对dbo模式运行的任何脚本,并确保在适当时也针对其他模式运行这些脚本。然后,您可以偶尔使用SQL Compare等工具进行健全性检查,以查找任何意外的差异。


1
我的想法是自动化这个过程。使用像Red Gate的SQL Compare这样的程序,这个过程是手动的。谢谢。 - Juliano Oliveira
实际上,SQL Compare除了命令行功能外,还有API接口。因此,如果只是保持结构同步,并且(无论使用哪种方法)如果您能制定出明确定义的规则来进行同步操作,那么您应该可以使用SQL Compare自动化完成它。 - Tom H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接