Лучшее решение для создания истории изменений для нескольких таблиц 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 для программного обеспечения аудита баз данных, там много.