【发布时间】:2011-08-25 08:51:16
【问题描述】:
我已经阅读了几篇在线文章以及 StackOverflow 上关于为数据库驱动的应用程序创建审计跟踪的几个答案。似乎最流行的解决方案是为有问题的表创建一个审计表,并使用触发器将审计记录插入到审计表中。
我可以看到这对于数据包含在一个表中的简单实体如何运作良好。
包含子节点的聚合根呢?
例子:
订单是包含许多订单行的聚合根,每个订单行在数据库中都有自己的表。假设每个数据库中还有一个审计表,当原始表发生更改时,它会通过触发器接收更新:
tblOrders --> Trigger --> tblOrdersAudit
tblOrderLines --> Trigger --> tblOrderLinesAudit
现在,假设我们更改了订单的某些内容,但不更改任何订单行。结果 tblOrders 被更新,并且触发器插入一个新的审计记录,反映对 tblOrdersAudit 的更改。但是,没有对 tblOrderLines 进行任何更改,因此 tblOrderLinesAudit 中没有匹配的审计记录。
一段时间后,我需要查看订单的早期状态,也许是为了回滚数据。我们如何匹配审计记录?
【问题讨论】:
-
我不确定我是否理解。这似乎按预期工作。
tblOrderLines不应该有审计记录,因为没有任何改变,对吧?您是否出于某种原因想要tblOrderLines的审核记录?它会说什么? -
我解释得不够好。如果我需要返回某个时间点并查看订单的快照,我需要相应的订单行来配合它。我为一个订单加载了审计记录...我如何判断哪个 OrderLine 审计记录与之一起使用,以便整个聚合的状态有效?
-
好的,我明白你在说什么。查看@YetAnotherUser 的答案以获得答案。基本上,您是回滚到某个时间点,而不是尝试将存档表相互链接。
-
@BiggsTRC 阅读我对他关于不知道 T-1 的评论。我可能解释得不够好,但我真正想要的是能够重新创建聚合自创建以来一直处于的每个状态。这将使我能够看到问题的根源,并可能修复数据。希望这是有道理的,我真的不应该在整天绞尽脑汁之后这么晚才发布问题:)
标签: database-design domain-driven-design audit-trail