Deaktivieren von Reporting Services Abonnements

Wenn man häufiger mit den Abonnements der Reporting Services zu tun hat, musste der ein oder andere, ich leider auch, mit bedauern feststellen, dass es keine Möglichkeit gibt die angelegten Abonnements zu deaktivieren. Um das Verenden eines Berichts zu verhindern, konnte man dessen Abonnement entweder löschen oder den Zeitpunkt für die Ausführung weit in die Zukunft verlegen. Für mich zwei Methoden, die nicht wirklich benutzerfreundlich sind, entweder muss ich das Abonnement neu anlegen oder ich muss darauf achten meine Zeitänderungen wieder rückgängig zu machen und hab keine richtige Kontrolle über aktivierte oder deaktivierte Abonnements.

  Ich möchte hier kurz beschreiben, wie es möglich ist, unter Verwendung der ReportServer Datenbank, die Ausführung der Abonnements einfach zu verwalten.

Die Grundidee

Die Reporting Services speichern ihre Abonnements in der zugehörigen DB(Standardname: ReportServer). Die Tabelle in der alle Abonnements aufgeführt sind nennt sich dbo.Subscriptions:

In dieser Tabelle gibt es eine Spalte mit dem Namen InactiveFlags. Bei einem aktiven Abo ist dieser Wert auf 0 gesetzt. Um das Abo zu deaktivieren muss dieser Wert auf 1 geändert werden.

Die Umsetzung

Zunächst benötigen wir noch einige Tabellen, um die Lesbarkeit zu erhöhen, indem wir die IDs durch die zugehörigen Namen für Bericht, Abonnement und Benutzer ersetzen:

Tabelle Information  

Dbo.Users u

Benutzername

u.UserID = OwnerID

Dbo.Catalog c

Berichtsname

c.ItemID = Report_OID

[dbo].[ReportSchedule] rs

SQL Server Agent Job Name

SubscriptionID = rs.SubscriptionID

 

Mit dem nachfolgendem SQL-Statement können wir die passenden Informationen auslesen:

SELECT
   s.[SubscriptionID]
      ,s.[Description]
,u.UserName
              ,c.Name as ReportName
              ,[InactiveFlags]
              ,rs.ScheduleID AS JobName
              ,rs.ReportAction
              ,[ExtensionSettings]
              ,[Locale]
              ,s.[ModifiedByID]
              ,s.[ModifiedDate]
              ,[LastStatus]
              ,[EventType]
              ,[MatchData]
              ,[LastRunTime]
              ,[Parameters]
              ,[DataSettings]
              ,[DeliveryExtension]
              ,[Version]
              ,[ReportZone]
              ,[OwnerID]
              ,[Report_OID]
FROM [ReportServer].[dbo].[Subscriptions] s
              inner join dbo.Users u on u.UserID = OwnerID
              inner join [dbo].[Catalog] c on s.Report_OID = c.ItemID
              inner join [dbo].[ReportSchedule] rs on s.SubscriptionID = rs.SubscriptionID

Abhängig von den Abonnements sollte die Abfrage in etwa das folgende Ergebnis liefern:

SubscriptionID Description UserName

ReportName

InactiveFlags
929CDEE8- In “ unter ‚Arbeitszeit Übersicht‘ speichern Domäne\Bayer Arbeitszeit Übersicht 0
7A4B049E- In “ unter ‚
Fluktuation ‚ speichern
Domäne\Bayer Fluktuation 0
23E7F4EF- In “ unter Haushalt‘ speichern Domäne\Bayer Haushalt 0

 

Mit den oben stehenden Informationen können wir jetzt einzelne Abonnements aktivieren bzw. deaktivieren.

Für die Deaktivierung kann folgende Query verwendet werden:

UPDATE Subscriptions set
[InactiveFlags] = 1
where
[SubscriptionID] = ‚929CDEE8-‚
END

Für die Aktivierung kann das gleiche Update-Statement verwendet werden, der Wert InactiveFlags muss jetzt nur auf 0 gesetzt werden.

Ausführung von Abonnements

Gelegentlich kommt es vor, dass ein Abonnement außerhalb der geplanten Zeiten durchgeführt werden soll.

Da die Ausführung der Abonnements über den SQL Server Agent gesteuert wird, haben wir die Möglichkeit die passenden Jobs von Hand zu starten. Dies kann im SQL Server Management Studio erfolgen.

Oder es können vordefinierte gespeicherte Prozeduren aus der msdb Datenbank verwendet werden.

EXEC msdb.dbo.sp_start_job 251601B4′

Die IDs der für die angelegten Jobs und die IDs für die zugehörigen Abos sind in der [dbo].[ReportSchedule] Tabelle der ReportServer DB hinterlegt. Wenn man diese Tabelle noch mit der dbo.Subscriptions verbindet:

SELECT
     [ScheduleID]
    
,[ReportID]
   ,rs.[SubscriptionID]
   ,s.Description
   ,[ReportAction]
FROM [dbo].[ReportSchedule] rs
INNER JOIN dbo.Subscriptions s ON rs.SubscriptionID = s.SubscriptionID

können die JobIDs den zugehörigen Abos zugeordnet werden.

Der passende Bericht

Nachdem die Grundlagen für die Deaktivierung bzw. Aktivierung der Abonnements geklärt sind, kann ein einfacher Bericht erstellt werden, mit dem die Ausführung und der Status des Abos gesteuert werden kann.

Für den Bericht muss eine Datenquelle für die ReportServer Datenbank erstellt werden und die folgenden Parameter werden benötigt, um die zugehörigen Funktionalitäten zu gewährleisten:

Parameter Typ Beschreibung
SetActiv Text (0,1) Default: 0 0 – Keine Aktion wird ausgeführt1 – Der Status des ausgewählten Abos wird geändert
SubscriptionID Text ID des Abos.Blank und null Value aktiviert
JobName Text ID des JobsBlank und null Value aktiviert
InactiveFlags Text Neue Status für das zugehörige Abo0 – aktiviert1 – deaktiviertBlank und null Value aktiviert
Execute Text (0,1) Job0 – nicht ausführen1 – ausführen

Des Weiteren brauchen wir ein Dataset, das zum einen die Informationen, wie vorhandene Abos, Berichtsnamen, etc. ermittelt, um sie im Bericht anzuzeigen, zum anderen aber auch Abos aktiviert und deaktiviert, sowie einzelne Jobs ausführt. Die Steuerung der Ausführung wird durch die einzelnen Parameter vollzogen und einzelne Teile der Abfrage übergangen oder ausgeführt:

if @SetActiv = 1
BEGIN
UPDATE Subscriptions set [InactiveFlags] = @InactiveFlags
where
      
[SubscriptionID] = @id
END

if @Execute = 1
BEGIN
EXEC msdb.dbo.sp_start_job @JobName
WAITFOR
delay ’00:00:05′
END

SELECT s.SubscriptionID, rs.ScheduleID AS JobName, s.OwnerID, u.UserName, s.Report_OID, c.Name AS Reportname, s.Description AS SubDesc, s.InactiveFlags AS Active, s.ExtensionSettings, s.Locale, s.ModifiedByID, s.ModifiedDate, s.LastStatus, s.EventType, s.MatchData, s.LastRunTime, s.Parameters, s.DataSettings, s.DeliveryExtension, s.Version, s.ReportZone
FROM Subscriptions AS s
    
INNER JOIN Users AS u ON u.UserID = s.OwnerID
     INNER JOIN
Catalog AS c ON s.Report_OID = c.ItemID
     INNER JOIN
ReportSchedule AS rs ON s.SubscriptionID = rs.SubscriptionID

Im unteren Teil der Abfrage werden die Informationen ermittelt, im oberen Teil wird zunächst der Status des Abos aktualisiert oder der ausgewählte Job gestartet. Dadurch, dass das Statusänderungen und Jobausführungen über die Links in der Tabelle gesteuert werden, ist immer nur einer der beiden Parameter @SetActiv und @Execute eins und es wird immer nur eine der beiden Aktionen ausgeführt.

Um die Daten anzuzeigen erstellen wir eine einfache Tabelle:

Für das Feld Aktiv wird die folgende Expression: =iif(Fields!Active.Value = 0,„Aktiv“,„Deaktiviert“) verwendet und die folgende Aktion, für die Ã?nderung des Status, definiert:

Zum Schluss muss noch das Ausführen des Jobs ermöglicht werden. Hierfür definieren wir eine Aktion für das Textfeld Execute:

Jetzt ist der Bericht soweit fertig, dass der Status und das Ausführen der Abos verwaltet werden kann, birgt aber noch die ein oder andere Gefahr in sich. So wird z.B. ein Abo erneut ausgeführt, wenn man den Bericht nach einem Execute aktualisiert. Für eine erste Demonstration sollte er aber reichen.

Schreibe einen Kommentar