Триггеры аудита: используйте системные таблицы INSERTED или DELETED

92
10

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


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). Таким образом, для каждого UPDATE и DELETE в основной таблице замещаемая запись вводится в таблицу аудита с столбцом "Audit_Type" как "w" (для UPDATE) или "D" (для DELETE)


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


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


Appraoch 2: Храните в таблице аудита каждую запись, которая входит в основную таблицу (с использованием системной таблицы INSERTED).


Каждая запись, которая INSERTED/UPDATED/DELETED в основной таблице также сохраняется в таблице аудита. Поэтому, когда вы вставляете новую запись, она также добавляется в таблицу аудита. При обновлении таблица новой версии (из INSERTED) сохраняется в таблице аудита. При удалении таблица старой версии (из DELETED) сохраняется в таблице аудита.


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


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

спросил(а) 2021-01-19T15:49:02+03:00 9 месяцев, 1 неделя назад
1
Решение
103

Я бы пошел с:


Appraoch 2: Храните в таблице аудита каждую запись, которая входит в основную таблицу (используя системную таблицу INSERTED).



- еще одна строка за элемент, который действительно собирается убить БД? Таким образом, у вас есть полная история вместе.

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


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

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

ответил(а) 2021-01-19T15:49:02+03:00 9 месяцев, 1 неделя назад
46

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


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


В триггере INSERT "name_old" устанавливается в пустую/нулевую в зависимости от ваших предпочтений, а "name_new" устанавливается из INSERTED.
В триггере UPDATE значение "name_old" устанавливается из DELETED и "name_new" из INSERTED
В триггере DELETE значение "name_old" устанавливается из DELETED и "new_name" в пустые/нулевые.


(или вы используете FULL join и один триггер для всех случаев)


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

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


quantity_old  quantity_new
5 7

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


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

ответил(а) 2021-01-19T15:49:02+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема