Подключение Аудита проводится на этапе разработки приложения.

Содержание раздела:

Требования к БД MS SQL

Для корректной работы аудита на MS SQL необходимо, чтобы у пользователя или роли базы данных были права на выборку из системной таблицы sys.dm_tran_current_transaction. Так же для этой таблицы необходимы права VIEW SERVER STATE.

Для выдачи данных прав для роли PUBLIC скрипт будет выглядеть следующим образом:

 

use [master]

GRANT SELECT ON [sys].[dm_tran_current_transaction] TO [public]

Go

GRANT VIEW SERVER STATE TO [public]

GO

Начало работы

Чтобы подключить Аудит Xafari к Приложению, вам следует добавить в Приложение следующие модули:

"SettingAccessor.Instance must have a value, that contains links to audit settings."

Пример работы с SettingAccessor:

Определить класс-наследник BCDemoSettingsAccessor :

 

public class BCDemoSettingsAccessor : SettingsAccessor

{

    public BCDemoSettingsAccessor(XafApplication application) : base(application)

    {

        this.RootSlice = new BCDemoSettingsDefaultValueSlice();

        this.SliceTypes = new[] {typeof (BCDemoSettingsIDCSecuritySystemUser)};

    }

}

 

public class BCDemoSettingsDefaultValueSlice:SettingDefaultValueSlice<BCDemoSettingsIDCSecuritySystemUser>

{

    public override IEnumerable<BCDemoSettingsIDCSecuritySystemUser> GetChildrenFromNextSlice()

    {

        var user = this.ObjectSpace.GetObjects<IDCSecuritySystemUser>();

        return user.Select(slice1 =>

            (BCDemoSettingsIDCSecuritySystemUser)this.GetChildSlice(slice1)).ToList();

    }

}

 

public class BCDemoSettingsIDCSecuritySystemUser : SettingValueSlice<IDCSecuritySystemUser,

     BCDemoSettingsDefaultValueSlice>

{

    public override List<SettingsValueSlice> ChildrenSlices

    {

        get { return new List<SettingsValueSlice>(); }

    }

}

 

Сконфигурировать BCDemoSettingsAccessor в методе Setup плаформенно-независимого модуля приложения:

 

public override void Setup(XafApplication application)

{

    base.Setup(application);

    application.SettingUp += (sender, args) =>

    {

        if (this.Application.IsSharedApplication()) return;

        this.Application.LoggedOn += (o, eventArgs) =>

        {

            SettingsAccessor.Instance.CurrentSlice =

                SettingsAccessor.Instance.GetSlice(SecuritySystem.CurrentUser);

        };

    };

 

    application.SetupComplete += (sender, args) =>

    {

        if (this.Application.IsSharedApplication()) return;

        SettingsAccessor.Instance = new BCDemoSettingsAccessor((XafApplication) sender);

    };

}

 

Типы с поддержкой Аудита

Domain Component:

 

   [DomainComponent]

   [DefaultClassOptions]

  public interface MainDC : XafariObject

   {

      int IntValue { get; set; }

 

      string StringValue { get; set; }

   }

 

XPO:

    

   [DefaultClassOptions]

  public class XpoMainDC : BaseObject, IAuditSupport

   {

      public XpoMainDC(Session session) : base(session)

       {}

 

      private int _intValue;

      public int IntValue

       {

          get { return _intValue; }

          set { this.SetPropertyValue("IntValue", ref _intValue, value); }

       }

 

      private string _stringValue;

      public string StringValue

       {

          get { return _stringValue; }

          set { this.SetPropertyValue("StringValue", ref _stringValue, value); }

       }

 

      public override void AfterConstruction()

       {

          base.AfterConstruction();

          this.HistoryCreate = new ActionInfo {ActionExecutor = SecuritySystem.CurrentUserName, Date = DateTime.Now};

       }

 

      protected override void OnDeleting()

       {

          this.HistoryDelete = new ActionInfo { ActionExecutor = SecuritySystem.CurrentUserName, Date = DateTime.Now };

          base.OnDeleting();

       }

 

      protected override void OnChanged(string propertyName, object oldValue, object newValue)

       {

          base.OnChanged(propertyName, oldValue, newValue);

          this.HistoryModify = new ActionInfo { ActionExecutor = SecuritySystem.CurrentUserName, Date = DateTime.Now };

       }

 

      private ActionInfo _historyCreate;

       [Persistent]

      public ActionInfo HistoryCreate

       {

          get { return _historyCreate; }

          set { this.SetPropertyValue("HistoryCreate", ref _historyCreate, value); }

       }

 

      private ActionInfo _historyModify;

       [Persistent]

      public ActionInfo HistoryModify

       {

          get { return _historyModify; }

          set { this.SetPropertyValue("HistoryModify", ref _historyModify, value); }

       }

 

      private ActionInfo _historyDelete;

       [Persistent]

      public ActionInfo HistoryDelete

       {

          get { return _historyDelete; }

          set { this.SetPropertyValue("HistoryDelete", ref _historyDelete, value); }

       }

 

      private ulong _transactionId;

      public ulong TransactionId

       {

          get { return _transactionId; }

          set { this.SetPropertyValue("TransactionId", ref _transactionId, value); }

       }

   }

 

API для работы с Аудитом напрямую из кода

Для доступа к API используйте статический класс Xafari.BC.Audit.XafariAuditSettings. Он предоставляет следующие свойства:

TopReturningObjects: определяет максимальное количество записей в БД, которые будут получены по запросам (по умолчанию 1000).

UserModifyFieldName: указывает имя поля, в котором хранится имя пользователя, который изменил объект.

DateModifyFieldName: указывает имя поля, в котором хранится дата изменения объекта.

AuditSettingsManager: менеджер настроек, он позволяет управлять настройками и данными Аудита (см. AuditSettingsManager Interface). Менеджер предоставляет следующие методы:

Для Аудита на триггерах БД (класс AuditSettingsManagerDbTriggers является наследником IAuditSettingsManager) есть событие SpecifyAuditDataProvider, позволяющее переопределить текущий провайдер данных, если БД отличается от MS-SQL (Oracle).

Использование в критериях

Специальный служебный класс XafariTransactionsAudit позволяет успешно использовать данные Аудита при построении критериев. Он предоставляет следующие поля:

Audit_AuditDateTime: дата записи в журнал Аудита.

Audit_AuditId: Id записи Аудита (служебное поле).

Audit_TableName: имя той таблицы, для которой была создана запись.

Audit_AuditTableName: имя той таблицы Аудита, в которую были записаны дополнительные данные Аудита.

Audit_ActionType: позволяет указать некоторые стандартные операции, которые произведены над объектом. Можно использовать следующие значения:

I: создана запись

U: изменены поля объекта

D: удален объект

Action: […]: запуск Action

BO: […]: запуск Бизнес-операции

BO RoledBack: […]: откат Бизнес-операции

LogIn: […]: авторизация пользователя пользователя (log in)

LogOff: […]: выход пользователя (log off)

Report: […]: построен отчет

Audit_SpecifyTransaction: идентификатор той транзакции, в которой были выполнены изменения.

Audit_UserName: имя пользователя, который выполнил изменения.

Audit_ObjectId:  Id того объекта, который подвергся изменениям. Возможны два варианта указать значение: прямое значение идентификатора, либо его строковое представление. Например, 'E9B9B41E-2C5D-44C3-A1F3-FE6CEC908993’ или ‘[Guid]’E9B9B41E-2C5D-44C3-A1F3-FE6CEC908993’’.

Audit_TypeName: полное имя аудируемого типа.

Audit_Notes: примечания к записи Аудита.

Примеры критериев:

Пример 1. Получить записи Аудита для типа Xafari.BCDemo.BusinessObjects.DynamicPropertiesDC, которые находятся в заданном временном периоде:

 

[Audit_TypeName] = 'Xafari.BCDemo.BusinessObjects.DynamicPropertiesDC' AND ([Audit_AuditDateTime] > ?) AND ([Audit_AuditDateTime] < ?)

 

Пример 2. Получить записи Аудита для типа Xafari.BCDemo.BusinessObjects.DynamicPropertiesDC, которые находятся в заданном временном периоде и которые относятся к операции "создать".

 

[Audit_TypeName] = 'Xafari.BCDemo.BusinessObjects.DynamicPropertiesDC' AND ([Audit_AuditDateTime] > ?) AND ([Audit_AuditDateTime] < ?) AND [Audit_ActionType] = 'I'

 

Такие критерии использует функция GetChangedObjects.

Аудит на БД Oracle:

Для того, чтобы Аудит работал на БД Oracle, платформа поставляет класс OracleDataProvider. Этот класс реализует интерфейс IDataProvider и обеспечивает низкоуровневое взаимодействие с базой данных. Если строка подключения содержит XpoProvider=Oracle, то OracleDataProvider загрузится автоматически. Таково поведение по умолчанию.

Если поведение по умолчанию является неудовлетворительным, то имеется событие SpecifyAuditDataProvider у класса AuditSettingsManagerDbTriggers, позволяющее переопределить провайдер данных. Разработчик может указать собственный провайдер, при условии, что в нем реализован интерфейс IDataProvider.

Атрибуты для полей

ReferenceAudit атрибут применяется для ссылочных полей объекта. Он указывает, что данное поле необходимо аудировать как аггрегированное (то есть при изменении объкта, который храниться в данном поле, должна быть сделана и запись об изменении объекта-владельца).

NotAudited атрибут указывает, что данное поле не будет аудироваться и для него не надо генерировать Настройку.