07.11.2011, 11:53 | #1 |
Участник
|
Таблица Аудита в БД
День добрый.
Необходимо разработать отчет в 2011 с отслеживанием изменения одного поля объекта. Пытаюсь в БД найти таблицу аудита, но все концы ведут к AuditBase. Из этой таблицы невозможно вытащить наименование поля, какие изменения были сделаны (до/после), юрера изменяющего (только id). Возможно есть другая таблица или какое-нить решение? |
|
07.11.2011, 12:27 | #2 |
Консультант-джедай
|
ооооо таблица аудита это еще та жжжжжжжж я тоже писал отчет по аудиту в итоге получился километровый SQL запрос который парсит эту таблицу (инфа в ней хранится в ненормализованном виде - сделано для увеличения производительности)
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
|
За это сообщение автора поблагодарили: a33ik (0). |
07.11.2011, 14:46 | #3 |
Участник
|
На форуме ms есть наплохой пост на эту тему:
http://social.microsoft.com/Forums/e...-9ca56a0c5aab/ Там все расписано, далее уже можно самостоятельно разобраться. |
|
|
За это сообщение автора поблагодарили: a33ik (1). |
07.11.2011, 16:57 | #4 |
Чайный пьяница
|
Добрый день. Сел посмотрел как в 2011 организован аудит - заикал, попил воды и написал следующий запрос, который демонстрирует как можно работать с аудитными данными. Возможно натолкнёт вас на мысль как вам удобнее сделать ваш отчёт:
Код: Declare @attributes VarChar(Max), @values VarChar(Max), @ObjectTypeCode int, @LogDateTime DateTime, @RecordId uniqueidentifier, @UserId Uniqueidentifier, @ActionId int Declare @Result Table(AttributeId int, Value VarChar(Max), ObjectTypeCode int, LogDateTime DateTime, RecordId uniqueidentifier, UserId uniqueidentifier, ActionId int) Declare @CurrentAttribute VarChar(max), @CurrentValue VarChar(Max) DECLARE DataAuditCursor CURSOR FOR Select Case When IsNull(a.AttributeMask, '') = '' Then '' Else Substring(a.AttributeMask, 2, Len(a.AttributeMask) - 2) End ,a.ChangeData ,a.ObjectTypeCode ,a.CreatedOn ,a.ObjectId ,a.UserId ,a.[Action] From Audit a OPEN DataAuditCursor FETCH NEXT FROM DataAuditCursor INTO @attributes, @values, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId WHILE @@FETCH_STATUS = 0 BEGIN WHILE CHARINDEX(',',@attributes,0) <> 0 BEGIN SELECT @CurrentAttribute=RTRIM(LTRIM(SUBSTRING(@attributes,1,CHARINDEX(',',@attributes,0)-1))), @attributes=RTRIM(LTRIM(SUBSTRING(@attributes,CHARINDEX(',',@attributes,0)+1,LEN(@attributes)))), @CurrentValue=RTRIM(LTRIM(SUBSTRING(@values,1,CHARINDEX('~',@values,0)-1))), @values=RTRIM(LTRIM(SUBSTRING(@values,CHARINDEX('~',@values,0)+1,LEN(@values)))) IF LEN(@CurrentAttribute) > 0 INSERT INTO @Result Values(CAST(@CurrentAttribute as int), @CurrentValue, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId) END INSERT INTO @Result Values((Case When IsNull(@attributes, '') = '' Then Null Else CAST(@attributes as int) End), @values, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId) FETCH NEXT FROM DataAuditCursor INTO @attributes, @values, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId END CLOSE DataAuditCursor; DEALLOCATE DataAuditCursor; Select (Select Top 1 Name From MetadataSchema.Entity e Where r.ObjectTypeCode = e.ObjectTypeCode) EntityName ,(Select Top 1 a.Name From MetadataSchema.Attribute a Inner Join MetadataSchema.Entity e On a.EntityId = e.EntityId and a.ColumnNumber = r.AttributeId and e.ObjectTypeCode = r.ObjectTypeCode) AttributeName ,u.fullname UserName ,r.Value OldFieldValue ,r.RecordId ModifiedRecordId From @Result r Left Join FilteredSystemUser u On r.UserId = u.systemuserid
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Bondonello (3). |
07.11.2011, 18:39 | #5 |
Moderator
|
Коллеги, сейчас нет доступа к системе. Догадки следующие:
1. Не могли бы вы глянуть в базу, возможно для вычисления всей этой жести есть готовые встроенные функции или процедуры? 2. Еще я бы попытался посмотреть профайлером, что запрашивает система при переходе на вкладку аудита - возможно это тоже как-то прояснит обрабатываются ли данные в SQL или уже в коде сервера. 3. Не обязательно использовать SQL, возможно это как раз тот случай, когда в отчете стоит обратиться к веб сервисам. В новой версии SSRS можно смешивать данные из разных датасетов, так что, думаю можно пойти и этим путем.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
07.11.2011, 19:42 | #6 |
Чайный пьяница
|
Цитата:
Сообщение от Артем Enot Грунин
1. Не могли бы вы глянуть в базу, возможно для вычисления всей этой жести есть готовые встроенные функции или процедуры?
2. Еще я бы попытался посмотреть профайлером, что запрашивает система при переходе на вкладку аудита - возможно это тоже как-то прояснит обрабатываются ли данные в SQL или уже в коде сервера. Теоретически - можно, но с деплойментом этой красоты - намучаешься. Пробовал в одном проекте...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
08.11.2011, 00:01 | #7 |
Moderator
|
Таки в чем проблема? Адрес приложения запарсить?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
08.11.2011, 10:01 | #8 |
Чайный пьяница
|
Сегодня расскажу за рюмкой чая )
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
Теги |
audit, аудит, отчет, report, crm2011 |
|
Похожие темы | ||||
Тема | Ответов | |||
Сохранение параметров расширенного поиска в БД | 10 | |||
Таблица зависимостей привелегий | 9 | |||
Выбор записи из БД | 4 | |||
Где в БД храняться настройки объектов? | 9 | |||
Установка тестовой БД | 5 |
|