代码之家  ›  专栏  ›  技术社区  ›  Mike Florian Doyen

在SQL中跟踪表何时更新的最佳方法是什么?

  •  2
  • Mike Florian Doyen  · 技术社区  · 14 年前

    在过去,我只是在每个表中添加了一个字段,并在每次更新/插入时用getDate()更新它。现在的问题是我也必须跟踪删除。我正考虑创建一个表,当任何内容发生变化时,我都会更新它,并向所有其他表添加触发器。思想????谢谢!

    7 回复  |  直到 12 年前
        1
  •  4
  •   aaaa bbbb    14 年前

    如果有一个历史记录表(一个与原始表具有相同列的表,再加上一个自动递增ID列),则可以跟踪有关原始表更改的所有信息。您可以跟踪插入、删除和每次更改。使用插入、更新和删除触发器将行放入历史记录表。如果你不需要所有这些选择,那么就使用那些你确实需要的。

    如果选择在原始表中使用isDeleted标志,则会使每个查询复杂化,并使活动表中保留大量不需要的行。但这是可行的,取决于你的需要。

        2
  •  1
  •   JonH    14 年前

    我曾经看到过设计有位字段的表被删除,当然默认值被设置为假。删除项目时,此值设置为true。然后,所有查询都需要影响到这一点:

    SELECT blah FROM myTable WHERE IsDeleted=0
    

    这样,如果您“意外”删除了一行,则应该能够将其恢复。您还可以清除记录,例如每周/每月/每年。

    这对你来说只是个主意。

        3
  •  1
  •   D'Arcy Rittich    14 年前

    如果您使用的是SQL Server 2008,则可以利用 new auditing features .

        4
  •  0
  •   Pentium10    14 年前

    将记录标记为“已删除”=1,不要删除它。在删除时执行触发器,而不是更新…

        5
  •  0
  •   Jay    14 年前

    我还看到一个重复的表,在名称中添加了一个标准化的前缀。所有删除的行都将移动到重复表中。这样可以消除保留原始表中的行但忽略这些行的开销。

        6
  •  0
  •   Chris    14 年前

    所有操作(插入-更新-删除)都应记录在日志表中。我总是记录操作、时间戳和触发操作的用户。向原始表中添加isDelete列是不好的做法。

        7
  •  0
  •   Stephan    12 年前

    如果您使用的是SQL 2008,那么可以使用CDC(变更数据捕获)进行跟踪。

    下面的链接提供了完整的详细信息。如果为特定表启用CDC,则将自动收集删除数据。

    http://www.simple-talk.com/sql/learn-sql-server/introduction-to-change-data-capture-%28cdc%29-in-sql-server-2008/