跟踪表格中的变化

时间:2011-03-11 14:32:41

标签: sql

我的同事在工作中向我提出了一个我无法回答的问题(由于经验不足),这个问题与跟踪桌面相关领域的变化有关。

想象一下,我们有3个表,每个表有20个字段。让我们考虑这个例子,每个表都有2个字段,一个名为LastUpdatedOn,另一个名为LastUpdatedBy。

如果我们想要跟踪这3个表中的变化,但仅针对几个特定字段,而不是为每个表创建一个历史记录表,其中包含最新版本的更新,我们如何跟踪这些变化相关领域仍然保持通用?

2 个答案:

答案 0 :(得分:4)

无需为每个表创建历史/审计表。您可以拥有单个表,该表存储您要跟踪的字段的表和字段名称:

audit(audit_id, table_name, field_name, action_flg, updated_by, updated_on, val_before, val_after, pk_value1, pk_value2, pk_value3, pk_value4, pk_value5)

您需要存储表的主键(字段pk_value1pk_value5),以便唯一标识已更改的行。如果要跟踪已删除的更新,插入或行,则使用action_flg。 Oracle在其某些产品中使用此表结构。

例如,假设您有一个表person(person_id, name, email),并且您需要跟踪对字段email所做的更改:

  1. 创建了一个新人(id=1):insert into audit(1, 'person', 'email', 'A' /* add */, 'USER', '11-03-2011', null, 'email@mail.com', 1, null, null, null, null);

  2. 更新了人1的电子邮件: insert into audit(2, 'person', 'email', 'C' /* change */, 'USER', '12-03-2011', 'email@mail.com', 'new_email@mail.com', 1, null, null, null, null);

  3. 现在假设人70的电子邮件已更新: insert into audit(3, 'person', 'email', 'C' , 'USER', '12-03-2011', 'p70email@mail.com', 'new_p70mail@mail.com', 70, null, null, null, null);

答案 1 :(得分:2)

如果您不需要知道更改了什么,只有一些重要字段已更改,那么只需添加另一个时间戳列LastImportantUpdateOn或类似的内容。然后添加一个触发器来捕获对被认为“重要”的字段的编辑并写入新的时间戳。

如果您需要知道哪个字段已更改,请为每个字段添加一个新的时间戳,而不是通常添加一个。