Лучший дизайн для таблицы изменений/аудита базы данных?[закрыто]

StackOverflow https://stackoverflow.com/questions/201527

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне нужно создать таблицу базы данных для хранения различных журналов/аудита изменений (когда что -то было добавлено, удалено, модифицировано и т. Д.).Мне не нужно хранить особенно подробную информацию, поэтому я подумал что-то вроде:

  • идентификатор (для события)
  • пользователь, который инициировал это
  • название события
  • Описание события
  • временная метка события

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

Это было полезно?

Решение

В проекте, над которым я работаю, журнал аудита также начинался с очень минималистичного дизайна, подобного тому, который вы описали:

event ID
event date/time
event type
user ID
description

Идея была та же:чтобы все было просто.

Однако быстро стало очевидно, что этого минималистичного дизайна недостаточно.Типичный аудит сводился к таким вопросам:

Who the heck created/updated/deleted a record 
with ID=X in the table Foo and when?

Итак, чтобы иметь возможность быстро отвечать на такие вопросы (с помощью SQL), в таблице аудита у нас появилось два дополнительных столбца.

object type (or table name)
object ID

Именно тогда дизайн нашего журнала аудита действительно стабилизировался (уже несколько лет назад).

Конечно, последнее «улучшение» будет работать только для таблиц, имеющих суррогатные ключи.Но знаете что?Все наши таблицы, заслуживающие аудита, имеют такой ключ!

Другие советы

Есть еще несколько вещей, которые вы, возможно, захотите проверить, например имена таблиц/столбцов, компьютер/приложение, с которого было сделано обновление, и многое другое.

Это зависит от того, насколько детальный аудит вам действительно нужен и на каком уровне.

Мы начали создавать собственное решение для аудита на основе триггеров и хотели проверять все, а также иметь под рукой возможность восстановления.Это оказалось слишком сложным, поэтому нам пришлось провести реверс-инжиниринг стороннего инструмента, основанного на триггерах. АпексSQL-аудит создать собственное индивидуальное решение.

Советы:

  • Включить значения до/после

  • Включите 3-4 столбца для хранения первичного ключа (если это составной ключ).

  • Храните данные вне основной базы данных, как уже предлагал Роберт.

  • Потратьте приличное количество времени на подготовку отчетов – особенно тех, которые могут вам понадобиться для восстановления.

  • Запланируйте хранение имени хоста/приложения – это может оказаться очень полезным для отслеживания подозрительных действий.

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

Пока вы занимаетесь проектированием, вам следует написать код для восстановления данных.Когда нужно прийти в себя, то обычно нужно спешить, лучше уже быть готовым.

Здесь и в подобных вопросах много интересных ответов.Единственное, что могу добавить из личного опыта:

  1. Поместите таблицу аудита в другую базу данных.В идеале вам нужно отделить исходные данные.Если вам нужно восстановить базу данных, вам не обязательно восстанавливать контрольный журнал.

  2. Денормализуйте настолько, насколько это возможно.Вы хотите, чтобы таблица имела как можно меньше зависимостей от исходных данных.Таблица аудита должна быть простой и быстрой для получения данных.Никаких сложных объединений или поисков по другим таблицам для получения данных.

Что мы имеем в нашей таблице: -

Primary Key
Event type (e.g. "UPDATED", "APPROVED")
Description ("Frisbar was added to blong")
User Id
User Id of second authoriser
Amount
Date/time
Generic Id
Table Name

Общий идентификатор указывает на строку в обновленной таблице, а имя таблицы — это имя этой таблицы в виде строки.Не очень хороший дизайн БД, но очень удобный.Все наши таблицы имеют один столбец суррогатного ключа, поэтому это работает хорошо.

Есть много способов сделать это.Мой любимый способ:

  1. Добавить mod_user поле в исходную таблицу (ту, которую вы хотите зарегистрировать).

  2. Создайте таблицу журнала, содержащую поля, которые вы хотите регистрировать, а также log_datetime и seq_num поле. seq_num является первичным ключом.

  3. Создайте триггер в исходной таблице, который вставляет текущую запись в таблицу журнала при каждом изменении любого отслеживаемого поля.

Теперь у вас есть запись обо всех изменениях и о том, кто их внес.

В целом выборочный аудит (создание различных таблиц) — плохой вариант.Триггеры базы данных/таблицы можно отключить, чтобы пропустить некоторые действия журнала.Пользовательские таблицы аудита могут быть подделаны.Могут иметь место исключения, которые приведут к прекращению работы приложения.Не говоря уже о трудностях с разработкой надежного решения.Пока что я вижу в этой дискуссии очень простые случаи.Вам необходимо полное отделение от текущей базы данных и от любых привилегированных пользователей (администраторов баз данных, разработчиков).Каждая основная СУБД предоставляет средства аудита, которые даже администратор базы данных не может отключить и нарушить секретность.Поэтому предоставление возможности аудита поставщиком СУБД должно быть первым вариантом.Другим вариантом может быть стороннее средство чтения журнала транзакций или собственное средство чтения журнала, которое передает разложенную информацию в систему обмена сообщениями, которая в конечном итоге попадает в некоторые формы хранилища данных аудита или обработчика событий в реальном времени.В итоге:Архитектор решений/Архитектор практических данных должен участвовать в разработке такой системы на основе требований.Обычно это слишком серьезная вещь, чтобы просто передать ее на решение разработчикам.

По принципу разделения:

  1. Таблицы данных аудита должны быть отделены от основной базы данных.Поскольку базы данных аудита могут содержать много исторических данных, с точки зрения использования памяти имеет смысл хранить их отдельно.

  2. Не используйте триггеры для аудита всей базы данных, потому что в конечном итоге вам придется поддерживать беспорядок из разных баз данных.Вам придется написать его для DB2, SQLServer, Mysql и т. д.

Опоздал на вечеринку, но я очень рекомендую Автоаудит проекта.
Это 100% бесплатно и с открытым исходным кодом.Его авторы — специалисты по SQL MVP Пол Нильсен и Джон Сигуин.Он очень стабилен и в настоящее время имеет версию 3.30.

Простота установки.Просто запустите SP, который они предоставляют.Он создаст схему аудита, некоторые SP обслуживания и триггеры, необходимые для проведения аудита.Далее просто выберите, какие таблицы вы хотите проверить и с какой детализацией.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top