Swi*_*Guy 6 sql database-design sql-server-2008
我已经搜索了很长时间,但还没有找到解决方案.这个问题也有点主观.但我真的需要一个很好的解决方案.
我有一个包含Volumes,Security和更多信息的表.这些数据每天都会更改.现在我需要在历史中保持这种变化.
这样做的最佳解决方案是什么?制作具有相同结构的第二个表,并将"旧"数据插入此表中?或者只是使用状态创建一个附加参数?
使用触发器使这个服务器端?或者以编程方式使用LINQ过程?
我们选择了单独的表格,因为它会让您的主表更精简,更快.我们还选择了触发器,推断如果您更改了输入机制,则不希望重写审计.它还可以捕获意外的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值的删除和更新的行.时间戳还允许您检查在特定时间所做的更改,并且我们还添加了当前用户以在必要时找到要责备的人!
| 归档时间: |
|
| 查看次数: |
3440 次 |
| 最近记录: |