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