使用 Microsoft SQL Server 存储订阅数据
注意:
本文档假定您具备 MS SQL Server 和 T-SQL 查询的基础知识。管理员在尝试遵循本文档之前,必须熟悉 SQL Server 的配置、使用和管理。
简介
ESENT 是一种可嵌入的事务性数据库引擎,Windows 可以使用它。默认情况下,所有版本的 StoreFront 都支持使用内置的 ESENT 数据库。如果将应用商店配置为使用 SQL 连接字符串,它们也可以连接到 Microsoft SQL Server 实例。
将 StoreFront 切换为使用 SQL 而非 ESENT 的主要优势在于,T-SQL 更新语句允许您管理、修改或删除订阅记录。如果使用 SQL,则在对订阅数据进行少量更改时,无需导出、修改和重新导入整个 ESENT 订阅数据。
要将现有订阅数据从 ESENT 迁移到 Microsoft SQL Server,需要将从 StoreFront 导出的平面 ESENT 数据转换为 SQL 友好格式,以便进行批量导入。对于没有任何新订阅数据的新部署,此步骤不是必需的。数据转换步骤只需执行一次。本文介绍了从 3.5 版开始的所有 StoreFront 版本中均可使用的受支持配置,该版本引入了本文中引用的 -STF PowerShell SDK。
注意:
由于网络中断导致无法连接到 StoreFront 用于存储订阅数据的 SQL Server 实例,并不会导致 StoreFront 部署无法使用。中断只会导致用户体验暂时下降;用户无法添加、删除或查看收藏资源,直到 SQL Server 连接恢复。在中断期间,资源仍可枚举和启动。预期行为与使用 ESENT 时 Citrix Subscription Store 服务停止时的行为相同。
提示:
使用 ESENT 或 SQL 时,配置了 KEYWORDS:Auto 或 KEYWORDS:Mandatory 的资源行为方式相同。如果用户的资源中包含任一 KEYWORD,则当用户首次登录时,会自动创建新的 SQL 订阅记录。
ESENT 和 SQL Server 的优势
| ESENT | SQL |
|---|---|
| 默认设置,无需额外配置即可“开箱即用”地使用 StoreFront。 | 更易于管理,订阅数据可以使用 T-SQL 查询轻松操作或更新。允许删除或更新每个用户的记录。允许轻松计算每个应用程序、交付控制器或用户的记录。允许轻松删除已离开公司/组织的用户的不必要用户数据。允许轻松更新交付控制器引用,例如管理员切换到使用聚合或预配新的交付控制器时。 |
| 使用订阅同步和拉取计划,更简单地配置不同服务器组之间的复制。请参阅 配置订阅同步 | 与 StoreFront 解耦,因此在 StoreFront 升级之前无需备份订阅数据,因为数据保存在单独的 SQL Server 上。订阅备份独立于 StoreFront,并使用 SQL 备份策略和机制。 |
| 当不需要订阅管理时,SQL 是不必要的。如果订阅数据永远不需要更新,ESENT 很可能满足客户需求。 | 服务器组所有成员共享订阅数据的单个副本,因此服务器之间的数据差异或数据同步问题的可能性较小。 |
ESENT 和 SQL Server 的缺点
| ESENT | SQL |
|---|---|
| 无法轻松且精细地管理订阅数据。需要通过导出的 .txt 文件进行订阅操作。必须导出并重新导入整个订阅数据库。可能需要使用查找和替换技术更改数千条记录,这既费力又容易出错。 | 需要基本的 SQL 专业知识和基础架构。可能需要购买 SQL 许可证,这会增加 StoreFront 部署的总拥有成本。不过,Citrix Virtual Apps and Desktops 数据库实例也可以与 StoreFront 共享以降低成本。 |
| 必须在服务器组中的每个 StoreFront 服务器上维护 ESENT 数据库的副本。在极少数情况下,此数据库可能会在服务器组内或不同服务器组之间不同步。 | 在服务器组之间复制订阅数据是一项复杂的部署任务。它需要每个数据中心有多个 SQL 实例以及它们之间的事务复制。这需要专业的 MS SQL 知识。 |
| 需要将数据从 ESENT 迁移并转换为 SQL 友好格式。此过程只需执行一次。 | |
| 可能需要额外的 Windows 服务器和许可证。 | |
| 部署 StoreFront 的额外步骤。 |
部署方案
注意:
StoreFront 中配置的每个应用商店都需要一个 ESENT 数据库或 Microsoft SQL 数据库(如果您希望支持用户订阅)。存储订阅数据的方法是在 StoreFront 中的应用商店级别设置的。
Citrix® 建议所有应用商店数据库都驻留在同一个 Microsoft SQL Server 实例上,以降低管理复杂性并减少配置错误的范围。
多个应用商店可以共享同一个数据库,前提是它们都配置为使用相同的连接字符串。它们是否使用不同的交付控制器并不重要。多个应用商店共享数据库的缺点是无法判断每个订阅记录对应哪个应用商店。
在具有多个应用商店的单个 StoreFront 部署上,两种数据存储方法的组合在技术上是可行的。可以将一个应用商店配置为使用 ESENT,另一个配置为使用 SQL。由于管理复杂性增加和配置错误的范围,不建议这样做。
您可以使用以下四种方案在 SQL Server 中存储订阅数据:
方案 1:使用 ESENT 的单个 StoreFront 服务器或服务器组(默认)
默认情况下,自 2.0 版以来的所有 StoreFront 版本都使用平面 ESENT 数据库在服务器组成员之间存储和复制订阅数据。服务器组的每个成员都维护订阅数据库的相同副本,该副本与服务器组的所有其他成员同步。此方案无需额外配置步骤。此方案适用于大多数客户,他们不期望频繁更改交付控制器名称,也不需要对其订阅数据执行频繁的管理任务,例如删除或更新旧的用户订阅。
方案 2:单个 StoreFront 服务器和已安装的本地 Microsoft SQL Server 实例
StoreFront 使用本地安装的 SQL Server 实例,并且这两个组件都驻留在同一服务器上。此方案适用于简单的单个 StoreFront 部署,其中客户可能需要频繁更改交付控制器名称,或者需要对其订阅数据执行频繁的管理任务,例如删除或更新旧的用户订阅,但他们不需要高可用性 StoreFront 部署。Citrix 不建议将此方案用于服务器组,因为它会在托管 Microsoft SQL 数据库实例的服务器组成员上创建单点故障。此方案不适用于大型企业部署。
方案 3:StoreFront 服务器组和配置为高可用性的专用 Microsoft SQL Server 实例(推荐)
所有 StoreFront 服务器组成员都连接到同一个专用 Microsoft SQL Server 实例或 SQL 故障转移群集。这是大型企业部署最合适的模型,其中 Citrix 管理员希望频繁更改交付控制器名称,或者希望对其订阅数据执行频繁的管理任务,例如删除或更新旧的用户订阅,并且需要高可用性。

方案 4:多个 StoreFront 服务器组和每个数据中心每个服务器组中的专用 Microsoft SQL Server 实例
注意:
这是一种高级配置。仅当您是熟悉事务复制的经验丰富的 SQL Server 管理员,并且具备成功部署它所需的技能时,才尝试此操作。
这与方案 3 相同,但将其扩展到需要在不同远程数据中心部署多个 StoreFront 服务器组的情况。Citrix 管理员可以选择在相同或不同数据中心的不同服务器组之间同步订阅数据。数据中心中的每个服务器组都连接到其自己的专用 Microsoft SQL Server 实例,以实现冗余、故障转移和性能。此方案需要大量的额外 Microsoft SQL Server 配置和基础架构。它完全依赖于 Microsoft SQL 技术来复制订阅数据及其 SQL 事务。

资源
您可以从 https://github.com/citrix/sample-scripts/tree/master/storefront 下载以下脚本以获取帮助:
配置脚本
-
Set-STFDatabase.ps1 – 为每个应用商店设置 MS SQL 连接字符串。在 StoreFront 服务器上运行。
-
Add-LocalAppPoolAccounts.ps1 – 授予本地 StoreFront 服务器的应用程序池对 SQL 数据库的读写访问权限。在 SQL Server 上为方案 2 运行。
-
Add-RemoteSFAccounts.ps1 – 授予服务器组中的所有 StoreFront 服务器对 SQL 数据库的读写访问权限。在 SQL Server 上为方案 3 运行。
-
Create-StoreSubscriptionsDB-2016.sql – 创建 SQL 数据库和架构。在 SQL Server 上运行。
数据转换和导入脚本
-
Transform-SubscriptionDataForStore.ps1 – 导出 ESENT 中现有订阅数据并将其转换为 SQL 友好格式以供导入。
-
Create-ImportSubscriptionDataSP.sql – 创建一个存储过程,用于导入由 Transform-SubscriptionDataForStore.ps1 转换的数据。在使用 Create-StoreSubscriptionsDB-2016.sql 创建数据库架构后,在 SQL Server 上运行此脚本一次。
在 SQL Server 上配置 StoreFront 服务器的本地安全组
方案 2:单个 StoreFront 服务器和已安装的本地 Microsoft SQL Server 实例
在 Microsoft SQL Server 上创建一个名为 <SQLServer>\StoreFrontServers 的本地安全组,并添加 IIS APPPOOL\DefaultAppPool 和 IIS APPPOOL\Citrix Receiver for Web 的虚拟帐户,以允许本地安装的 StoreFront 对 SQL 进行读写。此安全组在创建应用商店订阅数据库架构的 .SQL 脚本中引用,因此请确保组名匹配。
您可以下载脚本 Add-LocalAppPoolAccounts.ps1 以获取帮助。
在运行 Add-LocalAppPoolAccounts.ps1 脚本之前安装 StoreFront。该脚本依赖于定位 IIS APPPOOL\Citrix Receiver for Web 虚拟 IIS 帐户的能力,该帐户在 StoreFront 安装和配置之前不存在。IIS APPPOOL\DefaultAppPool 是通过安装 IIS Web 服务器角色自动创建的。
# Create Local Group for StoreFront servers on DB Server
$LocalGroupName = "StoreFrontServers"
$Description = "Contains StoreFront Server Machine Accounts or StoreFront AppPool Virtual Accounts"
# Check whether the Local Group Exists
if ([ADSI]::Exists("WinNT://$env:ComputerName/$LocalGroupName"))
{
Write-Host "$LocalGroupName already exists!" -ForegroundColor "Yellow"
}
else
{
Write-Host "Creating $LocalGroupName local security group" -ForegroundColor "Yellow"
# Create Local User Group
$Computer = [ADSI]"WinNT://$env:ComputerName,Computer"
$LocalGroup = $Computer.Create("group",$LocalGroupName)
$LocalGroup.setinfo()
$LocalGroup.description = $Description
$Localgroup.SetInfo()
Write-Host "$LocalGroupName local security group created" -ForegroundColor "Green"
}
$Group = [ADSI]"WinNT://$env:ComputerName/$LocalGroupName,group"
# Add IIS APPPOOL\DefaultAppPool
$objAccount = New-Object System.Security.Principal.NTAccount("IIS APPPOOL\DefaultAppPool")
$StrSID = $objAccount.Translate([System.Security.Principal.SecurityIdentifier])
$DefaultSID = $StrSID.Value
$Account = [ADSI]"WinNT://$DefaultSID"
$Group.Add($Account.Path)
# Add IIS APPPOOL\Citrix Receiver for Web
$objAccount = New-Object System.Security.Principal.NTAccount("IIS APPPOOL\Citrix Receiver for Web")
$StrSID = $objAccount.Translate([System.Security.Principal.SecurityIdentifier])
$WebRSID = $StrSID.Value
$Account = [ADSI]"WinNT://$WebRSID"
$Group.Add($Account.Path)
<!--NeedCopy-->
Write-Host “AppPools 已添加到 $LocalGroupName 本地组” -ForegroundColor “Green”
使用 SQL Server 配置管理器在本地 SQL 实例中启用命名管道。StoreFront 和 SQL Server 之间的进程间通信需要命名管道。

确保正确配置 Windows 防火墙规则,以允许 SQL Server 连接使用特定端口或动态端口。有关如何在您的环境中执行此操作,请参阅 Microsoft 文档。
> **提示:**
>
> 如果连接到本地 SQL 实例失败,请检查连接字符串中使用的 localhost 或 `<hostname>` 是否解析为正确的 IPv4 地址。Windows 可能会尝试使用 IPv6 而不是 IPv4,并且 localhost 的 DNS 解析可能会返回 ::1,而不是 StoreFront 和 SQL Server 的正确 IPv4 地址。可能需要完全禁用主机服务器上的 IPv6 网络堆栈才能解决此问题。
### 场景 3:StoreFront 服务器组和专用 Microsoft SQL Server 实例
在 Microsoft SQL Server 上创建一个名为 `<SQLServer>\StoreFrontServers` 的本地安全组,并添加 StoreFront 服务器组的所有成员。此安全组稍后将在 **Create-StoreSubscriptionsDB-2016.sql** 脚本中引用,该脚本在 SQL 中创建订阅数据库架构。

将所有 StoreFront 服务器组域计算机帐户添加到 `<SQLServer>\StoreFrontServers` 组。如果 SQL Server 使用 Windows 身份验证,则只有组中列出的 StoreFront 服务器域计算机帐户才能在 SQL 中读取和写入订阅记录。以下 PowerShell 函数在脚本 [Add-RemoteSFAccounts.ps1](https://raw.githubusercontent.com/citrix/sample-scripts/master/storefront/Add-RemoteSFAccounts.ps1) 中提供,它创建本地安全组并将两个名为 StoreFrontSQL1 和 StoreFrontSQL2 的 StoreFront 服务器添加到其中。
<!--NeedCopy-->
```powershell
function Add-RemoteSTFMachineAccounts
{
[CmdletBinding()]
param([Parameter(Mandatory=$True)][string]$Domain,
[Parameter(Mandatory=$True)][array]$StoreFrontServers)
# Create Local Group for StoreFront servers on DB Server
$LocalGroupName = "StoreFrontServers"
$Description = "Contains StoreFront Server Machine Accounts or StoreFront AppPool virtual accounts"
# Check whether the Local Security Group already exists
if ([ADSI]::Exists("WinNT://$env:ComputerName/$LocalGroupName"))
{
Write-Host "$LocalGroupName already exists!" -ForegroundColor "Yellow"
}
else
{
Write-Host "Creating $LocalGroupName local group" -ForegroundColor "Yellow"
# Create Local Security Group
$Computer = [ADSI]"WinNT://$env:ComputerName,Computer"
$LocalGroup = $Computer.Create("group",$LocalGroupName)
$LocalGroup.setinfo()
$LocalGroup.description = $Description
$Localgroup.SetInfo()
Write-Host "$LocalGroupName local group created" -ForegroundColor "Green"
}
Write-Host "Adding $StoreFrontServers to $LocalGroupName local group" -ForegroundColor "Yellow"
foreach ($StoreFrontServer in $StoreFrontServers)
{
$Group = [ADSI]"WinNT://$env:ComputerName/$LocalGroupName,group"
$Computer = [ADSI]"WinNT://$Domain/$StoreFrontServer$"
$Group.Add($Computer.Path)
}
Write-Host "$StoreFrontServers added to $LocalGroupName" -ForegroundColor "Green"
}
Add-RemoteSTFMachineAccounts -Domain "example" -StoreFrontServers @("StoreFrontSQL1","StoreFrontSQL2")
为每个 Store 配置 Microsoft SQL Server 中的订阅数据库架构
在 Microsoft SQL Server 上创建一个命名实例供 StoreFront 使用。在 .SQL 脚本中设置路径,使其与您的 SQL 版本安装位置或其数据库文件存储位置相对应。示例脚本 Create-StoreSubscriptionsDB-2016.sql 使用 SQL Server 2016 Enterprise。
通过右键单击“数据库”然后选择“新建数据库”,使用 SQL Server Management Studio (SSMS) 创建一个空数据库。

键入一个与您的 Store 匹配的“数据库名称”,或者选择一个不同的名称,例如 STFSubscriptions。
在运行脚本之前,对于 StoreFront 部署中的每个 Store,修改示例脚本中的引用以匹配您的 StoreFront 和 SQL 部署。例如,修改:
-
将您创建的每个数据库命名为与 StoreFront 中的 Store 名称匹配,在
USE [STFSubscriptions]中。 -
将数据库 .mdf 和 .ldf 文件的路径设置为您希望存储数据库的位置。
C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\STFSubscriptions.mdfC:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\STFSubscriptions.ldf -
在脚本中设置对 SQL Server 名称的引用:
CREATE LOGIN [SQL2016\StoreFrontServers] FROM WINDOWS;ALTER LOGIN [SQL2016\StoreFrontServers]
运行脚本。成功配置架构后,将创建三个数据库表:SchemaDetails、Subscription 和 User。

以下数据库图显示了 Create-StoreSubscriptionsDB-2016.sql 脚本创建的订阅数据库架构:

为每个 StoreFront Store 配置 SQL Server 连接字符串
场景 1
提示:
存储在 ESENT 数据库磁盘上的原始订阅数据不会被销毁或删除。如果您决定从 Microsoft SQL Server 恢复为使用 ESENT,则可以删除 Store 连接字符串并简单地切换回使用原始数据。在使用 SQL 期间为 Store 创建的任何额外订阅将不会存在于 ESENT 中,并且用户将不会看到这些新的订阅记录。所有原始订阅记录仍将存在。
在 Store 上重新启用 ESENT 订阅
打开 PowerShell ISE 并选择“以管理员身份运行”。
使用 -UseLocalStorage 选项指定要重新启用 ESENT 订阅的 Store:
$SiteID = 1
$StoreVirtualPath = "/Citrix/Store1"
# Sets SQL DB Connection String
$StoreObject = Get-STFStoreService -SiteID $SiteID -VirtualPath $StoreVirtualPath
# Removes the SQL DB Connection string and reverts back to using ESENT
Set-STFStoreSubscriptionsDatabase -StoreService $StoreObject -UseLocalStorage
Get-STFStoreSubscriptionsDatabase -StoreService $StoreObject
场景 2、3 和 4
打开 PowerShell ISE 并选择“以管理员身份运行”。
使用 $StoreVirtualPath 指定要为其设置连接字符串的 Store
$SiteID = 1
$VirtualPath= "/Citrix/Store1"
$DBName = "Store1"
$DBServer = "SQL2016Ent"
$DBLocalServer = "localhost"
$SQLInstance = "StoreFrontInstance"
# For a remote database instance
$ConnectionString = "Server=$DBServer\$SQLInstance;Database=$DBName;Trusted_Connection=True;"
或者
# For a locally installed database instance
$ConnectionString = "$DBLocalServer\$SQLInstance;Database=$DBName;Trusted_Connection=True;"
# Sets SQL DB Connection String
$StoreObject = Get-STFStoreService -SiteID $SiteID -VirtualPath "/Citrix/Store"
Set-STFStoreSubscriptionsDatabase -StoreService $StoreObject -ConnectionString $ConnectionString
Get-STFStoreSubscriptionsDatabase -StoreService $StoreObject
如果您希望将部署中的所有 Store 配置为使用 SQL 连接字符串,请对每个 Store 重复此过程。
将现有数据从 ESENT 迁移到 Microsoft SQL Server
要将现有 ESENT 数据迁移到 SQL,需要一个两步数据转换过程。我们提供了两个脚本来帮助您执行此一次性操作。如果 StoreFront 中的连接字符串和 SQL 实例配置正确,则所有新订阅都将以正确的格式在 SQL 中自动创建。迁移后,历史 ESENT 订阅数据将转换为 SQL 格式,用户也可以查看他们之前订阅的资源。
示例:同一域用户的四个 SQL 订阅

步骤 1 使用 Transform-SubscriptionDataForStore.ps1 脚本将 ESENT 数据转换为 SQL 友好格式以进行批量导入
登录到要从中转换 ESENT 数据的 StoreFront 服务器。
服务器组的任何成员都适用,前提是它们都包含相同数量的订阅记录。
打开 PowerShell ISE 并选择 以管理员身份运行。
运行脚本 Transform-SubscriptionDataForStore.ps1,该脚本将 <StoreName>.txt 文件从 ESENT 数据库导出到当前用户的桌面。
PowerShell 脚本会针对处理的每个订阅行提供详细反馈,以帮助调试并评估操作的成功。此过程可能需要很长时间。
脚本完成后,转换后的数据将写入当前用户桌面上的 <StoreName>SQL.txt。脚本会汇总唯一用户记录的数量和处理的订阅总数。
对要迁移到 SQL Server 的每个应用商店重复此过程。
步骤 2 使用 T-SQL 存储过程批量 SQL 导入转换后的数据
每个应用商店的数据必须一次导入一个应用商店。
将步骤 1 中创建的 <StoreName>SQL.txt 文件从 StoreFront 服务器的桌面复制到 Microsoft SQL Server 上的 C:\,并将其重命名为 SubscriptionsSQL.txt。
Create-ImportSubscriptionDataSP.sql 脚本创建一个 T-SQL 存储过程,用于批量导入订阅数据。它会删除每个唯一用户的重复条目,以便生成的 SQL 数据正确规范化并拆分到正确的表中。
在执行 Create-ImportSubscriptionDataSP.sql 之前,请将 USE [STFSubscriptions] 更改为与要创建存储过程的数据库匹配。
使用 SQL Server Management Studio 打开 Create-ImportSubscriptionDataSP.sql 文件并执行其中的代码。此脚本会将 ImportSubscriptionDataSP 存储过程添加到您之前创建的数据库中。
成功创建存储过程后,SQL 控制台中将显示以下消息,并且 ImportSubscriptionDataSP 存储过程将添加到数据库中:
Commands completed successfully.

右键单击存储过程,然后选择 执行存储过程,再单击 确定 以执行存储过程。

返回值 0 表示所有数据均已成功导入。导入过程中出现的任何问题都将记录到 SQL 控制台。存储过程成功运行后,请将 Transform-SubscriptionDataForStore.ps1 提供的订阅记录总数和唯一用户数与以下两个 SQL 查询的结果进行比较。这两个总数应该匹配。
转换脚本中的订阅总数应与 SQL 报告的总数匹配,通过以下查询:
SELECT COUNT(*) AS TotalSubscriptions
FROM [Subscription]
转换脚本中的唯一用户数应与 SQL 报告的用户表中的记录数匹配,通过以下查询:
SELECT COUNT(*) AS TotalUsers
FROM [User]
如果转换脚本显示 100 个唯一用户和 1000 条订阅记录总数,则成功迁移后 SQL 应显示相同的两个数字。
登录到 StoreFront 以检查现有用户是否可以看到其订阅数据。当用户订阅或取消订阅其资源时,SQL 中会更新现有订阅记录。新用户和订阅记录也会在 SQL 中创建。
步骤 3 对导入的数据运行 T-SQL 查询
注意:
所有 Delivery Controller 名称都区分大小写,并且必须与 StoreFront 中使用的名称和大小写完全匹配。
-- 获取所有 SQL 订阅记录
Use [STFSubscriptions]
SELECT * FROM [Subscription]
SELECT * FROM [User]
-- 获取特定用户 SID 的所有订阅记录
Use [STFSubscriptions]
SELECT * FROM [Subscription]
INNER JOIN [User]
ON [Subscription].[user_id] = [User].[id]
WHERE [User].[username] = 'S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxx'
-- 获取特定用户 SID 的订阅记录总数
Use [STFSubscriptions]
SELECT COUNT(Subscription.id)
FROM [Subscription]
INNER JOIN [User]
ON [Subscription].[user_id] = [User].[id]
WHERE [User].[username] = 'S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxx'
-- 获取特定 Delivery Controller 的所有订阅记录
Use [STFSubscriptions]
SELECT * FROM [Subscription]
WHERE [resource_id] LIKE 'DeliveryController.%'
-- 或者对于聚合资源,使用聚合组的名称
Use [STFSubscriptions]
SELECT * FROM [Subscription]
WHERE [resource_id] LIKE 'DefaultAggregationGroup.%'
-- 获取特定应用程序的所有订阅记录
Use [STFSubscriptions]
SELECT * FROM [Subscription]
WHERE [resource_id] = ' DeliveryController.Application'
使用 T-SQL 更新或删除现有订阅记录
免责声明:
所有示例 SQL 更新和删除语句均由您自行承担风险。Citrix 不对因不正确使用所提供的示例而导致的任何订阅数据丢失或意外更改负责。以下 T-SQL 语句旨在提供指导,以实现简单的更新。在尝试更新订阅或删除过时记录之前,请备份 SQL 数据库中的所有订阅数据。未能执行必要的备份可能会导致数据丢失或损坏。在对生产数据库执行自己的 T-SQL UPDATE 或 DELETE 语句之前,请在虚拟数据或生产数据的冗余副本上进行测试,远离实时生产数据库。
注意:
所有 Delivery Controller 名称都区分大小写,并且必须与 StoreFront 中使用的名称和大小写完全匹配。
-- 更新所有订阅中使用的 Delivery Controller。
Use [STFSubscriptions]
UPDATE [Subscription]
SET [resource_id] = REPLACE(resource_id,'OldDeliveryController.','NewDeliveryController.')
WHERE [resource_id] LIKE 'OldDeliveryController.%'
-- 启用多站点聚合后,更新 resource_id
Use [STFSubscriptions]
UPDATE [Subscription]
SET [resource_id] = REPLACE(resource_id,'OldDeliveryController.','DefaultAggregationGroup.')
WHERE [resource_id] LIKE 'OldDeliveryController.%'
-- 删除特定 Delivery Controller 的所有订阅记录
Use [STFSubscriptions]
DELETE FROM [Subscription]
WHERE [resource_id] LIKE 'DeliveryController.%'
-- 或者对于聚合资源,使用聚合组的名称
Use [STFSubscriptions]
DELETE FROM [Subscription]
FROM [Subscription]
WHERE [resource_id] LIKE 'DefaultAggregationGroup.%'
-- 删除特定应用程序的所有订阅记录
Use [STFSubscriptions]
DELETE FROM [Subscription]
FROM [Subscription]
WHERE [resource_id] LIKE '%.Application'
-- 删除通过特定 Delivery Controller 发布的应用程序的所有订阅记录
Use [STFSubscriptions]
DELETE FROM [Subscription]
FROM [Subscription]
WHERE [resource_id] = 'DeliveryController.Application'
-- 删除特定用户 SID 的所有订阅记录
-- 依赖级联删除 [Subscription] 中的记录
Use [STFSubscriptions]
DELETE FROM [User]
WHERE [User].[username] = 'S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxx'
-- 从特定数据库中删除所有订阅数据,并将主键聚集索引重置为从 0 开始编号。
-- 请务必谨慎使用,切勿在实时生产数据库上使用。
-- 在调试数据导入问题时,从干净的数据库开始可能很有用。
Use [STFSubscriptions]
DELETE FROM [Subscription]
DBCC CHECKIDENT ([Subscription], RESEED, 0)
DELETE FROM [User]
DBCC CHECKIDENT ([User], RESEED, 0)
```