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

Sql server 如何在多租户应用程序中更新所有租户的所有架构?,sql-server,sql-server-2008,schema,multi-tenant,database-schema,Sql Server,Sql Server 2008,Schema,Multi Tenant,Database Schema,我正在开发一个多租户应用程序。我选择了“共享数据库/单独模式”方法 我的想法是拥有一个默认模式(dbo),并且在部署此模式时,对租户的模式进行更新(tenata,tenantB,tenantC);换句话说,创建同步模式 如何将租户的架构与默认架构同步 我正在使用SQL Server 2008。据我所知,没有神奇的命令来同步架构。您将需要使用一个工具—无论是内置的还是购买的(Checkout和SQL检查器—您需要调整它们以比较不同的模式) 不过,仅仅同步往往是一件棘手的事情。如果添加了列,是否还需

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

我的想法是拥有一个默认模式(
dbo
),并且在部署此模式时,对租户的模式进行更新(
tenata
tenantB
tenantC
);换句话说,创建同步模式

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


我正在使用SQL Server 2008。

据我所知,没有神奇的命令来同步架构。您将需要使用一个工具—无论是内置的还是购买的(Checkout和SQL检查器—您需要调整它们以比较不同的模式)

不过,仅仅同步往往是一件棘手的事情。如果添加了列,是否还需要用数据填充该列?如果将一列拆分为两个新列,则必须有类似的转换代码


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

首先需要一个表或其他机制来存储架构的版本信息。如果没有其他方法,则可以将应用程序和模式绑定在一起。没有什么比针对错误模式的应用程序版本更痛苦的了——失败、损坏数据等

应用程序应该拒绝或关闭,如果它不是正确的版本,那么当它不正确时,您可能会受到一些回击,但可以保护您免受数据库破坏有价值数据的糟糕日子的影响

您将需要一种方法来跟踪更改,例如Subversion或SQL中的其他内容—您可以导出初始模式。从这里开始,您将需要一种机制来使用一个很好的工具(如SQLCompare)跟踪更改,然后跟踪模式更改并匹配目标数据库中的版本号更新

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

当然,您应该始终使用可识别的版本号备份写入外部文件的数据库,以便在脚本出错时找到并恢复它。最终,它将计划如何恢复和恢复



我看到在新的VS2010中有一些模式升级工具,但我没有使用它。这可能对您也有帮助。

我的想法是将此过程自动化。使用诸如Red Gate的SQL Compare之类的程序,该过程是手动的。谢谢。实际上,SQL Compare有一个API和命令行功能,因此,如果它只是保持结构同步,并且(无论您使用哪种方法,这里是重要的部分),如果您能够就同步工作方式提出定义良好的规则,然后,您应该能够使用SQL Compare将其自动化。我正在考虑使用诸如Migrator.Net或RikMigrations之类的框架。因此,我可以在构建服务器中创建一个获取最新版本的构建,并执行一个检查和更新模式的命令。我看到的一个问题是,当应用程序有许多租户时,更新模式的过程将是缓慢而危险的。你怎么想?谢谢Mikei如果您可以在维护窗口关闭应用程序,这是最好/最简单的。无需担心数据更新等问题。您可以使用多个实例对sql Server进行备份和迁移。我们所做的是设置一个前门页面,而不是将特定版本的用户重定向到特定的服务器/路径。如果一个身份验证请求出现在adn中,他们的数据库被标记为在升级中,我们会将他们重定向到“down for maintenance”页面,并且不会将他们传递到应用程序。一旦为他们备份,他们就可以使用rikMigrations的新版本从身份验证重定向到服务器。我看到的最糟糕的是,它没有办法处理SP或视图,这可能是因为当任何DDL代码执行时,这些都会更新。我们在当前脚本中包含删除所有这些工件的代码,然后为新模式重建这些工件。