Триггеры аудита:Использование ВСТАВЛЕННЫХ или УДАЛЕННЫХ системных таблиц
-
16-09-2019 - |
Вопрос
Тема о том, как проводить аудит таблиц, недавно всплыла в наших обсуждениях...поэтому мне интересно ваше мнение о том, как лучше всего подойти к этому.У нас есть сочетание обоих подходов (что не очень хорошо) в нашей базе данных, поскольку каждый предыдущий администратор базы данных делал то, что он / она считал правильным.Поэтому нам нужно изменить их, чтобы они соответствовали какой-либо одной модели.
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 в определенное время.
Если у вас есть отдельные строки в таблице аудита, вам придется соединить одну строку со "следующей", чтобы вычислить разницу, что в некоторых случаях может быть непросто...