【问题标题】:Should I include primary key for Audit Table in SQL?我应该在 SQL 中包含审计表的主键吗?
【发布时间】:2010-10-18 00:17:26
【问题描述】:

我正在创建一个审计表,用于跟踪对主表中记录所做的更改。

这里的审计表是主表(比如员工表)的完全相同的副本,但对于主表中发生的每次更改,只会有“插入”。所以它会有重复(相同的 EmployeeID),所以我应该为每个条目添加单独的 Audit_ID 吗?

【问题讨论】:

    标签: sql audit


    【解决方案1】:

    确定您需要表中的某种主键。

    如果有的话,删除重复项和跟踪“插入原因”(用于调试目的)会更容易。

    一些RDBMS(如MySQLInnoDB)实际上会为您创建一个隐藏的主键,如果您没有明确执行此操作,那么您只需自己执行并使其可见且可用。

    p>

    【讨论】:

      【解决方案2】:

      您几乎必须这样做,因为 Employee 中的 EmployeeID 将是唯一的(更新不会添加新行,只需修改现有行),审计表将有多个行相同的 EmployeeId(一个用于该员工的初始插入,一个用于后续更新)。

      此外,Employee 中的实体是员工。但是审计中的实体是审计记录。他们应该有自己的身份证。

      如果出现问题并且您需要实际更新或删除审计记录,您将需要此功能。实际上,如果插入员工,则更新一列的值,然后再次更新为原始值,您现在在审计中有两条相同的记录。哪个必须一起删除或更新(除非您在更新或删除中使用了限制子句。)混乱。

      这也指出了向审计表添加时间戳的用处。但是不要认为您应该使用它和employeeid 作为复合键。首先,复合键很烂。其次,时间戳的粒度完全有可能小于系统执行两次更新(同一员工的两次更新,例如批处理操作)所花费的时间。 (Sybase 日期时间的粒度为 3 毫秒;Intel Core 2 Extreme 在这段时间内可以执行近 200 百万条指令。)

      【讨论】:

      • 这是一个很好的答案,虽然我不认为说“复合键很烂”特别有用。很多人会不同意你的观点,他们有自己的用途。例如,在多对多关系中。
      【解决方案3】:

      是的。我相信每个表中的非语义主键是最佳实践,因为它允许您以实用的方式引用它。您可以比使用日期更容易地可视化“从audit-idaudit-id+1 的变化”。

      【讨论】:

        【解决方案4】:

        您可以使用员工 ID 和审核日期时间作为复合键...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-22
          • 1970-01-01
          • 2011-01-31
          • 2010-11-21
          • 2018-07-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-11
          相关资源
          最近更新 更多