我应该在SQL中包含Audit Table的主键吗?

时间:2009-04-07 09:35:21

标签: sql audit

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

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

4 个答案:

答案 0 :(得分:3)

当然你需要某种主键。

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

如果您没有明确地执行此操作,某些RDBMS(例如MySQLInnoDB)实际上会为您创建一个隐藏的主键,所以只需自己动手做即可。可见和可用。

答案 1 :(得分:1)

你几乎拥有,因为当Employee中的EmployeeID是唯一的(更新不会添加新行,只修改现有行)时,审计表将有多行相同的EmployeeId(一个用于初始插入,一个用于每个后续更新,该雇员)。

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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