我目前有一个系统,它的EF 6绑定到Azure SQL后端。每个应用程序实体都有一个用于createdby的字段,最后一次被修改,然后被删除。每个用户字段都绑定到用户实体表中的一个用户。这个应用程序是为一家小公司开发的,该公司只是将一些内部流程转移到了网上。到目前为止,它一直运作良好,但现在公司正在大幅增长,他们希望增加一些对业务更为关键的功能。因此,我必须更新我的审计模式,以便更好地指示系统中在任何时候发生的事情(不仅仅是最后一次修改,而是在发生任何更改之前对数据的每一次修改和快照以及其他各种项目)。
是否有最好的方法来处理捕获审计记录(创建、修改、删除等等)?
目前,我正在考虑重写EF6的SaveChanges/异步方法,并捕获正在更改的、前后保存和序列化的记录,并使用时间戳和用户id将它们保存到文档数据库中。我知道这应该有效,但是是否有更好的方法来避免在代码中这样做,并且可以在其他地方处理呢?我还在考虑可能将序列化的实体树发布到EventGrid,然后让一个webjob订阅该EventGrid并让它处理审核,但我不确定这是否过分。
我知道,如果我使用Server,我可以执行ChangeDataCapture,但这在AzureSQL中是不可用的。
UPDATE:有人提出了一个已经回答的问题,该问题讨论了重写SaveChanges/异步方法来更新特定跟踪实体的值,作为审计的一种方式。这将在一般意义上起作用,就像我上面概述的那样。但是,我需要类似于SQL中的ChangeDataCapture,其中保存了对一行的每一项更改,这样就可以创建记录的历史跟踪,以准确地了解发生了什么以及谁做了什么。虽然我相信我有计划地处理事情的方法是可行的,但更好的答案是在下面(接受的答案)。时态表的答案将允许我立即开始记录每一行的变化,从这些数据中,能够准确地看到谁在什么时间点做了什么。
发布于 2019-07-21 11:33:45
要跟踪“系统在任何时候发生了什么”,您可以使用内置到Azure SQL中的特性,即时态表。时态表是Azure SQL数据库的一个新的可编程特性,它允许您跟踪和分析数据更改的全部历史记录,而无需自定义编码。请参见:
https://learn.microsoft.com/en-us/azure/sql-database/sql-database-temporal-tables
https://stackoverflow.com/questions/57125993
复制相似问题