【问题标题】:Tracking a Change on a Column跟踪列的更改
【发布时间】:2010-12-24 21:52:25
【问题描述】:

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

现在假设有人通过我的应用程序的 UI 不断更改 IsTasty 设置,管理层要求能够查看上次更改的时间和人员。这里棘手的部分是虽然我们忽略了表上的其他数据,但还有其他数据,我们不想跟踪表上的任何数据何时更改,只跟踪这一列。

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

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

【问题讨论】:

  • 最近我发布了我的系统作为开源跟踪更改,你可能想看看它是否可以帮助你 tomcdc.codeplex.com

标签: database database-design entity-relationship audit


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我实际上在这个项目上使用了 Oracle。但我会研究 CDC,因为我很想在未来解决这个问题。
    【解决方案3】:

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

    【讨论】:

    • 没错,问题是我们需要能够稍后查询该数据才能显示在 UI 页面上。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-06
          • 1970-01-01
          • 2012-01-02
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多