передача отчетов о подписке - PullRequest
6 голосов
/ 17 августа 2010

Вы бы порекомендовали лучший и простой способ передачи (или копирования) подписок из одной службы отчетов в другую службу отчетов на другом сервере?

Ответы [ 3 ]

6 голосов
/ 17 июня 2016

Основываясь на ответе @ 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, описанные здесь .

2 голосов
/ 12 июня 2014

Вот что мы использовали для копирования подписок с SSRS 2008 на сервер SSRS 2012.Вам нужно будет правильно настроить источники данных заранее.

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 '...'
2 голосов
/ 17 августа 2010

Сколько существует подписок?

Если самое маленькое число, проще всего было бы воссоздать их вручную на другом сервере.

Если мы говорим изрядное количество, то существует база данных служб отчетов для хранения данных подписки, которую я считаю, называется dbo.Subscription. Я бы порекомендовал посмотреть туда в первую очередь, чтобы увидеть, видите ли вы подписки.

В противном случае, если вы хотите перенести всю базу данных сервера отчетов (включая расписания), может пригодиться следующая ссылка:

MSDN Перемещение баз данных сервера отчетов на другой компьютер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...