我已经搜索了很长时间,但还没有找到解决方案。这个问题也有点主观。但我真的需要一个很好的解决方案来完成这项任务。
我有一个包含Volumes,Security和更多信息的表。 这些数据每天都会更改。 现在我需要在历史记录中保留此更改。
这样做的最佳解决方案是什么? 制作具有相同结构的第二个表,并将“旧”数据插入此表中? 或者只是使用状态创建一个附加参数?
使用触发器使这个服务器端? 或者以编程方式使用LINQ过程?
答案 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)
不要建造你现在买不到的东西。谷歌的数据库审计软件,有很多。