powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Журнализация
8 сообщений из 8, страница 1 из 1
Журнализация
    #32017492
Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!!!
Есть задача - ведение журнала изменения таблиц БД, в котором бы отображалось действие над таблицей и его результат (данные до изменения и после изменения). Причем хотелось бы добиться относительно универсального решения и не плодить журнальные таблицы для каждой таблицы БД. Прошу поделиться опытом по данной проблеме, а также, если есть, готовыми решениями
...
Рейтинг: 0 / 0
Журнализация
    #32017496
olegusan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас как раз работаю над этой проблемой.
Общая идея такова.
Серверная часть.
Создается таблица куда будем складывать лог.
Собственно информация будет складываться в поле типа TEXT в формате XML.
Пишем SP которая генерит триггеры на таблицы, которые хотелось-бы отслеживать.
Триггеры пишут в нашу табличку маску изменений и всю строку из отслеживаемой таблицы в формате XML.

Клиентская часть.
Пишем клиента на чем удобнее, чтобы при необходимости разобрать весь хлам, хранящийся в нашей табличке-логе.
Т.е. клиент должен обработать маску изменений и вынуть из XML строки нужную информацию.
...
Рейтинг: 0 / 0
Журнализация
    #32017503
olegusan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тут по форуму полазил и нашел чудную (на первый взгляд - еще не проверял) вещь.
Вот линк www.gvu.newmail.ru если не видел посмотри - прикольно!
Описалово прочел - именно то, что мне и нужно. Может и тебе жизнь облегчит.
...
Рейтинг: 0 / 0
Журнализация
    #32017522
RomanSt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
www.gvu.newmail.ru - да там действительно лежит практически готовое решение, но использованые в нем курсоры очень сильно грузят сервер и резко замедляют работу , поэтому , как и предупреждал сам автор , использовать его реально можно лишь в системах, где обновление или удаление данных происходит достаточно редко.
От себя добавлю количественную оценку скорости работы - удаление записи из родителькой таблицы плюс очистка тригерами из двух дочерних таблиц (около 150000 записей в каждой) без журнализации занимает 0.15 - 0.2 сек , с журнализацией - 1.5 - 1.7 , причем загрузка проца под 100%.
Роман
...
Рейтинг: 0 / 0
Журнализация
    #32017540
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2olegusan:
А как Вы планируете сделать "информация будет складываться в поле типа TEXT в формате XML."?
...
Рейтинг: 0 / 0
Журнализация
    #32017606
olegusan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 однако
...
Рейтинг: 0 / 0
Журнализация
    #32017613
Фотография Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У себя на работе я веду журнал для каждой таблицы в отдельности. Собственно это обусловлено высокой транзакционностью базы данных, так что производительность - на первом месте. Тем не менее необходимВкратце суть решения:
Создана база для хранения сессий. Так как в моей системе баз данных несколько, а приложение поочередно может работать то с одной то с другой, то "для справедливости" таблица сессий создана на третьей базе данных. Доступ к ней осуществляется через сохраняемую процедуру 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.
Для уменьшения головной боли с этими однотипными тригерами и таблицами я написал процедуру которая генерит их всех автоматически. А список таблиц для журнализации находится в сессионной базе данных. Так что я туда просто заношу или удаляю название таблицы и запускаю процедуру, а та уже разбирается что надо сделать.

Роман
...
Рейтинг: 0 / 0
Журнализация
    #32017614
Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этоя я запостил. Нечаянно. Извини.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Журнализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]