【发布时间】:2019-11-29 05:56:12
【问题描述】:
我目前有一个系统,其 EF 6 绑定到 Azure SQL 后端。每个应用程序实体都有一个字段:createdby、last modified by、deleted by。这些用户字段中的每一个都与用户实体表中的用户相关联。该应用程序适用于一家刚刚将部分内部流程在线迁移的小公司。到目前为止,它运行良好,但现在公司正在显着增长,他们希望添加对业务更重要的功能。所以我必须更新我的审计模式,以便更能反映系统在任何时间点发生的事情(不仅仅是最后一次修改,而是在任何更改发生之前的每次修改和数据快照以及其他各种项目)。
是否有处理捕获审计记录(创建者、修改者、删除者等)的最佳方法?
目前,我正在考虑覆盖 EF6 的 SaveChanges/Async 方法并捕获正在更改前后保存的记录并将它们序列化并使用时间戳和用户 ID 将它们保存到 documentdb。我知道这应该可行,但是有没有更好的方法我不在我的代码中这样做并且可以在其他地方处理它?我也在考虑可能将序列化的实体树发布到 EventGrid,然后让网络作业订阅该 EventGrid 并让它处理审计,但我不确定这是否是矫枉过正。
我知道如果我使用的是 SQL Server,我可以执行 ChangeDataCapture,但这在 AzureSQL 中不可用。
更新: 有一个提议的已回答问题,该问题讨论了覆盖 SaveChanges/Async 方法以更新特定跟踪实体的值作为审计的一种方式。这将按照我上面概述的方式在一般意义上起作用。但是,我需要 SQL 中的 ChangeDataCapture 之类的东西,其中保存了对行的每个更改,因此可以创建记录的历史跟踪,以准确查看发生了什么以及谁做了什么。虽然我相信我计划的处理方式会奏效,但更好的答案如下(已接受的答案)。时态表的答案将允许我立即开始记录每一行更改,并从该数据中准确地看到谁在什么时间点做了什么。
【问题讨论】:
-
@GertArnold ,这不是重复的,因为该解决方案严格按照谁做了什么来跟踪到位。我需要谁在记录的整个生命周期中做了什么,同时还要跟踪记录中的变化。下面的 Temporal Tables 答案是一个更好的解决方案。
标签: azure entity-framework-6 azure-sql-database