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

时间:2011-05-13 08:49:49

标签: sql sql-server-2008 database-design

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

我有一个包含Volumes,Security和更多信息的表。 这些数据每天都会更改。 现在我需要在历史记录中保留此更改

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

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

5 个答案:

答案 0 :(得分: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
    

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

答案 1 :(得分:2)

我会选择将{@ 1}} / ON DELETE触发器存储到第二个表中。

这样你

  • 可以保持参照完整性
  • 可以在“实时数据”表中构建合理的唯一键
  • 不必记住在您制作的每个查询中添加ON UPDATE(或类似内容)
  • 即使您直接在数据库中修改数据,也可以对数据进行自动历史记录

这可以保持实时数据的可用性和性能。对于历史数据,您必须转到历史记录表,如果查询很复杂并且您希望将实时和历史数据混合到一个结果中,根据我的经验可能会很麻烦。如果这种用法很可能,则取决于您的用例。

答案 2 :(得分:1)

我认为最好创建一个单独的表来跟踪历史记录以及必填字段和日期,以便您可以在需要时查询此表。您可以使用触发器进行记录。

答案 3 :(得分:0)

我建议用所有数据创建一个历史表(后缀_HIST)。您需要三个触发器来存储UPDATES,DELETIONS和INSERTIONS。

答案 4 :(得分:0)

不要建造你现在买不到的东西。谷歌的数据库审计软件,有很多。