我正在开发一个多租户应用程序。我选择了“共享数据库/单独模式”方法。
我的想法是有一个默认架构(dbo
),并在部署此架构时,对租户的架构(、、、tenantA
)tenantB
进行更新tenantC
;换句话说,制作同步模式。
如何将租户的架构与默认架构同步?
我正在使用 SQL Server 2008。
我正在开发一个多租户应用程序。我选择了“共享数据库/单独模式”方法。
我的想法是有一个默认架构(dbo
),并在部署此架构时,对租户的架构(、、、tenantA
)tenantB
进行更新tenantC
;换句话说,制作同步模式。
如何将租户的架构与默认架构同步?
我正在使用 SQL Server 2008。
您首先需要的是一个表或其他机制来存储模式的版本信息。如果没有别的,那么您可以将您的应用程序和架构绑定在一起。没有什么比针对错误模式(失败、损坏数据等)的应用程序版本更痛苦的了。
如果版本不正确,应用程序应该拒绝或关闭——当它不正确时,您可能会受到一些反击,但可以保护您免受数据库损坏有价值数据的真正糟糕的一天。
您将需要一种方法来跟踪更改,例如 Subversion 或其他东西——您可以从 SQL 导出初始模式。从这里开始,您将需要一种机制来使用像 SQL 比较这样的好工具来跟踪更改,然后跟踪架构更改并匹配目标数据库中版本号的更新。
我们将每个增量保存在我们构建的升级实用程序下方的单独文件夹中。此实用程序登录服务器,读取版本信息,然后应用数据库中下一个版本的转换脚本,直到在其子文件夹中找不到更多升级脚本。这使我们能够将数据库升级到当前版本,无论它有多旧。如果有租户独有的数据转换,这些将变得棘手。
当然,您应该始终对写入外部文件的数据库进行备份,最好使用人类可识别的版本号,以便在脚本出错时找到并恢复它。最终它只会计划弄清楚如何恢复和恢复。
我看到新的 VS 2010 中有某种模式升级工具,但我没有使用它。这也可能对你有用。
据我所知,没有同步模式的神奇命令。您将需要使用一种工具 - 内置或购买(查看Red Gate 的 SQL Compare和 SQL Examiner - 您需要调整它们以比较不同的模式)。
不过,仅仅同步通常是一件棘手的事情。如果添加了一列,是否还需要用数据填充该列?如果您将一列拆分为两个新列,则必须有类似的转换代码。
我的建议是非常仔细地跟踪您针对 dbo 模式运行的任何脚本,并确保它们在适当的时候也针对其他模式运行。然后,您可以使用 SQL Compare 之类的工具作为偶尔的健全性检查来查找任何意外差异。