2010-08-17 84 views

回答

2

有多少订阅?

如果数字最小的最容易的事情是在其他服务器上手动重新创建它们。

如果我们正在谈论相当数量的话,那么有一个数据库报告服务来存储我认为被称为dbo.Subscriptions的订阅数据。我会建议首先在那里查看是否可以看到订阅。

否则,如果你要寻找整体转让报表服务器数据库(包括时间表),那么下面的链接可能是有用的:

MSDN Moving the Report Server Databases to Another Computer

+0

嗨..我检查了订阅表,它包含45行..我无法将整个报告服务移动到其他服务器,因为它会覆盖目标服务器中的现有报告。我能否获得订阅表并将行重新插入目标服务器? – user384080 2010-08-17 22:46:14

+0

是的,应该很容易做到,但不确定它是否会因修改而被锁定,因为它是系统数据库,请首先检查您的权限是否正确。 复制和粘贴将是一个很好的简单解决方案,否则您将需要执行数据的导入/导出: 右键单击数据库>任务>导入/导出,然后该向导会引导您,但是有一个很好的链接:http ://www.databasejournal.com/features/mssql/article.php/3580216/SQL-Server-2005-Import--Export-Wizard.htm – markdigi 2010-08-18 08:42:32

+0

你做了这个..做了报表服务器数据库的完整备份并恢复它到目的地数据库..但是当我点击我的订阅报告服务器上什么都没有显示..然后我查询数据库,它显示订阅表中的45行..你知道它为什么不显示吗? – user384080 2010-08-31 06:17:31

2

这里的东西,我们使用从2008年SSRS复制订阅到2012年SSRS服务器。您需要提前正确设置数据源。从@ S.Juarez答案

INSERT INTO Mercury.ReportServer.dbo.Subscriptions(SubscriptionID, OwnerID, Report_OID, Locale, InactiveFlags, ExtensionSettings, ModifiedByID, ModifiedDate, Description, LastStatus, EventType, MatchData, LastRunTime, Parameters, DataSettings, DeliveryExtension, Version) 
SELECT 
    --Path, 
    SubscriptionID 
    ,(SELECT UserID FROM <Destination Linked Server>.ReportServer.dbo.Users WHERE UserName = '<User from DB>') OwnerID 
    ,(select ItemId from <Destination Linked Server>.ReportServer.dbo.Catalog mCatalog where mCatalog.Path = Catalog.Path)Report_OID 
    ,Locale, InactiveFlags, ExtensionSettings 
    ,(SELECT UserID FROM <Destination Linked Server>.ReportServer.dbo.Users WHERE UserName = 'User from DB') ModifiedByID 
    , GETDATE() 
    ,Sub.Description, LastStatus, EventType, MatchData, LastRunTime, Parameter, DataSettings, DeliveryExtension, Version 

FROM ReportServer..Subscriptions Sub 
    LEFT JOIN ReportServer.dbo.Catalog ON Catalog.ItemId = Sub.Report_OID 
WHERE Path NOT IN 
    (
    SELECT Path 
    FROM <Destination Linked Server>.ReportServer.dbo.Subscriptions 
     LEFT JOIN <Destination Linked Server>.ReportServer.dbo.Catalog ON Catalog.ItemId = Subscriptions.Report_OID 
) 
--AND 
-- PATH LIKE '...' 
+1

请注意名称'参数'不正确SELECT,它应该是'参数'。我添加了一个更全面的答案,其中包括相关表格。 – Mike 2016-06-17 00:50:57

3

大厦,这个脚本修复他的错误,整个工程进度表及附表用户记录打破了参数(从而防止工作订阅),并同时将。它在源和目标上都保持相同的GUID。

使用此脚本的起点是您已经传输报告(例如使用工具ReportSync)并且已在目标服务器上的所有报告文件夹上手动配置安全性。对于用户名存在于源服务器而不是目标服务器上的情况,您还需要确定目标服务器上的哪些用户记录将订阅与之关联。 (如果您决定不在目标上重新创建用户,或者因为该用户不再是该域上的有效帐户(即他们已离开您的组织),则可能发生这种情况。

在开始之前,我建议您针对源和目标ReportServer数据库运行这个小脚本并保存结果。另外,请完整备份数据库。这些步骤使您能够回滚小的和大的更改。

SELECT u.UserName, c.Path, Parameters, s.ExtensionSettings, s.Report_OID, SubscriptionID, u.UserID 
FROM dbo.[Subscriptions] s 
JOIN users u 
on s.OwnerID = u.UserID 
JOIN catalog c 
on c.ItemID = s.Report_OID 

这下一个脚本将转让认购的第一部分,其次是时间表,然后报告,订阅和计划之间的链接记录。您需要输入目标服务器和源服务器的名称,默认用户的名称(必须已存在于目标用户表中),然后在源服务器上执行此操作。

DECLARE @Default_User varchar(50) 
SELECT @Default_User = UserID FROM [SourceServer].ReportServer.dbo.Users WHERE UserName = '[DOMAIN\YourDefaultUserNameGoesHere]' 

INSERT INTO [TargetServer].ReportServer.dbo.Subscriptions(
    SubscriptionID, OwnerID, Report_OID, Locale, InactiveFlags, ExtensionSettings, ModifiedByID, ModifiedDate, 
    [Description], LastStatus, EventType, MatchData, LastRunTime, [Parameters], DataSettings, DeliveryExtension, Version 
    ) 
SELECT 
    --cSource.Path, 
    --uSource.UserName, 
    SubscriptionID, 
    --u.UserName, 
    --LastStatus, 
    COALESCE(uTarget.UserID, @Default_User) AS OwnerID, 
    cTarget.ItemID, 
    Locale, InactiveFlags, ExtensionSettings, 
    @Default_User AS ModifiedByID, 
    GETDATE(), 
    sSource.[Description], LastStatus, EventType, MatchData, LastRunTime, [Parameters], DataSettings, DeliveryExtension, Version 

FROM [SourceServer].ReportServer.dbo.Subscriptions sSource 
    LEFT JOIN [SourceServer].ReportServer.dbo.Catalog cSource ON cSource.ItemId = sSource.Report_OID 
    LEFT JOIN [SourceServer].ReportServer.dbo.Users uSource ON sSource.OwnerID = uSource.UserID 
    LEFT JOIN [TargetServer].ReportServer.dbo.Catalog cTarget ON cTarget.Path = cSource.Path 
    LEFT JOIN [TargetServer].ReportServer.dbo.Users uTarget ON uTarget.UserName = uSource.UserName 
WHERE sSource.SubscriptionID NOT IN 
(
SELECT SubscriptionID FROM [TargetServer].ReportServer.dbo.Subscriptions 
) 


INSERT INTO [TargetServer].ReportServer.dbo.Schedule 
(
ScheduleID, Name, StartDate, Flags, NextRunTime, LastRunTime, EndDate, RecurrenceType, MinutesInterval, DaysInterval, WeeksInterval, DaysOfWeek, DaysOfMonth, [Month], MonthlyWeek, State, LastRunStatus, ScheduledRunTimeout, EventType, EventData, Type, ConsistancyCheck, Path, CreatedById 
) 
SELECT 
ScheduleID, Name, StartDate, Flags, NextRunTime, LastRunTime, EndDate, RecurrenceType, MinutesInterval, DaysInterval, WeeksInterval, DaysOfWeek, DaysOfMonth, [Month], MonthlyWeek, State, LastRunStatus, ScheduledRunTimeout, EventType, EventData, Type, ConsistancyCheck, Path, 
COALESCE(uTarget.UserID, @Default_User) AS CreatedById 
FROM [SourceServer].ReportServer.dbo.Schedule s 
INNER JOIN [SourceServer].ReportServer.dbo.Users uSource 
ON s.CreatedById = uSource.UserID 
LEFT JOIN [TargetServer].ReportServer.dbo.Users uTarget 
ON uSource.UserName = uTarget.UserName 
WHERE ScheduleID NOT IN (SELECT ScheduleID FROM [TargetServer].ReportServer.dbo.Schedule) 


INSERT INTO [TargetServer].ReportServer.dbo.ReportSchedule 
(
ScheduleID, ReportID, SubscriptionID, ReportAction 
) 
SELECT 
    rsSource.ScheduleID, cTarget.ItemID, rsSource.SubscriptionID, rsSource.ReportAction 
FROM [SourceServer].ReportServer.dbo.ReportSchedule rsSource 
INNER JOIN [TargetServer].ReportServer.dbo.Schedule sTarget 
ON rsSource.ScheduleID = sTarget.ScheduleID 
INNER JOIN [SourceServer].ReportServer.dbo.Catalog cSource 
On cSource.ItemID = rsSource.ReportID 
INNER JOIN [TargetServer].ReportServer.dbo.Catalog cTarget 
ON cSource.Path = cTarget.Path 
LEFT JOIN [TargetServer].ReportServer.dbo.ReportSchedule rsTarget 
ON rsSource.ScheduleID = rsTarget.ScheduleID 
AND rsSource.ReportID = rsTarget.ReportID 
AND rsSource.SubscriptionID = rsTarget.SubscriptionID 
WHERE rsTarget.ReportID IS NULL 

要测试您的迁移是否正常工作,您可以针对目标服务器执行类似的语句。 GUID应该是Subscriptions表中的一个SubscriptionID,理想情况下用于发送到收件箱的内容。

exec [ReportServer].dbo.AddEvent @EventType='TimedSubscription', @EventData='cb38a708-7735-4b5a-8ff3-e03ee1b18edb' 

如果有效,那么您应该会在约20秒内收到一封电子邮件。如果失败,我发现查找故障排除信息的最佳位置在SSRS日志文件described here中。

+0

我打算将订阅从一台服务器迁移到另一台服务器。由于SSRS通过创建作业来管理日程安排,只需在脚本的表格中创建记录即可创建工作订阅日程安排?在你的情况下,你通过在AddEvent表中创建条目来手动触发一个时间表。 – 2017-11-16 00:25:21

+0

嗯 - 好问题。我不再在做报告迁移的地方工作,所以我无法检查日程安排/作业是如何排序的 - 这是前一段时间。我记得尽管在迁移后没有对订阅的投诉,所以我认为这意味着一切都好(无论是人们还是没有注意到缺乏报告到达......我认为这不太可能,因为我们他说的是数百个订阅 - 有人会说出来)。 – Mike 2017-11-19 20:38:14