为多个SQL表创建更改历史记录的最佳解决方案

Swi*_*Guy 6 sql database-design sql-server-2008

我已经搜索了很长时间,但还没有找到解决方案.这个问题也有点主观.但我真的需要一个很好的解决方案.

我有一个包含Volumes,Security和更多信息的表.这些数据每天都会更改.现在我需要在历史中保持这种变化.

这样做的最佳解决方案是什么?制作具有相同结构的第二个表,并将"旧"数据插入此表中?或者只是使用状态创建一个附加参数?

使用触发器使这个服务器端?或者以编程方式使用LINQ过程?

Run*_*pot 5

我们选择了单独的表格,因为它会让您的主表更精简,更快.我们还选择了触发器,推断如果您更改了输入机制,则不希望重写审计.它还可以捕获意外的DBA端变化.

由于更新实际上是删除然后是插入,因此您可以实现单个触发器的建议 - 这就是我们所做的.

  • 创建一个与现有表完全匹配的表,但添加了一些列:AUDIT_GUID VARCHAR(40),AUDIT_TIMESTAMP DATETIME,AUDIT_ACTION VARCHAR(20)

  • 使用以下常规模式创建"AFTER INSERT,DELETE,UPDATE"触发器(只需在必要时添加更多列).

    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
    
    Run Code Online (Sandbox Code Playgroud)

如果要查找更新,它们将是历史记录表中具有相同Audit_GUID值的删除和更新的行.时间戳还允许您检查在特定时间所做的更改,并且我们还添加了当前用户以在必要时找到要责备的人!