2011-03-11 83 views
4

我的同事在工作中给我提出了一个问题,我无法回答(由于很多缺乏经验),这与追踪表格上相关字段的变化有关。跟踪表中的变化

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

如果我们想要追踪这3个表格中的变化,但只追踪一些特定字段的变化,而不更新每个包含它们最后一个版本的历史记录表格,我们如何跟踪变化这些相关领域,仍然保持通用?

+2

如果您不打算创建历史记录表,那么您希望在哪里保存历史记录? – 2011-03-11 14:35:00

+0

这似乎令人费解,至少对我来说是这样。我的同事说我们不能使用历史记录表来跟踪这些变化。这里的事情是,你不需要知道旧的价值是什么,你只需要知道一个重要的领域已经发生了变化。这就是需要的那种跟踪。 – Hallaghan 2011-03-11 14:36:34

回答

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 protected]', 1, null, null, null, null);

  2. E-人的邮件1已更新: insert into audit(2, 'person', 'email', 'C' /* change */, 'USER', '12-03-2011', '[email protected]', '[email protected]', 1, null, null, null, null);

  3. 现在假设perso的电子邮件ñ70更新: insert into audit(3, 'person', 'email', 'C' , 'USER', '12-03-2011', '[email protected]', '[email protected]', 70, null, null, null, null);

+0

谢谢,我很好。 – Hallaghan 2011-03-11 14:59:01

+2

这是一个有效的选择,但是像所有事情都有消极和积极的一面。例如,如果您有成千上万的表将审计写入一张表,那么您可以创建一个非常好的热点。 – Kuberchaun 2011-03-11 15:20:52

2

如果你不需要知道发生了什么变化,只是一些重要的领域发生了变化,那么就增加一个时间戳列,LastImportantUpdateOn或类似的东西。然后添加一个触发器来将编辑添加到被认为“重要”的字段并写入新的时间戳。

如果您需要知道哪个字段发生了变化,请为每个字段添加新的时间戳,而不是通常添加一个。