你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过将“租户各有数据库”模式与 Azure SQL 数据库配合使用,在 SaaS 应用程序中管理架构

适用于:Azure SQL 数据库

随着数据库应用程序的发展,不可避免地需要对数据库架构或引用数据进行更改。 此外,也需要定期执行数据库维护任务。 管理使用“租户各有数据库”模式的应用程序时,需要对一系列租户数据库应用这些更改或维护任务。

本教程探讨两个方案 - 为所有租户部署引用数据更新,以及重新生成包含引用数据的表的索引。 可以使用弹性作业功能,在所有租户数据库上以及用于创建新租户数据库的模板数据库上执行这些操作。

本教程介绍如何执行下列操作:

  • 创建作业代理
  • 使 T-SQL 作业在所有租户数据库上运行
  • 更新所有租户数据库中的引用数据
  • 在所有租户数据库中的表上创建索引

若要完成本教程,请确保满足以下先决条件:

SaaS 架构管理模式简介

“租户各有数据库”模式可以对租户数据进行有效的隔离,但会增加需要管理和维护的数据库的数目。 弹性作业有利于多个数据库的管理。 可以使用作业安全可靠地针对一组数据库运行任务(T-SQL 脚本)。 作业可以跨应用程序中的所有租户数据库部署架构和常见的引用数据更改。 此外还可以通过弹性作业来维护数据库用来创建新租户的模板,确保其架构和引用数据始终为最新。

屏幕

弹性作业

2024 年,弹性作业作为一种具有新功能的正式发布产品发布。 Azure SQL 数据库的一种集成功能,请参阅弹性数据库作业

获取 Wingtip Tickets SaaS“租户各有数据库”应用程序脚本

WingtipTicketsSaaS-DbPerTenant GitHub 存储库提供了应用程序源代码和管理脚本。 有关下载和取消阻止 Wingtip Tickets SaaS 脚本的步骤,请参阅常规指南

创建作业代理数据库和新的作业代理

本教程要求使用 PowerShell 来创建作业代理及其充当支持的作业代理数据库。 作业代理数据库存储作业定义、作业状态和历史记录。 创建作业代理及其数据库后,即可立刻创建和监视作业。

  1. 在 PowerShell ISE 中,打开 …\Learning Modules\Schema Management\Demo-SchemaManagement.ps1。
  2. F5 运行脚本。

Demo-SchemaManagement.ps1 脚本调用 Deploy-SchemaManagement.ps1 脚本,以便在目录服务器上创建名为“osagent”的数据库。 然后该脚本创建作业代理,将数据库用作参数。

创建一个将新的引用数据部署到所有租户的作业

在 Wingtip Tickets 应用中,每个租户数据库都包含一组支持的地点类型。 每个地点都有一个具体的地点类型,用于定义可以主持的活动的种类,并且决定了在应用中使用的背景图像。 如果需要应用程序支持新的活动类型,必须更新此引用数据并添加新的地点类型。 在本练习中,将一个更新部署到所有租户数据库,以便添加两种额外的地点类型:“赛车”和“游泳俱乐部”。

首先,查看每个租户数据库中包含的地点类型。 连接 SQL Server Management Studio (SSMS) 中的一个租户数据库,并检查 VenueTypes 表。 还可在通过数据库页访问的 Azure 门户的查询编辑器中查询此表。

  1. 打开 SSMS 并连接到租户服务器:tenants1-dpt-<user>.database.windows.net
  2. 要确认“赛车”和“游泳俱乐部”当前包含在内,请浏览到 tenants1-dpt-<user> 服务器上的 contosoconcerthall 数据库,并查询 VenueTypes 表。

现在请创建一个作业,对所有租户数据库中的“VenueTypes”表进行更新,以便添加新的场地类型。

若要创建新的 作业,请使用一组作业系统存储过程,这些过程是在创建作业代理时,在 jobagent 数据库中创建的。

  1. 在 SSMS 中连接到编录服务器:catalog-dpt-<user>.database.windows.net 服务器
  2. 在 SSMS 中,打开 ...\Learning Modules\Schema Management\DeployReferenceData.sql 文件
  3. 修改语句:SET @wtpUser = <user>,并将其替换为部署 Wingtip Tickets SaaS Database Per Tenant 应用时所用的“用户”值
  4. 确保已连接到 jobagent 数据库,然后按 F5 运行该脚本

DeployReferenceData.sql 脚本中观察以下元素:

  • sp_add_target_group 创建目标组名称 DemoServerGroup。
  • sp_add_target_group_member 用于定义目标数据库集。 首先添加 tenants1-dpt-<user> 服务器。 将服务器添加为目标后,就会在执行作业时将该服务器中的数据库包括到作业中。 然后会将 basetenantdb 数据库和 adhocreporting 数据库(在后面的教程中使用)作为目标添加。
  • sp_add_job 创建名为“引用数据部署”的新作业。
  • sp_add_jobstep 创建包含 T-SQL 命令文本的作业步骤,该文本用于更新引用表 VenueTypes。
  • 脚本中的剩余视图显示存在的对象以及监视作业执行情况。 使用这些查询查看“生命周期”列中的状态值,确定何时作业在所有目标数据库上完成

完成脚本后,可以验证引用数据是否已更新。 在 SSMS 中浏览到 tenants1-dpt-<user> 服务器上的 contosoconcerthall 数据库,然后查询 VenueTypes 表。 检查确认“赛车”和“游泳俱乐部”现在确实存在。

创建管理引用表索引的作业

本练习通过一个作业根据引用表主键重建索引。 这是一项典型的数据库维护操作,可以在加载大量数据后执行。

使用相同的作业“系统”存储过程创建作业。

  1. 打开 SSMS 并连接到 catalog-dpt-<user>.database.windows.net 服务器
  2. 打开 \Learning Modules\Schema Management\OnlineReindex.sql 文件
  3. 通过右键单击选择“连接”,连接到 catalog-dpt-<user>.database.windows.net 服务器(如果尚未连接)
  4. 确保已连接到 jobagent 数据库,然后按 F5 运行该脚本

OnlineReindex.sql 脚本中观察以下元素:

  • sp_add_job 创建一个名为“Online Reindex PK__VenueTyp__265E44FD7FD4C885”的新作业
  • sp_add_jobstep 创建包含 T-SQL 命令文本的作业步骤,以更新索引
  • 脚本监视器作业执行中的剩余视图。 使用这些查询查看“生命周期”列中的状态值,确定何时作业成功地在目标组会员上完成

后续步骤

本教程介绍了如何:

  • 创建作业代理跨多个数据库运行 T-SQL 作业
  • 更新所有租户数据库中的引用数据
  • 在所有租户数据库中的表上创建索引

接下来,请试用特别报告教程,了解如何跨租户数据库运行分布式查询。

其他资源