SSRS Execution Log

Por 0 No tags Permalink

Si alguna vez se preguntó quién está ejecutando sus informes de SSRS o si desea verificar los detalles de ejecución (tiempo de ejecución, tipo, etc.), Se puede obtener fácilmente todo tipo de información diferente sobre el historial de ejecución.

Vistas del registro de ejecución

Microsoft recomienda no consultar las tablas del servidor de informes directamente, para esto nos proporciona 3 vistas estándar en la base de datos del servidor de informes.

dbo.ExecutionLog: para compatibilidad con versiones anteriores

dbo.ExecutionLog2: para SQL Server 2008

dbo.ExecutionLog3: para SQL Server 2008 R2 (igual que ExecutionLog2, con 2 campos renombrados: ReportPath ahora es ItemPath y ReportAction ahora es ItemAction)

Tabla – ExecutionLogStorage

Request Type

0: Interactive
1: Subscription
2: Refresh Cache

Report Action

1: Render
2: Bookmark Navigation
3: Document Map Navigation
4: Drill Through
5: Find String
6: Get Document Map
7: Toggle
8: Sort
9: Execute

Source

1: Live
2: Cache
3: Snapshot
4: History
5: Ad Hoc (i.e., Report Builder)
6: Session (i.e., another request within existing session)
7: RDCE (i.e., Report Definition Customization Extension)

SELECT InstanceName,
	COALESCE(C.Path, 'Unknown') AS ItemPath,
	UserName,
	ExecutionId,
	CASE(RequestType)
		WHEN 0 THEN 'Interactive'
		WHEN 1 THEN 'Subscription'
		WHEN 2 THEN 'Refresh Cache'
		ELSE 'Unknown'
	END AS RequestType,
	Format,
	PARAMETERS,
	CASE(ReportAction)
		WHEN 1 THEN 'Render'
		WHEN 2 THEN 'BookmarkNavigation'
		WHEN 3 THEN 'DocumentMapNavigation'
		WHEN 4 THEN 'DrillThrough'
		WHEN 5 THEN 'FindString'
		WHEN 6 THEN 'GetDocumentMap'
		WHEN 7 THEN 'Toggle'
		WHEN 8 THEN 'Sort'
		WHEN 9 THEN 'Execute'
		ELSE 'Unknown'
	END AS ItemAction,
	TimeStart,
	TimeEnd,
	TimeDataRetrieval,
	TimeProcessing,
	TimeRendering,
	CASE(SOURCE)
		WHEN 1 THEN 'Live'
		WHEN 2 THEN 'Cache'
		WHEN 3 THEN 'Snapshot'
		WHEN 4 THEN 'History'
		WHEN 5 THEN 'AdHoc'
		WHEN 6 THEN 'Session'
		WHEN 7 THEN 'Rdce'
		ELSE 'Unknown'
	END AS SOURCE,
	Status,
	ByteCount,
	[RowCount],
	AdditionalInfo
FROM ExecutionLogStorage EL WITH(NOLOCK)
LEFT OUTER JOIN CATALOG C WITH(NOLOCK) ON (EL.ReportID = C.ItemID)

CATALOG

Esta tabla contiene todos los objetos de informe con los que un usuario puede interactuar a través de la interfaz de usuario de Web Portal, como informes, orígenes de datos e imágenes. Estos datos se almacenan como una jerarquía con una ruta principal/raíz y todos los demás objetos debajo de ella en un árbol. La siguiente consulta devuelve algunos datos básicos de esta tabla:

SELECT ItemID, Path, Name, ParentID, 
		Type, 
		CASE
			WHEN Type = 1 THEN 'Folder (1)'
			WHEN Type = 2 THEN 'Report (2)'
			WHEN Type = 3 THEN 'File (3)'
			WHEN Type = 4 THEN 'Linked Report (4)'
			WHEN Type = 5 THEN 'Data Source (5)'
			WHEN Type = 6 THEN 'Report Model (6)'
			WHEN Type = 7 THEN 'Report Part (7)'
			WHEN Type = 8 THEN 'Shared Data Set (8)'
			WHEN Type = 9 THEN 'Report Part (9)'
			WHEN Type = 11 THEN 'KPI (11)'
			WHEN Type = 12 THEN 'Mobile Report Folder (12)'
			WHEN Type = 13 THEN 'PowerBI Desktop Document (13)'
		END AS Type1,
		[Content], Intermediate, SnapshotDataID, 
		LinkSourceID, Property, Description, Hidden, CreatedByID, CreationDate, ModifiedByID, 
		ModifiedDate, MimeType, SnapshotLimit, Parameter, 
		PolicyID, PolicyRoot, 
		ExecutionFlag, ExecutionTime, SubType, ComponentID
FROM Catalog

SELECT Type, 
		CASE
			WHEN Type = 1 THEN 'Folder (1)'
			WHEN Type = 2 THEN 'Report (2)'
			WHEN Type = 3 THEN 'File (3)'
			WHEN Type = 4 THEN 'Linked Report (4)'
			WHEN Type = 5 THEN 'Data Source (5)'
			WHEN Type = 6 THEN 'Report Model (6)'
			WHEN Type = 7 THEN 'Report Part (7)'
			WHEN Type = 8 THEN 'Shared Data Set (8)'
			WHEN Type = 9 THEN 'Report Part (9)'
			WHEN Type = 11 THEN 'KPI (11)'
			WHEN Type = 12 THEN 'Mobile Report Folder (12)'
			WHEN Type = 13 THEN 'PowerBI Desktop Document (13)'
		END AS Type1, 
		COUNT(*) AS Total
FROM Catalog
GROUP BY Type

Los resultados muestran parte del contenido de mi servidor de prueba SSRS, incluye carpetas, informes y orígenes de datos.

USER

Dentro de la configuración del sitio en SSRS, los usuarios/grupos se pueden agregar, eliminar o ajustar sus permisos. Esta seguridad es independiente de los inicios de sesión y los usuarios que SQL Server mantiene por separado.

SELECT Users.UserID,
       Users.UserName,
       CASE 
			WHEN Users.UserType = 0 THEN 'SQL Server user/login'
			WHEN Users.UserType = 1 THEN 'Domain user or group'
	   END AS UserType,
       CASE 
			WHEN Users.AuthType IN (0,1) THEN 'Windows user/group'
			WHEN Users.AuthType = 2 THEN 'SQL auth'
	   END AS AuthType
FROM dbo.Users;

SUSCRIPTIONS

Esta tabla contiene todas las suscripciones definidas en SSRS. Se necesitan algunas uniones para obtener información sobre el informe al que está adjunta la suscripción, quién es el propietario o quién la modificó por última vez:

SELECT
	Subscriptions.Description,
	Subscriptions.LastStatus,
	Subscriptions.EventType,
	Subscriptions.LastRunTime,
	Subscriptions.Parameters,
	SUBSCRIPTION_OWNER.UserName AS SubscriptionOwner,
	Catalog.Name AS ReportName,
	MODIFIED_BY.UserName AS LastModifiedBy,
	Subscriptions.ModifiedDate
FROM dbo.Subscriptions
	INNER JOIN dbo.Users SUBSCRIPTION_OWNER ON SUBSCRIPTION_OWNER.UserID = Subscriptions.OwnerID
	INNER JOIN dbo.Catalog ON Catalog.ItemID = Subscriptions.Report_OID
	INNER JOIN dbo.Users MODIFIED_BY ON MODIFIED_BY.UserID = Subscriptions.ModifiedByID;

¡Esta es una información excepcionalmente útil! No existe una forma central de administrar las suscripciones en SSRS y, por lo tanto, obtener una vista completa en un solo lugar es muy útil.

UN SCRIPT MUY BUENO

SELECT c.Name, c.[Path], COUNT(*) AS TimesRun,
       MAX(l.TimeStart) AS [LastRun],
		(SELECT SUBSTRING(
			(SELECT CAST(', ' AS VARCHAR(MAX))+CAST(c1.Name AS VARCHAR(MAX))
				FROM [ReportServer].[dbo].[Catalog] AS c
				INNER JOIN [ReportServer].[dbo].[DataSource] AS d ON c.ItemID = d.ItemID
				INNER JOIN [ReportServer].[dbo].[Catalog] c1 ON d.Link = c1.ItemID
				WHERE c.Type = 2 AND c.ItemId = l.ReportId FOR XML PATH('') ), 3, 10000000) AS list) AS DataSources, 
		(SELECT SUBSTRING(
			(SELECT CAST(', ' AS VARCHAR(MAX))+CAST(REPLACE(t.UserName, 'DOMAIN_NAME\', '') AS VARCHAR(MAX)) 
				FROM ( SELECT TOP 100000 l2.UserName + '(' + CAST(COUNT(*) AS VARCHAR(100)) + ')' AS UserName
							FROM [ReportServer].[dbo].ExecutionLog AS l2
							WHERE l2.ReportID = l.ReportId
							GROUP BY l2.UserName
							ORDER BY COUNT(*) DESC ) AS t
							FOR XML PATH('')), 3, 10000000)) AS UsedBy
FROM [ReportServer].[dbo].ExecutionLog AS l
RIGHT JOIN [ReportServer].[dbo].Catalog AS c ON l.ReportID = C.ItemID
WHERE c.Type = 2 -- Only show reports 1=folder, 2=Report, 3=Resource, 4=Linked Report, 5=Data Source
GROUP BY l.ReportId, c.Name, c.[Path];

Una vez conectado al SSRS, haga clic con el botón derecho en el nombre del servidor seleccionar Propiedades para abrir la ventana Propiedades del servidor.

Asegúrese de que la casilla de verificación Habilitar registro de ejecución de informes esté marcada. Si desea conservar los registros de forma indefinida, simplemente puede desmarcar la casilla junto a Eliminar las entradas de registro anteriores a esta cantidad de días. Sin embargo, según su entorno y la cantidad de ejecuciones de informes que tenga, esto podría hacer que la tabla de registro crezca excesivamente. Dicho esto, es probable que tome MUCHO tiempo ya que los datos almacenados aquí generalmente se pueden medir en MB. Recomendaría establecer este valor en 365 o en cualquier valor que satisfaga sus necesidades de auditoría.

El otro método para cambiar este valor se puede encontrar en la página Avanced. Si mira debajo del grupo Other, verá una marca para ExecutionLogDaysKept. Actualizar este valor tendrá el mismo efecto.

Compara el precio para envíos nacionales e internacionales con hasta un 70% de ahorro.

No Comments Yet.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *