След аудита данных для Reportviewer SSRS

Я хочу получить представление о том, как я могу захватить след аудита данных отчета SSRS, который будет отображаться в отчете Asp.net reportviwer.

Мне не нужен журнал выполнения. Например, мой отчет принимает отдел в качестве входных данных и дает всю информацию о сотруднике, работающем в этом отделе.

Теперь мое требование состоит в том, что, скажем, я запускаю отчет для отдела a и получаю некоторого сотрудника, тогда мне нужно регистрировать контрольный журнал, говоря, что я видел записи того и того же сотрудника.

Я думал, что из самой SSRS я могу вставить запись, которая извлекается или обрабатываться, но что делать, если рендеринг не удался, мой журнал все равно скажет, что я видел запись еще до того, как она появилась на странице ASP.Net. Второй способ заключается в том, что я должен сделать другой вызов после того, как данные будут отображаться с одним и тем же параметром, а затем запишите результат, который может дать мне неправильный результат, поскольку данные могут быть изменены в этом небольшом интервале.

во-вторых, есть способ отслеживать событие сохранения и печати. Управление asp.net reportviewer

с нетерпением жду идей. Заранее спасибо.

1 ответ

Службы Reporting Services могут не быть решением для вас, если вы хотите добавить поведение к доступу к данным. Отчеты лучше всего отображать данные, не имеющие побочных эффектов.

Тем не менее, возможно, самое лучшее, что вы можете сделать, - это провести аудит процесса рендеринга с использованием пользовательского кода. Например, когда вы показываете код сотрудника, вы вызываете функцию записи, которую он отображал, и кем:

Function AuditEmployeeAccess(EmployeeCode As String) As String
 ' Connect to database, audit access (off the top of my head, could be bad)
 Dim con As New SqlConnection
 Dim cmd As New SqlCommand
 con.ConnectionString = "Data Source=MyServer;Initial Catalog=AuditDb;User ID=username;Password=password"
 con.Open()
 ' Don't do this, use parameters
 cmd.CommandText = ("insert into audit (AuditEmployeeCode, AccessEmployeeCode) values ('" + Globals!UserId.Value + "', '" + EmployeeCode + "')")
 cmd.Connection = con
 cmd.ExecuteNonQuery()
 con.Close()

 ' Return the employee code for display in the report 
 Return EmployeeCode
End Function

то вместо ячейки, содержащей значение поля, она использует выражение:

=Code.AuditEmployeeAccess(Fields!EmployeeCode.Value)

Теперь это будет проверяться всякий раз, когда код сотрудника отображается, а не когда он просматривается. Например, если отчет составляет 5 страниц, но просмотрщик просматривает только первые две страницы, доступ все равно будет проверяться для тех, что на стр. 5.

По этой причине вам, вероятно, лучше создавать пользовательский экран, а не использовать отчет.

licensed under cc by-sa 3.0 with attribution.