1

我已经在线阅读了几篇文章以及 StackOverflow 上关于为数据库驱动的应用程序创建审计跟踪的几个答案。似乎最流行的解决方案是为有问题的表创建一个审计表,并使用触发器将审计记录插入到审计表中。

我可以看到这对于数据包含在一个表中的简单实体如何运作良好。

那么包含子节点的聚合根呢?

例子:

订单是包含许多订单行的聚合根,每个订单行在数据库中都有自己的表。假设每个数据库中还有一个审计表,当原始表发生更改时,它通过触发器接收更新:

tblOrders --> Trigger --> tblOrdersAudit
tblOrderLines --> Trigger --> tblOrderLinesAudit

现在,假设我们更改了某个订单的某些内容,但不更改其任何订单行。结果 tblOrders 被更新,并且触发器插入一个新的审计记录,反映对 tblOrdersAudit 的更改。但是,没有对 tblOrderLines 进行任何更改,因此 tblOrderLinesAudit 中没有匹配的审计记录。

一段时间后,我需要查看订单的早期状态,也许是为了回滚数据。我们如何匹配审计记录?

4

2 回答 2

1

在回滚的情况下,您不会按表执行吗?假设从 T-1 更新 tblOrders 以来,对数据库所做的唯一更改。在这种情况下

  1. tblOrders将回滚到 T-1 时间:来自审计的值将用于tblOrders恢复到 T-1 时的状态。

  2. tblOrdersLines将回滚到时间 T-1:没有条目tblOrdersLineAudit,因此不会更新任何内容。

最后,您的桌子处于 T-1 时的状态。

更多信息的链接很少 -

于 2011-05-14T03:24:22.070 回答
0

一段时间后,我需要查看订单的早期状态,也许是为了回滚数据。我们如何匹配审计记录?

正如您正确识别的那样,这并不容易。

就个人而言,当我需要重新访问快照时,我会存储整个聚合的副本。换句话说,在插入/更新/删除订单或订单行或任何其他关联表时,我在其他关联表中记录该订单 + 每个订单行 + 每个相关行。

从存储的角度来看,它效率不高(尽管我倾向于存储每个事务的最终快照,而不是每次更改),从性能的角度来看也不是理想的,但它完成了工作......

于 2011-05-14T10:19:45.200 回答