SSRS 2019如何更新订阅指向不同文件夹下的克隆报告
SSRS 2019 订阅批量迁移至克隆报告方案
方案优先级说明
优先使用PowerShell调用官方REST API的方案,完全规避直接操作系统表的约束风险,迁移成功率可达100%。T-SQL方案仅推荐熟悉SSRS底层系统表结构的用户使用。
方案1:PowerShell 调用SSRS REST API(推荐)
SSRS 2019原生支持REST API v2.0,无需额外安装依赖,脚本如下:
# 配置项 $ssrsSiteUri = "http://<你的SSRS服务器域名或IP>/ReportServer" $oldRootFolderPath = "/旧顶层文件夹名称" $newRootFolderPath = "/新顶层文件夹名称" # 获取旧文件夹下所有报告的订阅 $allSubs = Invoke-RestMethod -Uri "$ssrsSiteUri/api/v2.0/Folders('$oldRootFolderPath')/CatalogItems/Subscriptions" -UseDefaultCredentials foreach ($sub in $allSubs) { # 匹配对应新报告路径 $newReportPath = $sub.Report.Replace($oldRootFolderPath, $newRootFolderPath) # 获取新报告ID $newReportInfo = Invoke-RestMethod -Uri "$ssrsSiteUri/api/v2.0/CatalogItems(Path='$newReportPath')" -UseDefaultCredentials # 提交订阅更新请求 $updateParam = @{ ReportId = $newReportInfo.Id Report = $newReportPath } | ConvertTo-Json Invoke-RestMethod -Uri "$ssrsSiteUri/api/v2.0/Subscriptions('$($sub.Id)')" -Method Patch -Body $updateParam -ContentType "application/json" -UseDefaultCredentials } # 验证迁移无误后,执行旧报告删除 # Invoke-RestMethod -Uri "$ssrsSiteUri/api/v2.0/Folders('$oldRootFolderPath')/CatalogItems" -Method Delete -UseDefaultCredentials
- 注意事项:运行脚本的账号需要具备SSRS站点的内容管理员权限,首次运行时先注释掉最后的删除命令,确认所有订阅关联正确后再执行删除操作。
方案2:T-SQL 合规迁移方案
你之前直接更新系统表成功率低是因为漏更了关联的报告计划表、缓存计划等关联表,正确的更新逻辑如下:
USE ReportServer GO SET NOCOUNT ON -- 配置新旧顶层文件夹ID,先执行SELECT语句确认ID正确 DECLARE @OldFolderID UNIQUEIDENTIFIER, @NewFolderID UNIQUEIDENTIFIER SELECT @OldFolderID = ItemID FROM Catalog WHERE [Path] = '/旧顶层文件夹名称' AND [Type] = 1 SELECT @NewFolderID = ItemID FROM Catalog WHERE [Path] = '/新顶层文件夹名称' AND [Type] = 1 -- 构建新旧报告映射关系 DECLARE @ReportMapping TABLE ( OldReportID UNIQUEIDENTIFIER, NewReportID UNIQUEIDENTIFIER, ReportName NVARCHAR(425) ) INSERT INTO @ReportMapping SELECT c1.ItemID, c2.ItemID, c1.Name FROM Catalog c1 INNER JOIN Catalog c2 ON c1.Name = c2.Name AND c2.ParentID = @NewFolderID WHERE c1.ParentID = @OldFolderID AND c1.Type = 2 BEGIN TRANSACTION -- 更新订阅关联报告ID UPDATE s SET s.Report_OID = rm.NewReportID FROM Subscriptions s INNER JOIN @ReportMapping rm ON s.Report_OID = rm.OldReportID -- 更新报告计划关联ID,解决sp_update_schedule无reportid参数的问题 UPDATE rs SET rs.ReportID = rm.NewReportID FROM ReportSchedule rs INNER JOIN @ReportMapping rm ON rs.ReportID = rm.OldReportID -- 可选:如果有缓存刷新计划,同步更新 UPDATE crp SET crp.ReportID = rm.NewReportID FROM CacheRefreshPlan crp INNER JOIN @ReportMapping rm ON crp.ReportID = rm.OldReportID -- 验证更新行数符合预期后,将ROLLBACK改为COMMIT提交 ROLLBACK TRANSACTION -- COMMIT TRANSACTION GO
- 注意事项:必须先在测试环境验证事务执行结果,确认更新行数和实际订阅数量一致后再提交事务,旧报告推荐通过SSRS前端或API删除,避免直接删除系统表残留冗余数据。
内容的提问来源于stack exchange,提问作者FM4
相关产品推荐
相关产品推荐

