【问题标题】:Keeping track of changes in a table跟踪表中的更改
【发布时间】:2011-03-11 14:32:40
【问题描述】:

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

假设我们有 3 个表,每个表有 20 个字段。对于此示例,我们假设每个表都有 2 个字段,一个名为 LastUpdatedOn,另一个名为 LastUpdatedBy。

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

【问题讨论】:

  • 如果您不打算创建历史记录表,您希望将历史记录保存在哪里?
  • 这似乎令人费解,至少对我来说是这样。我的同事说我们不能使用历史表来跟踪更改。这里的问题是,您不需要知道旧值是什么,您只需要知道一个重要字段已更改。这就是需要的跟踪。

标签: sql


【解决方案1】:

无需为每个人创建历史记录/审核表。您可以有一个单个表,其中存储您要跟踪的字段的表和字段名称:

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);

【讨论】:

  • 这是一个有效的选项,但就像所有事物一样,它也有负面和正面。例如,如果您有数千个表将审计写入一个表,那么您可以创建一个非常好的热点。
【解决方案2】:

如果您不需要知道发生了什么变化,只需知道某些重要字段发生了变化,那么只需添加另一个时间戳列,LastImportantUpdateOn 或类似的东西。然后添加一个触发器来捕捉对被认为“重要”的字段的编辑并写入一个新的时间戳。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多