代码之家  ›  专栏  ›  技术社区  ›  Dennis C

是否有用于撤消/重做数据库行更改的库/框架?

  •  2
  • Dennis C  · 技术社区  · 17 年前

    我想跟踪更改日志。 我想提取并反向运行差异。(像“svn合并-r 101:100”一样撤消)。 我可能需要对历史进行索引搜索。

    我已经读过了“ Design Pattern for Undo Engine

    7 回复  |  直到 9 年前
        1
  •  3
  •   JWD    17 年前

    您可以对要跟踪的每个记录使用修订方法。这将涉及为记录的每次修订保留表中的一行。这些记录将通过共享的“ID”绑定在一起,并可在“修订状态”上查询(例如,获取最新的“批准”记录)。

    在应用层中,只要记录了所有必要的信息,就可以单独处理这些记录,并在需要时回滚到早期状态。

    [ID] [Revision Date] [Revision Status] [Modified By] [Balance]
    1     1-1-2008         Expired           User1         $100
    1     1-2-2008         Expired           User2         $200
    2     1-2-2008         Approved          User3         $300
    1     1-3-2008         Approved          User1         $250
    
        2
  •  3
  •   Rn222    15 年前

    Patterns for things that change with time . 仍然是模式,而不是实际的框架,但他展示了示例数据以及如何使用它。

        3
  •  1
  •   James Anderson    17 年前

    帐户中的任何错误条目都应保留在那里以备记录。将对该账户应用相等和相反的更正交易。实际上,回滚原始事务,但留下非常明显的原始错误及其更正痕迹。

        4
  •  1
  •   Nick Holt    17 年前

    我将采用双时态数据库设计,它将为您提供执行和回滚所需的所有数据,无论这意味着插入更多行还是简单地删除以后的修改。

    这样的数据库设计有相当多的微妙之处,但有很多关于这个主题的好书:

    可在此处下载:

    http://www.cs.arizona.edu/people/rts/tdbbook.pdf

    使用数据库事务将是一个坏主意,因为它将在数据库中创建锁-基本上数据库事务应该尽可能短。

        5
  •  0
  •   HLGEM    17 年前

    根据您对James Anderson的评论,我会让用户界面在取消交易时编写一个新的插入。它将向表中插入一条新记录,该记录的值与被取消的事务的值相同,只是该值将是负数而不是正数。如果你有一个结构,其中包含了一些定义交易目的的东西,我会让它说是取消的,以及它正在取消的交易的记录号。

        6
  •  0
  •   James Anderson    17 年前

    根据各种意见,您的问题可能的解决方案是制作一个“日期有效”表。

    有效起始日期为今天、有效截止日期为“2999-12-31”的新行复制旧行中的所有列(如果未更改)。

    可以使用创建视图

    这将允许所有当前查询保持不变。

    这是数据仓库环境中的一种非常常见的技术,对于生效日期很重要的汇率之类的东西来说也是如此。

    撤销逻辑应该是显而易见的。

        7
  •  0
  •   Keith    17 年前

    虽然我在使用触发器和行版本之前设置了完整的撤消/审核历史记录,但我不知道有什么特定的模式。

    我在MS SQL 2000中使用了一个名为Log Navigator的工具,该工具可以让我撤销一个特定的历史事务,但现在找不到它。

    http://www.lumigent.com 和 http://www.apexsql.com 您可以使用查看日志的工具,但我认为这两种工具都不能让您回滚日志。