20.10.2011, 16:29 | #1 |
Участник
|
Создание снимков изменений в базе данных
Привет всем!
Предлагаю вам попробовать утилиту, которая позволяет просмотреть историю изменений базы данных между двумя заданными промежутками времени. Прилагаются проекты для AX2009 и для AX3.0. Например, вы разнесли накладную, и вам интересно посмотреть, в какие таблицы записались данные, методы каких классов вызывались при изменении той или иной таблицы в базе. Утилита реализована в виде, похожем на стандартную форму "Администрирование - Запросы - Журнал базы данных". Используется стандартный функционал журнала базы данных. Основные отличия от стандартного журнала базы данных: 1) Видно все изменения в базе, которые произошли при разноске накладной (или журнала), либо при создании нового клиента и так далее. 2) Видно стек вызовов методов на Х++ 3) Можно создавать множество снимков журнала базы данных. Каждый из снимков имеет свое название. Снимки можно именовать, к примеру, так "Разноска накладной по заказу ХХХХ", "Разноска складского журнала YYYY" и так далее. В принципе, похожего результата можно добиться и при стандартном использовании мониторинга запросов SQL для пользователя. Но данная утилита предоставляет возможность просмотреть сразу все изменения в одном месте, в сжатом виде и с максимальным количеством информации. Средства просмотра изменений практически все взяты из формы журнала базы данных. Инструкция по использованию: 1) Накатите проект на тестовую базу (из стандартных объектов изменяется только таблица SysDatabaseLog 2) Выполните пункт меню "Начать формирование снимка изменений данных" 3) В открывшемся диалоговом окне введите название снимка (можно оставить предлагаемое по умолчанию название). Нажмите кнопку Ок. 4) Разнесите какой-нибудь журнал, накладную, введите новую номенклатуру в справочник и т.д. 5) Выполните пункт меню "Завершить формирование снимка изменений данных" 6) Выполнте пункт меню "Снимки изменений в базе данных". 7) В открывшейся форме можно пользоваться всеми фукнциями просмотра журнала базы данных, просматривать стек вызова для каждого изменения, во вкладке "История" видеть старые и новые значения полей. 8) В раскрывающемся списке "Название снимка" можно выбирать другие снимки для просмотра. По умолчанию форма открывается с последним сделанным снимком. 9) Сохраненные снимки можно редактировать через кнопку "Список снимков", расположенную рядом с раскрывающимся списком "Название снимка". Особенности работы утилиты: 1) Изменения в снимке сохраняются только для того пользователя, который начал формирование снимка. Просматривать снимок могут все пользователи, у которых есть права доступа. 2) Можно оставить снимок незавершенным на долгое время - тогда туда попадут все изменения, сделанные данным пользователем. 3) Данные в снимке можно просматривать только после завершения (через пункт меню "Завершить формирование снимка изменений данных") 4) Не рекомендуется настраивать журнал базы данных, если в текущий момент не завершен снимок, иначе при завершении снимка все изменения в настройках журнала базы данных потеряются. В любое другое время можно настраивать журнал базы данных без ограничений. Примечание: на разработку с нуля данной утилиты у меня ушло примерно 4 часа. Идея о ее создании витала где-то пару месяцев. Последний раз редактировалось Ace of Database; 20.10.2011 в 17:46. |
|
|
За это сообщение автора поблагодарили: slava (1), Logger (5), Poleax (5), Atar (2), ice (1), someOne (2). |
20.10.2011, 16:58 | #2 |
Участник
|
а нужно чтото дополнительно настроить? а то у меня чтото не сработала запись
|
|
20.10.2011, 17:04 | #3 |
Участник
|
А ты выполнил пункт меню "Завершить формирование снимка изменений данных"?
Я накатывал на чистое приложение. Вроде должно работать, если выполнить все по инструкции. Инструкция по использованию: 1) Накатите проект на тестовую базу (из стандартных объектов изменяется только таблица SysDatabaseLog 2) Выполните пункт меню "Начать формирование снимка изменений данных" 3) В открывшемся диалоговом окне введите название снимка (можно оставить предлагаемое по умолчанию название). Нажмите кнопку Ок. 4) Разнесите какой-нибудь журнал, накладную, введите новую номенклатуру в справочник и т.д. 5) Выполните пункт меню "Завершить формирование снимка изменений данных" 6) Выполнте пункт меню "Снимки изменений в базе данных". 7) В открывшейся форме можно пользоваться всеми фукнциями просмотра журнала базы данных, просматривать стек вызова для каждого изменения, во вкладке "История" видеть старые и новые значения полей. 8) В раскрывающемся списке "Название снимка" можно выбирать другие снимки для просмотра. По умолчанию форма открывается с последним сделанным снимком. 9) Сохраненные снимки можно редактировать через кнопку "Список снимков", расположенную рядом с раскрывающимся списком "Название снимка". |
|
20.10.2011, 17:15 | #4 |
Участник
|
да в 6п открывается форма, в котором выбран снимок, но в гридах все пусто
пс очень быстро срабатывает 3п Последний раз редактировалось ice; 20.10.2011 в 17:18. |
|
20.10.2011, 17:21 | #5 |
Участник
|
Похоже, у вас в домене настроен журнал базы данных.
У вас в таблице DomainInfo есть записи? У нас нет. Подумаю, как для доменов подкрутить |
|
20.10.2011, 17:28 | #6 |
Участник
|
база чистая, с демо данными, без модификаций. в DomainInfo одна запись, с id Admin
|
|
20.10.2011, 17:30 | #7 |
Участник
|
Исправил проекты. Перезакачай проект, попробуй. У меня есть Аксапта с доменами. В ней тоже не работало - а сейчас заработало.
|
|
20.10.2011, 17:47 | #8 |
Участник
|
Еще подправил проекты, чтобы служебная таблица SysEvent не попадала в историю.
|
|
20.10.2011, 17:58 | #9 |
Участник
|
с этим я справился). есть еще одна проблема, нет истории на вкладке история
|
|
20.10.2011, 18:03 | #10 |
Участник
|
Еще есть особенность для таблиц, у которых SaveDataPerCompany = NO.
Для них история сохраняется в компании DAT. И если текущая компания отличается от DAT, то строки такой истории не видны среди остальных строк. Попозже доделаю для таких таблиц. |
|
20.10.2011, 18:07 | #11 |
Участник
|
этот признак yes, и компания dat
|
|
20.10.2011, 18:07 | #12 |
Участник
|
Цитата:
Попробуй для таблиц, которые входят в табличные коллекции (виртуальные компании), потом для таблиц, у которых SaveDataPerCompany = No, и потом для всех остальных "нормальных" таблиц. |
|
20.10.2011, 23:10 | #13 |
Участник
|
Пока не скачивайте проекты.
Устранил проблемы, связанные с ведением журнала базы данных в разных компаниях. Завтра выложу проекты и сообщу когда можно будет попробовать. Можно будет видеть изменения сразу в нескольких компаниях - полезно для случаев, когда документы транслируются в разые компании. |
|
21.10.2011, 09:27 | #14 |
Участник
|
|
|
21.10.2011, 09:58 | #15 |
Участник
|
Выкладываю исправления.
Теперь историю изменений данных можно смотреть сразу во всех компаниях. Удобно отслеживать сложный функционал, когда при выполнении пользователем какой-то операции, создаются документы в разных компаниях. Тестировал в следующих конфигурациях: 1) Без доменов, но с тремя компаниями и одной виртуальной компанией 2) С одним доменом, одной компанией и без виртуальных компаний. Для конфигураций с больше чем одним доменом не тестировал. Кто уже накатывал проект, то можете удалить форму zSysDatabaseLogSnapshot, вместо нее используется форма zSysDatabaseLogSnapshot2 (она включена в новые проекты). Последний раз редактировалось Ace of Database; 21.10.2011 в 10:26. |
|
21.10.2011, 10:47 | #16 |
Участник
|
На время лучше выключить логирование запросов SQL для того пользователя, под которым работает эта утилита, иначе история засоряется.
|
|
28.10.2011, 12:16 | #17 |
Участник
|
В системе есть Профайлер кода для таких целей.
А добавление дополнительного поля в SysDatabaseLog считаю не лучшим вариантом, поскольку данное поле заполняется стеком вызова при любом пользователе. |
|
01.11.2011, 12:34 | #18 |
Участник
|
Стек вызовов в таблице SysDatabaseLog почти каждый день смотрю. Часто приходится разбираться, какая обработка сделала ту или иную операцию. Поэтому то, что стек сохраняется для всех пользователей - как раз удобно в боевых условиях.
А чтобы журнал базы данных сильно не разрастался и не тормозил, у нас на SQL-сервере крутится джоб, который его периодически режет и отправляет старые данные в отдельную базу. На форме журнала базы данных выведена кнопка, которая по запросу восстанавливает историю обратно из архива в рабочую базу. Последний раз редактировалось Ace of Database; 01.11.2011 в 12:37. |
|