我在线阅读了几篇文章以及StackOverflow上有关为数据库驱动的应用程序创建审计跟踪的几个答案。似乎最流行的解决方案是为相关表创建一个审计表,并使用触发器将审计记录插入审计表。
我可以看到这对于数据包含在一个表中的简单实体是如何工作的。
包含儿童的聚集根源怎么样?
示例:
订单是一个包含许多订单行的聚合根,每个订单行在数据库中都有自己的表。假设每个数据库中都有一个审计表,当原始表发生更改时,它通过触发器接收更新:
tblOrders --> Trigger --> tblOrdersAudit
tblOrderLines --> Trigger --> tblOrderLinesAudit
现在,假设我们对订单进行了更改,但不对其任何订单行进行任何更改。结果会更新tblOrders,并且触发器会插入反映tblOrdersAudit更改的新审核记录。但是,没有对tblOrderLines进行任何更改,因此tblOrderLinesAudit中没有匹配的审计记录。
一段时间后,我需要查看Order的早期状态,或许是为了回滚数据。我们如何匹配审计记录?
答案 0 :(得分:1)
如果回滚,您不会按表格进行吗? 假设只有对数据库进行了更改,因为时间T-1是tblOrders的更新。在这种情况下
tblOrders
将回滚到时间T-1:审核中的值将用于将tblOrders
恢复到T-1的状态。
tblOrdersLines
将回滚到时间T-1:tblOrdersLineAudit
中没有条目,因此不会更新任何内容。
最后,你的桌子处于他们在T-1的状态。
更多信息的链接很少 -
答案 1 :(得分:0)
一段时间后,我需要查看Order的早期状态,或许是为了回滚数据。我们如何匹配审计记录?
正确识别并不容易。
就个人而言,当我需要重新访问快照时,我会存储整个聚合的副本。换句话说,在插入/更新/删除订单或订单行或任何其他相关表时,我记录该订单+每个订单行+其他相关表中的每个相关行。
从存储角度看它效率不高(即使我倾向于为每个事务存储最终快照,而不是每次更改),从性能角度来看也不是理想的,但是它完成了工作......