| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() |
Логирование в базах данных Interbase (Firebird) Введение Программистам баз данных часто приходится
сталкиваться с необходимостью сохранения информации о работе
пользователей или программы, т.е. логировать информацию.
Данную задачу можно реализовать большим количеством способов.
Каждый способ имеет свои преимущества и недостатки. Данная
статья рассматривает какие есть способы логирования
информации. Так же написано, как реализовать логирование
информации в базах данных Firebird (Interbase). Лог в текстовом
файле Наиболее часто встречающийся
способ сохранения информации о работе программы. Это самый
простой из всех способов, так как информация сохраняется в
текстовом файле и нет необходимости подключаться к базе
данных.
Применение данного способа
логирования информации целесообразен для не больших утилит,
которые не работают с базой данных. Логирование информации
в базе данных Firebird (Intebase)
В базах данных логирование
можно реализовать несколькими способами. Иногда, способы
логирования программисты выбирают в зависимости от своей
квалификации.
Логирование в базе
данных из программы
Создание лога в данном случае
реализуется прямо из программы. Этот способ прост в
реализации, в информации о логах можно записать практически
любую информацию. Недостатки данного способа: - Нужно не забывать вставлять информацию в лог при любой операции. - Если вставка записи в лог
производится не в одной транзакции со вставкой информации, то
может возникнуть ситуация, когда вставка информации
произойдет, а в логе информация не отразится (и наоборот).
Опишем приблизительный
реализации этого способа логирования информации. Создадим таблицу:
ID – первичное поле лога информации. DATE_LOG – время и дата лога. TEXT_LOG – текст лога информации. USERNAME – имя пользователя. CODE_OPER – код
операции.
Создадим ключ: ALTER TABLE
EVENTS ADD CONSTRAINT PKEVENTS PRIMARY KEY (ID); Теперь для вставки информации
в лог пишем обычный запрос вставки информации и вызываем его в
программе в тех местах, когда производятся операции вставки,
удаления или изменения информации.
Логирование в базе
данных
Для того, чтобы не писать при
каждой операции в программе вставку информации в лог, можно
поступить другим способом – написать ряд триггеров. Для
вставки информации - триггер на вставку информации, для
обновления информации – триггер на обновление информации, а
для удаления – триггер на удаление. Так как, триггера при
вставке, удалении и обновлении информации срабатывают
автоматически, то нет необходимости дополнительного
программирования в самой программе. Таким образом, один раз
прописав триггера для таблицы программист больше не заботится
о программировании вставки в лог. Напишем приблизительный для
данной реализации лога.
Следует отметить, что
подобные триггера создаются для всех таблиц, в которых
необходимо учитывать логи. Данный способ логирования
хорош, но он только учитывает какие операции производятся без
возможности просмотреть что конкретно добавилось, изменилось
или удалилось. Следующий способ не только
фиксирует все изменения, но и фиксирует саму
информацию.
Логирование в базе
данных с сохранением информации
Данный способ логирования
более сложный, чем описанный выше. Так, как кроме сохранения
информации о том, что произошла какая-то операция, он
сохраняет еще и саму информацию. Так же этот способ потребует
больший объем информации, чем в описанном выше. Сложности, с которыми мы
сталкиваемся при разработке программной реализации: - Типы данных в полях бывают
разные. Т.е. не только числовые, строковые и дата, но и
блоб. - Кроме учета вставки,
удаления или изменения информации необходимо учитывать так же
изменения каждого поля по отдельности. Нет необходимости
показывать ту информацию, которая не изменилась. Воспользуемся программой
IBExpert для генерации логов. Разработаем модель,
соответствующую структуре логов в IBExpert:
![]() Как видите, модель состоит их
4-х таблиц: IBE$Log_Tables – таблица
операций. В данной таблице отмечается в какой таблице
произошла операция, какая именно операция, во сколько, а так
же какой пользователь. IBE$Log_Fields – отражает изменения информации в полях. IBE$Log_Keys – отражает информацию в ключевом поле. IBE$Log_Blob_Fields –
отражает изменения в блоб-полях. Сгенерируем скрипт для
создания данной структуры:
Это мы написали всего лишь
структуру для хранения информации логирования в базе
данных. Теперь, нам необходимо
написать реакцию на изменения информации. Для этого, поступаем
как в способе описанном ранее – создаем ряд
триггеров. Предположим, есть у нас
таблица такой структуры:
Создадим для данной таблицы
триггера вставки информации в лог.
Как видите, получились
достаточно громоздкие триггера. Это произошли потому, что мы
учитываем не только изменения целой записи, но и каждого поля
по отдельности. Можно данный скрипты пытаться
вводить вручную, но это займет очень много времени. Для того, чтобы облегчить Ваш
труд есть прекрасная программа под названием IBExpert (к тому
же бесплатная для ex-USSR). Загрузить данную программу Вы
можете по адресу: Для генерации логов в
IBExpert предназначена команда Инструменты -> Менеджер
протоколов данных. ![]() Вам остается только выбрать
операции, где будят учитываться изменения, и нажать Compile
(F9). Вы можете просмотреть
лог-информацию для заданной таблицы. Для этого щелкаете на
таблице и выбираете протокол. ![]()
Резюме Каждый способ логирования
имеет свои преимущества и недостатки. Поэтому, применение
может найти каждая из реализаций. Текстовые
логи целесообразно применять когда программа не
работает с базой данных, и должна быть не больших размеров.
Логии из
программы – целесообразно применять, когда нужно
вставлять в логи часто изменяемую текстовую информацию, не
связанную на прямую с текстом в полях. Логирование в
базе данных – прекрасный способ логирования.
Целесообразен тогда, когда необходимо достигнуть наибольшей
стаблильности работы логов, но при этом нужно, чтобы не сильно
увеличивался размер базы данных. Логирование в
базе данных с сохранением информации –
целесообразен тогда, когда необходимо сохранить всю
информацию, над которой производились операции. Надо
учитывать, что при данной реализации логирования информации
база данных будет сильно расти. Это связано с тем, что
сохраняется вся информация, которая вносится в записи, причем
столько раз, сколько производилось операций над ними. Если вы
за ранее знаете, что некоторые поля в таблице могут достигать
очень больших размеров, то лучше не используйте над данной
таблицей этот способ логирования. |
|
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
|