跟踪列的更改

时间:2009-12-09 16:36:47

标签: database database-design entity-relationship audit

我最近碰到了一个涉及数据库设计的非常有趣的问题。 我已经更改了表名以简化问题,所以让我这样描述: 我有两张桌子,水果和蔬菜,无论水果或蔬菜是否美味,都可以存放。

现在让我们说有人通过我的应用程序的UI不断更改IsTasty设置,并且管理层要求能够查看最后有人更改它以及谁。这里棘手的部分是虽然我们忽略了表中的其他数据,但还有其他数据,我们不希望跟踪表上的任何数据何时被更改,只有这一列。

解决此问题的最佳方法是什么?

I have a description of the problem with ER diagrams here:

6 个答案:

答案 0 :(得分:1)

我喜欢acts_as_versioned插件在Rails中执行它的方式。它与您的解决方案2最接近,附加版本号字段。你基本上有你的水果桌和fruits_versions表。每次更新水果中的一行时,都会在fruits_versions表中插入相同的数据,并增加版本号。

如果您想要向表中添加更多字段或跟踪其他值,我认为它比解决方案3方法更具可扩展性。解决方案4是一种非关系型解决方案,您可以像这样保存审计日志。

与保留版本相反,另一种方法是跟踪变化,例如subversion或版本控制系统。如果您经常需要知道某些内容是否从a更改为b,而不是更改为更改内容,则可以更轻松。我想这意味着真正的答案是“它取决于”数据的使用方式。

答案 1 :(得分:0)

如果您使用的是SQL Server 2008,您是否看过CDC(更改数据捕获)?

答案 2 :(得分:0)

触发器 中,有一种方法可以查看修改了哪些列。

答案 3 :(得分:0)

使用SQL Server 2005及更高版本,您可以使用if语句创建一个触发器:

IF UPDATE(IsTasty)
BEGIN
        Insert INTO Log (ID, NewValue) VALUES (@ID, @NewValue)
END

答案 4 :(得分:0)

执行此操作的一种方法是向这些表添加触发器。在触发器中检查您感兴趣的列是否已更改。如果已更改,请在另一个跟踪更改的表中插入一行。更改跟踪表可能希望存储数据,例如已更改的列的名称,先前的值,新值和更改日期。

答案 5 :(得分:0)

Fo SQL Server,我使用AutoAudit来生成触发器。审计表包含可用于显示更改的历史记录和视图(AutoAudit会自动为已删除的行创建视图)。