Основываясь на ответе @ S.Juarez, этот сценарий исправляет его ошибку, которая нарушает параметры (и, таким образом, мешает работе подписок), а также передает через соответствующие записи Schedule и Schedule User.Он поддерживает одинаковые идентификаторы 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 должен быть SubscriptionID из таблицы подписок, в идеале для чего-то, что будет доставлено в ваш почтовый ящик.
exec [ReportServer].dbo.AddEvent @EventType='TimedSubscription', @EventData='cb38a708-7735-4b5a-8ff3-e03ee1b18edb'
Если это работает, то вы должны получить электронное письмо в течение ~ 20 секунд.В случае сбоя я обнаружил, что лучшее место для поиска информации об устранении неполадок - это файлы журнала SSRS, описанные здесь .