Лучшее решение для создания истории изменений для нескольких таблиц SQL - PullRequest
6 голосов
/ 13 мая 2011

Я долго искал и пока не нашел решения.Также этот вопрос немного субъективен.Но мне действительно нужно хорошее решение для этой задачи.

У меня есть таблица с томами, безопасностью и многими другими данными.Эти данные ежедневно меняются.Теперь мне нужно сохранить эти изменения в истории .

Какое лучшее решение для этого?Создание второй таблицы с той же структурой и просто вставить "старые" данные в эту таблицу?Или просто сделать дополнительный параметр с Status?

Создание на стороне сервера триггеров?Или программно с помощью процедуры LINQ?

Ответы [ 5 ]

5 голосов
/ 13 мая 2011

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

Поскольку обновление - это, по сути, удаление, а затем вставка, вы можете достичь того, что было предложено с помощью одного триггера - это то, что мы сделали.

  • Создайте таблицу, точно соответствующую вашей существующей таблице, но с некоторыми добавленными столбцами: 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
    

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

2 голосов
/ 13 мая 2011

Я бы выбрал триггер ON DELETE / ON UPDATE, который сохраняет удаленные или измененные строки во второй таблице.

Таким образом, вы

  • может поддерживать ссылочную целостность
  • может создавать разумные уникальные ключи в вашей таблице "живых данных"
  • не нужно помнить добавление WHERE IsDeleted = 'N' (или подобное) к каждому вашему запросу
  • имеет автоматическую историзацию ваших данных, даже если вы изменяете их непосредственно в базе данных

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

1 голос
/ 13 мая 2011

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

0 голосов
/ 13 мая 2011

Не собирай то, что не можешь купить с полки. Google для программного обеспечения для аудита баз данных, есть много.

0 голосов
/ 13 мая 2011

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

...