我已经在线阅读了几篇文章以及 StackOverflow 上关于为数据库驱动的应用程序创建审计跟踪的几个答案。似乎最流行的解决方案是为有问题的表创建一个审计表,并使用触发器将审计记录插入到审计表中。
我可以看到这对于数据包含在一个表中的简单实体如何运作良好。
那么包含子节点的聚合根呢?
例子:
订单是包含许多订单行的聚合根,每个订单行在数据库中都有自己的表。假设每个数据库中还有一个审计表,当原始表发生更改时,它通过触发器接收更新:
tblOrders --> Trigger --> tblOrdersAudit
tblOrderLines --> Trigger --> tblOrderLinesAudit
现在,假设我们更改了某个订单的某些内容,但不更改其任何订单行。结果 tblOrders 被更新,并且触发器插入一个新的审计记录,反映对 tblOrdersAudit 的更改。但是,没有对 tblOrderLines 进行任何更改,因此 tblOrderLinesAudit 中没有匹配的审计记录。
一段时间后,我需要查看订单的早期状态,也许是为了回滚数据。我们如何匹配审计记录?