Триггеры аудита:Использование ВСТАВЛЕННЫХ или УДАЛЕННЫХ системных таблиц

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

Вопрос

Тема о том, как проводить аудит таблиц, недавно всплыла в наших обсуждениях...поэтому мне интересно ваше мнение о том, как лучше всего подойти к этому.У нас есть сочетание обоих подходов (что не очень хорошо) в нашей базе данных, поскольку каждый предыдущий администратор базы данных делал то, что он / она считал правильным.Поэтому нам нужно изменить их, чтобы они соответствовали какой-либо одной модели.

CREATE TABLE dbo.Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
)

CREATE TABLE dbo.Audit_Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
Audit_Type VARCHAR(1)  NOT NULL
Audited_Created_On DATETIME
Audit_Created_By VARCHAR(50)
)

Подход 1: Храните в таблицах аудита только те записи, которые заменены / удалены из основной таблицы (используя системную таблицу DELETED).Таким образом, для каждого ОБНОВЛЕНИЯ и УДАЛЕНИЯ в основной таблице заменяемая запись вставляется в таблицу аудита со столбцом 'Audit_Type' в виде буквы 'U' (для ОБНОВЛЕНИЯ) или 'D' (для УДАЛЕНИЯ)

Вставки не проверяются.Для получения текущей версии любой записи вы всегда запрашиваете основную таблицу.А для получения истории вы запрашиваете таблицу аудита.

Плюсы:Кажется разумным хранить предыдущие версии записей Минусы:Если вам нужно знать историю конкретной записи, вам необходимо объединить таблицу аудита с основной таблицей.

Оценка 2: Храните в таблице аудита каждую запись, которая попадает в основную таблицу (используя ВСТАВЛЕННУЮ системную таблицу).

Каждая запись, которая ВСТАВЛЯЕТСЯ / ОБНОВЛЯЕТСЯ / УДАЛЯЕТСЯ в основную таблицу, также сохраняется в таблице аудита.Таким образом, когда вы вставляете новую запись, она также вставляется в таблицу аудита.При обновлении новая версия (из ВСТАВЛЕННОЙ) таблицы сохраняется в таблице аудита.При удалении старая версия (из УДАЛЕННОЙ) таблицы сохраняется в таблице аудита.

Плюсы:Если вам нужно знать историю конкретной записи, у вас есть все в одном месте.

Хотя я не перечислил здесь их все, у каждого подхода есть свои плюсы и минусы?

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

Решение

Я бы пошел с :

Оценка 2: Сохраните в таблице аудита каждую запись, которая входит в основную таблицу (используя ВСТАВЛЕННУЮ системную таблицу).

действительно ли еще одна строка на элемент приведет к уничтожению базы данных?Таким образом, у вас будет полная история вместе взятая.

Если вы удалите строки (весь диапазон старше X дня), вы все равно сможете определить, изменилось что-то или нет:

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

если вы выберете Appraoch 1:и удалите диапазон, будет сложно (нужно запомнить дату очистки) указать новые вставки по сравнениюте, где все строки были удалены.

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

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

Таким образом, если у вас есть столбец "name", в таблице аудита будут "name_old" и "name_new".

В триггере ВСТАВКИ "name_old" имеет значение blank / null в зависимости от ваших предпочтений, а "name_new" устанавливается из INSERTED.В триггере ОБНОВЛЕНИЯ значение "name_old" задается как УДАЛЕННОЕ, а "name_new" - как ВСТАВЛЕННОЕ В триггере УДАЛЕНИЯ значение "name_old" задается как УДАЛЕННОЕ, а "new_name" - как пустое / null.

(или вы используете ПОЛНОЕ объединение и один триггер для всех случаев)

Для полей VARCHAR это может показаться не такой уж хорошей идеей, но для INTEGER, DATETIME и т.д. Это дает то преимущество, что очень легко увидеть разницу в обновлении.

Тоесть.если у вас есть поле количества в вашей реальной таблице и вы обновляете его с 5 до 7, у вас будет таблица аудита:

quantity_old  quantity_new
           5             7

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

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

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