跟踪表格中的变化

Hal*_*han 5 sql

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

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

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

Joã*_*lva 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_value1to pk_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认同)