Лучшее решение для создания истории изменений для нескольких таблиц SQL
Я долго искал и еще не нашел решения здесь. Также этот вопрос немного субъективен. Но мне действительно нужно хорошее решение этой задачи.
У меня есть таблица с томами, безопасностью и гораздо большей информацией. Эти данные ежедневно меняются. Теперь мне нужно сохранить эти изменения в истории.
какое лучшее решение для этого? Создание второй таблицы с той же структурой и просто вставьте "старые" данные в этот стол? Или просто сделать дополнительный параметр со статусом?
создание этой серверной стороны с триггерами? Или программно с помощью процедуры LINQ?
5 ответов
мы выбрали отдельные таблицы, так как это будет держать вашу основную таблицу худой и быстрее. Мы также выбрали триггеры, полагая, что если вы когда-нибудь измените механизм входа, вам не придется переписывать свой аудит. Также он может захватить случайные изменения стороны DBA.
поскольку обновление фактически является удалением, а затем вставкой, вы можете достичь того, что было предложено с помощью одного триггера - это то, что мы сделали.
создать таблицу, точно соответствующую ваша существующая таблица, но с некоторыми добавленными столбцами: AUDIT_GUID VARCHAR (40), AUDIT_TIMESTAMP DATETIME, AUDIT_ACTION VARCHAR (20)
-
создайте триггер "после вставки, удаления, обновления", используя следующий общий шаблон (просто добавьте больше столбцов, где это необходимо).
CREATE TRIGGER CustomerAudit ON Customer AFTER INSERT,DELETE,UPDATE AS BEGIN IF (TRIGGER_NESTLEVEL()>1) RETURN DECLARE @Time DateTime = CURRENT_TIMESTAMP DECLARE @Audit_GUID varchar(100) = NEWID() INSERT INTO Customer_History (FirstName, LastName, Audit_Date, Audit_Action, Audit_GUID) SELECT FirstName, LastName, @Time, 'Delete', @Audit_GUID FROM Deleted INSERT INTO Customer_History (FirstName, LastName, Audit_Date, Audit_Action, Audit_GUID) SELECT FirstName, LastName, @Time, 'Insert', @Audit_GUID FROM Inserted END
Если вы хотите найти обновления, они будут строками в таблице истории, которые имеют delete & update с тем же значением Audit_GUID. Отметка времени также позволяет проверить изменения, внесенные в определенное время, и мы также добавили currentuser, чтобы найти виновного, если это необходимо!
Я бы выбрал ON DELETE
/ON UPDATE
триггер, который хранит удаленные или измененные строки второй таблицы.
вот так
- может поддерживать ссылочную целостность
- может создавать разумные уникальные ключи в таблице "живые данные"
- не нужно помнить, добавив
WHERE IsDeleted = 'N'
(или тому подобное) с каждым запросом, который вы делаете - автоматическое историзация с вашими данными, даже если вы измените его прямо на база данных
это сохраняет удобство использования и производительность с вашими живыми данными. Для исторических данных вам придется перейти к таблицам истории, которые, по моему опыту, могут быть громоздкими, если запросы сложны, и вы хотите смешать живые и исторические данные в один результат. Зависит от вашего варианта использования, если такое использование является вероятным сценарием.
Я думаю, что лучше создать отдельную таблицу для отслеживания истории вместе с необходимыми полями и датой, чтобы вы могли запрашивать эту таблицу по мере необходимости. Для входа можно использовать триггеры.
Я предлагаю создать историческую таблицу (суффикс _HIST) со всеми данными. Вам нужно три триггера для хранения обновлений, удалений и вставок.
Не стройте то, что вы не можете купить с полки. Google для программного обеспечения аудита баз данных, там много.