代码之家  ›  专栏  ›  技术社区  ›  John Sonmez

跟踪列上的更改

  •  1
  • John Sonmez  · 技术社区  · 15 年前

    我最近遇到一个非常有趣的问题,涉及数据库设计。 我已经更改了表名以简化问题,所以让我这样描述它: 我有两张桌子,每个商店都有水果和蔬菜,不管水果和蔬菜是否好吃。

    现在让我们假设有人一直在通过我的应用程序的ui更改istasty设置,而管理层要求能够看到某人上次更改它的时间和更改者。这里棘手的部分是,虽然我们忽略了表中的其他数据,但还有其他数据,我们不想跟踪表中的任何数据何时被更改,只想跟踪这一列。

    解决这个问题的最好办法是什么?

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

    6 回复  |  直到 15 年前
        1
  •  1
  •   MattMcKnight    15 年前

    我喜欢acts_as_versioned插件在rails中的工作方式。它最接近解决方案2,并带有一个额外的版本号字段。你基本上有你的水果桌和水果版桌。每次更新水果中的行时,都会在水果版本表中插入相同的数据,版本号会递增。

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

    与保留版本相反,另一种方法是跟踪更改,就像subversion或版本控制系统那样。如果您经常需要知道某个东西是否从a更改为b,而不是它更改为什么,那么这样做会更容易。我想这意味着真正的答案是“这取决于”如何使用数据。

        2
  •  0
  •   Randy Minder    15 年前

    如果您使用的是sql server 2008,那么您有没有看一下cdc(change data capture)?

        3
  •  0
  •   Charles Bretana    15 年前

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

        4
  •  0
  •   Jrud    15 年前

    使用SQL Server 2005和更高版本,您可以使用如下if语句创建触发器:

    IF UPDATE(IsTasty)
    BEGIN
            Insert INTO Log (ID, NewValue) VALUES (@ID, @NewValue)
    END
    
        5
  •  0
  •   jvilalta    15 年前

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

        6
  •  0
  •   Cade Roux    15 年前

    对于SQL Server,我使用 AutoAudit 生成触发器。audit表包含历史记录,视图可用于显示更改(autoaudit自动生成已删除行的视图)。