Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Журнализация
|
|||
|---|---|---|---|
|
#18+
Здравствуйте!!! Есть задача - ведение журнала изменения таблиц БД, в котором бы отображалось действие над таблицей и его результат (данные до изменения и после изменения). Причем хотелось бы добиться относительно универсального решения и не плодить журнальные таблицы для каждой таблицы БД. Прошу поделиться опытом по данной проблеме, а также, если есть, готовыми решениями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2001, 03:28 |
|
||
|
Журнализация
|
|||
|---|---|---|---|
|
#18+
Сейчас как раз работаю над этой проблемой. Общая идея такова. Серверная часть. Создается таблица куда будем складывать лог. Собственно информация будет складываться в поле типа TEXT в формате XML. Пишем SP которая генерит триггеры на таблицы, которые хотелось-бы отслеживать. Триггеры пишут в нашу табличку маску изменений и всю строку из отслеживаемой таблицы в формате XML. Клиентская часть. Пишем клиента на чем удобнее, чтобы при необходимости разобрать весь хлам, хранящийся в нашей табличке-логе. Т.е. клиент должен обработать маску изменений и вынуть из XML строки нужную информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2001, 06:20 |
|
||
|
Журнализация
|
|||
|---|---|---|---|
|
#18+
Я тут по форуму полазил и нашел чудную (на первый взгляд - еще не проверял) вещь. Вот линк www.gvu.newmail.ru если не видел посмотри - прикольно! Описалово прочел - именно то, что мне и нужно. Может и тебе жизнь облегчит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2001, 07:00 |
|
||
|
Журнализация
|
|||
|---|---|---|---|
|
#18+
www.gvu.newmail.ru - да там действительно лежит практически готовое решение, но использованые в нем курсоры очень сильно грузят сервер и резко замедляют работу , поэтому , как и предупреждал сам автор , использовать его реально можно лишь в системах, где обновление или удаление данных происходит достаточно редко. От себя добавлю количественную оценку скорости работы - удаление записи из родителькой таблицы плюс очистка тригерами из двух дочерних таблиц (около 150000 записей в каждой) без журнализации занимает 0.15 - 0.2 сек , с журнализацией - 1.5 - 1.7 , причем загрузка проца под 100%. Роман ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2001, 09:44 |
|
||
|
Журнализация
|
|||
|---|---|---|---|
|
#18+
2olegusan: А как Вы планируете сделать "информация будет складываться в поле типа TEXT в формате XML."? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2001, 12:03 |
|
||
|
Журнализация
|
|||
|---|---|---|---|
|
#18+
To alexeyvg > А как Вы планируете сделать "информация будет складываться в поле типа TEXT в формате XML."? А очень просто INSERT INTO SuperTable (Superfield) SELECT '<MyTable><Field1>'+Field1+'</Field1><Field2>'+....+'</MyTable>' as Superfield FROM INSERTED Тут возникает проблема с полями TEXT в измененной таблице. Из INSERTED/DELETED их не вытащить. Но вообще - решаемая проблема. Использовать SELECT FOR XML не получается. BOL пишет, что использовать FOR XML почти нигде нельзя кроме как в тупом SELECT. To ALL Странно. Кто-то запостил сообщение под моим ником про www.gvu.newmail.ru Copyright violation однако ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2001, 22:48 |
|
||
|
Журнализация
|
|||
|---|---|---|---|
|
#18+
У себя на работе я веду журнал для каждой таблицы в отдельности. Собственно это обусловлено высокой транзакционностью базы данных, так что производительность - на первом месте. Тем не менее необходимВкратце суть решения: Создана база для хранения сессий. Так как в моей системе баз данных несколько, а приложение поочередно может работать то с одной то с другой, то "для справедливости" таблица сессий создана на третьей базе данных. Доступ к ней осуществляется через сохраняемую процедуру usp_ValidateSession. В таблице сессии сохраняются данные о HostName, AppName, UserName. Для каждой таблицы создается своя таблица - журнал. В отличие от основной таблицы в журнале добавлены поля: TR_SessionID (int), TR_Time (datetime), TR_Action (tinyint), TR_Id (int, identity). Primary key этой таблицы составляет Primary Key основной таблицы + TR_Id. После этого на каждую таблицу заводятся триггер на каждое действие. Во время исполнения триггер вызывает процедуру usp_ValidateSession для получения SessionID по HostName, AppName, UserName. Если в таблице сессий такое сочетание уже есть, то будет вернута существующая сессия, если нет - то тогда будет создана новая сессия и процедура вернет ее номер. Далее в зависимости от типа действия триггером в журнал будет занесены данные из INSERTED или DELETED таблиц с соответствующими TR_SessionID, TR_Time (всегда getdate()), TR_Action: (1-insert, 2-update, 3-delete), TR_Id = следующее значение IDENTITY. Для уменьшения головной боли с этими однотипными тригерами и таблицами я написал процедуру которая генерит их всех автоматически. А список таблиц для журнализации находится в сессионной базе данных. Так что я туда просто заношу или удаляю название таблицы и запускаю процедуру, а та уже разбирается что надо сделать. Роман ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2001, 02:53 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32017503&tid=1824883]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 351ms |

| 0 / 0 |
