我需要审核企业 Web 应用程序中的修改操作(创建/删除/更新)。然后,用户可能需要查看特定实体(例如 Person)的更改历史来决定是否执行某项操作。
据我所知,它可以通过使用.NET 中的 log4net、nlog 等库来完成,或者可能还有其他我不知道的版本控制专用库。
或者它可以在数据库中完成,例如使用SQL Server 的更改数据捕获。
使用内置数据库解决方案似乎更有效,但问题是:
将应用程序的业务控制到数据库中,在软件工程方面是否正确?
我需要审核企业 Web 应用程序中的修改操作(创建/删除/更新)。然后,用户可能需要查看特定实体(例如 Person)的更改历史来决定是否执行某项操作。
据我所知,它可以通过使用.NET 中的 log4net、nlog 等库来完成,或者可能还有其他我不知道的版本控制专用库。
或者它可以在数据库中完成,例如使用SQL Server 的更改数据捕获。
使用内置数据库解决方案似乎更有效,但问题是:
将应用程序的业务控制到数据库中,在软件工程方面是否正确?
在我公司的应用程序中,我们在两个地方都登录,但用途不同:
对于允许我们跟踪每个表的更改的基本审计,包括表中的数据,记录更改的内容、时间和人员,我们使用AutoAudit很幸运。它是一个开源包,可以为数据库中的任何或所有表添加自动审计。
我只在相对较小的项目(少于 20 个表,同时只有少数几个用户)上亲自尝试过,但效果很好。设置几乎不费吹灰之力,开箱即用的功能满足了我们的需求。
2013 年 11 月发布了对 AutoAudit 3.20 版的重大升级,具有以下新增功能:
处理最多 5 个 PK 列的表
性能提升比 2.00 版快 90%
改进的历史数据检索 UDF
处理需要 quotename [ ] 的列/表名称
存档过程以使实时审计表更小/更快,但在存档 AutoAudit 表中保留旧数据
你可以在这里找到它。
您使用的是什么版本的 SQL Server?SQL Server 2008 + 原生支持审计,我相信这是 2008 和 2008 R2 中的企业版功能,但 SQL Server 2012 的标准版中提供服务器级审计,只有数据库级审计是企业功能。
有关详细信息,请参阅以下链接:
变更数据捕获并不是真正为审计而设计的,它旨在用于提供源系统上已更改的数据的摘要,以便可以轻松地被另一个系统使用。
编辑:
因此,如果您需要保留实际更改的数据,那么 CDC 可以做到这一点,但您将无法看到是谁更改了它,因此它不是审计。CDC 和审计的组合可以工作,但设置起来会很复杂。
最简单的方法可能是使用更新、插入和删除触发器来维护历史表,添加审计信息,例如修改发生的时间和执行操作的人员。这也意味着您不必使用 SQL Server 的企业版,因为可以在所有版本上定义触发器。
是的,我建议在数据库中进行。这个解决方案会更快。就软件工程而言,这是正确的,因为您将使用数据库作为解决方案,但您将创建另一个层(UI)来从数据库中检索信息。
如果您的 SQL Server 不是企业版,您可能需要手动创建触发器,或者购买 apexsql trigger 等帮助工具来帮助您审核该信息。