mysql, как создать таблицу и автоматически отслеживать пользователей, которые добавляют или удаляют строки / таблицы

0

Мне нужна какая-то история контроля версий для моей базы данных sql.

Я бы хотел, чтобы эта таблица продолжала обновляться с записью о том, кто, удалил что и т.д., когда.

Я подключаюсь к MySQL с помощью Perl.

Теги:

2 ответа

7
Лучший ответ

Подход 1: Создайте отдельную таблицу аудита и используйте triggers для заполнения информации.

Вот краткое руководство для MySQL (и Postrges): http://www.go4expert.com/forums/showthread.php?t=7252

Подход 2: заполнение информации аудита из вашего кода доступа к базе данных Perl. В идеале, в рамках одной и той же транзакции. Там нет существенной победы над первым подходом и многими минусами (вы не заметили изменений, внесенных в OUTSIDE вашего кода, для одного)

  • 0
    Одним из недостатков использования триггеров в методе приложения является человеческая ошибка. Если вы создаете новую таблицу и забываете создать соответствующие триггеры, вы теряете отслеживание аудита. Уровень приложения по умолчанию отслеживает все (выполняется через приложение) с возможностью его отключения в определенных случаях. Ваше замечание о том, что вы ничего не делаете за пределами приложения, действительно для +1
  • 1
    @DTest - Yikes! Это действительное техническое соображение. НО ... если кто-то столкнется с этой проблемой, он получит ОЧЕНЬ большие проблемы, чем потеря аудита на одном столе. Это означает, что у них нет хорошего контроля над DDL (включая управление изменениями и обзоры)! Потому что правильный контроль может легко включать в себя маркер «Создана ли у вас инфраструктура аудита для новой таблицы» - в идеале это обеспечивается скриптом проверки метаданных.
1

** Отказ от ответственности: Я столкнулся с такой ситуацией в прошлом, но на PHP. Понятия для PHP, но могут быть применены к perl с некоторой мыслью.

Я играл с идеей добавления триггеров в каждую таблицу AFTER INSERT, AFTER UPDATE, AFTER DELETE совершить то же самое. Проблема с этим была:

  • триггер не знал пользователя "admin", просто пользователь db (CURRENT_USER)
  • Самая большая проблема заключалась в том, что добавлять триггеры ко всем моим таблицам не представляется возможным (я полагаю, я мог бы написать script для добавления триггеров).
  • Поддержание работоспособности триггеров. Если вы измените способ отслеживания, вам придется обновить все триггеры. Я предполагаю, что вызов триггера хранимой процедурой в основном исправит эту проблему.

В любом случае, по моей ситуации, я нашел, что лучший способ действий был на уровне приложения (а не на уровне БД):

  • создайте слой абстракции DB, если вы еще этого не сделали (класс, который обрабатывает все взаимодействие с базой данных).
  • создать функцию для каждого действия (вставить, обновить, удалить).
  • в каждой из этих функций после успешного вызова запроса добавьте еще один запрос, который вставляет соответствующую информацию в таблицу отслеживания.

Если все сделано правильно, любые действия, которые вы выполняете для обновления любой таблицы, будут отслеживаться. Мне пришлось добавить некоторые переопределения для определенных таблиц, чтобы не отслеживать (например, точка отслеживания вставок в таблице "track_table" ). Вот пример схемы отслеживания таблицы:

CREATE TABLE `track_table` (
  `id` int(16) unsigned NOT NULL,
  `userID` smallint(16) unsigned NOT NULL,
  `tableName` varchar(255) NOT NULL DEFAULT '',
  `tupleID` int(16) unsigned NOT NULL,
  `date_insert` datetime NOT NULL,
  `action` char(12) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `userID` (`userID`),
  KEY `tableID` (`tableName`,`tupleID`,`date_insert`)
) ENGINE=InnoDB 
  • 0
    @DTest - почему вы не можете получить пользователя для триггера через USER вместо CURRENT_USER ? dev.mysql.com/doc/refman/5.1/en/account-activity-auditing.html
  • 0
    @DVK все еще зависит от подключенного пользователя. В моем приложении (что может быть не так для OP) я использую одно соединение, поэтому регистрация пользователя mysql ничего не говорит мне.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню