Администрирование
03
Май
0

Аудит использования отчетов в CRM 4.0

Reporting Services обычно рассматривают самое большее, как механизм выполнения и рендеринга отчетов. Однако, у него также есть своя собственная база данных SQL, которая содержит информацию, которая может быть полезной. В этой статье я рассмотрю то, как Вы можете использовать информацию, полученную из таблиц ExecutionLog и Catalog, о том, кто запустил какой отчет, и сколько времени это заняло.

Рекомендуется периодически извлекать данные лога ReportServer в отдельную базу данных, и уже затем выполнять запрос к этой базе данных. Этого позволяет Вам создавать любые дополнительные SQL объекты, например, собственные функции. Также это дает больше гибкости, в вопросе безопасности SQL, поскольку большинство пользователей по умолчанию не имеют прав делать запрос к базе данных ReportServer напрямую. С другой стороны прямой запрос к БД ReportServer дает всегда актуальные данные, но это требует, чтобы у пользователей было достаточное прав на запросы к таблицам.

Скрипты, описанные ниже, берут данные из нескольких таблиц:

  • ExecutionLog – в этой таблице содержаться основные данные, которые мы будем использовать. Здесь хранятся записи о каждом выполненном отчете, включая статистику по времени, и используемым параметрам;
  • FilteredSystemUser – вьюха из основной базы MS CRM, в которой содержаться агрегированные данные по всем пользователям системы;
  • FilteredReport – также вьюха из БД MS CRM, но призванная аккумулировать информацию об отчетах существующих в CRM системе;
  • Catalog – включает общую информацию о каждом запускаемом отчете в Reporting Services

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

select
	fr.name as 'Название',
	fu.FullName as 'Пользователь', 
	CONVERT(VARCHAR(30),l.TimeStart,20) as 'Начало', 
	DATEPART(s,l.TimeEnd - l.TimeStart) as 'Выполнение (сек)'
from 
	ReportServer.dbo.executionlog l,
	ReportServer.dbo.catalog c,
	superfirma_MSCRM.dbo.FilteredReport fr,
	superfirma_MSCRM.dbo.FilteredSystemUser fu
where
	l.ReportId = c.ItemId and
	c.name = '{' + cast(fr.reportid as nvarchar(100)) + '}' and
	l.UserName collate Cyrillic_General_CI_AI = fu.domainname 
order by 
	l.TimeStart desc

И еще один…

select
	fr.name as 'Название',
    SUBSTRING(
        RIGHT (
            CAST(l.Parameters AS varchar(1000)), 
            (LEN(CAST(l.Parameters AS varchar(1000))) - 
                CHARINDEX ('&CRM_FullName=', l.Parameters) - 
                LEN('CRM_FullName='))
        ),
        0,
        CHARINDEX(
            '&',
            RIGHT (CAST(l.Parameters AS varchar(1000)), 
            (LEN(CAST(l.Parameters AS varchar(1000))) - 
                CHARINDEX ('&CRM_FullName=', l.Parameters) - 
                LEN('CRM_FullName='))) )) as 'Пользователь', 
	CONVERT(VARCHAR(30),l.TimeStart,20) as 'Начало', 
	DATEPART(s,l.TimeEnd - l.TimeStart) as 'Выполнение (сек)'
from 
	ReportServer.dbo.executionlog l,
	ReportServer.dbo.catalog c,
	superfirma_MSCRM.dbo.FilteredReport fr
where
	l.ReportId = c.ItemId and
	c.name = '{' + cast(fr.reportid as nvarchar(100)) + '}'
order by
	l.TimeStart desc


Почему два? Сейчас объясню! Эти два скрипта отличаются только способом получения имени юзвера, запустившего отчет. А все потому, что существует два кардинально различающихся способа (с точки зрения CRM) установки сервера отчетов:

  1. В первом случаи сервер отчетов и CRM сервер ставятся на одной машине. Это самый простой способ, но не самый лучший с точки зрения производительности (особенно при больших нагрузках). В этом случаи имя пользователя мы получаем из вьюхи FilteredSystemUser через доменное имя пользователя, которое записывается в ExecutionLog.
  2. Во втором случаи сервер ставится на отдельную (от CRM сервера) машину. И тут для работы отчетов необходимо вместе с ним (с Reporting Services’ом) также поставить Dynamics CRM Data Connector. Вот тут начинается геморрой… а именно: вместо доменного имени пользователя, в таблицу ExecutionLog будет записываться такая строчка – NT AUTHORITY\NETWORK SERVICE. Понятно дело, что с такой идентификацией нам не узнать кто запустил отчет. Поэтому необходимо «препарировать» параметры, которые передаются отчету. А если еще точнее, то нам нужен параметр CRM_FullName, содержащей имя пользователя, выполняющего отчет. Его мы и выцепляем путем извлечения подстроки. Так что обязательно пишите свои отчеты с включением этого параметра (как это сделать – посмотрите в каком-нибудь стандартном отчете, входящем в MS CRM).

Дополнительно рассмотрите возможность получения другой информации из ExecutionLog, например, CRM_FilterText содержащий текстовое представление предфильтра, используемого в отчете. А в случаи если в Вашем развертывании несколько организаций, то их названия можно получить из таблички Catalog, поле Path (тут тоже нужно будет пошаманить, чтобы вытащить только название организации 🙂 ).

Комментарии (0)

*

code