C# 审核sql server数据库中的记录更改

C# 审核sql server数据库中的记录更改,c#,.net,sql-server,audit,change-tracking,C#,.net,Sql Server,Audit,Change Tracking,仅使用基于microsoft的技术(MS SQL Server、C#、EAB等)如果需要跟踪数据库中记录的更改,您将使用哪种策略?触发器,DAL上的AOP,其他?以及如何显示收集的数据?这有什么规律吗?是否有一个工具或框架可以帮助实现这种解决方案?Sql Server 2008 R2在联机丛书中有这种内置的查找更改数据捕获功能更改数据捕获的问题是它不够灵活,无法进行真正的审计。无法添加所需的列。此外,默认情况下,它每三天转储一次记录(您可以更改此设置,但我不认为您可以永久存储),因此如果您需要将

仅使用基于microsoft的技术(MS SQL Server、C#、EAB等)如果需要跟踪数据库中记录的更改,您将使用哪种策略?触发器,DAL上的AOP,其他?以及如何显示收集的数据?这有什么规律吗?是否有一个工具或框架可以帮助实现这种解决方案?

Sql Server 2008 R2在联机丛书中有这种内置的查找更改数据捕获功能

更改数据捕获的问题是它不够灵活,无法进行真正的审计。无法添加所需的列。此外,默认情况下,它每三天转储一次记录(您可以更改此设置,但我不认为您可以永久存储),因此如果您需要将数据保留很长时间(这是审计记录的典型需要)(我们从不转储审计记录),则必须将记录转储到真正的审计表中

我更喜欢触发式方法。在编写触发器时必须小心,以确保在多个记录发生更改时,触发器将捕获数据。每个表都有两个表,一个用于存储执行操作的用户或进程的datetime和id,另一个用于存储新旧数据。因为我们做了很多多个记录过程,这对我们来说是至关重要的。如果有人报告了一条不良记录,我们希望能够看到是否是某个过程导致了更改,如果是,其他哪些记录可能也受到了影响


在创建审核流程时,创建脚本以将一组审核数据恢复为旧值。如果你已经设置好了,那么在枪口下进行修复会容易得多

这可能不是一个流行的观点,但无论如何我都要把它抛在脑后

对于所有数据库写入,我更喜欢使用存储过程。如果需要审计,它就在存储过程中。代码之外没有神奇的事情发生,所有发生的事情都记录在写操作发生的地方


如果将来需要更改表,则必须转到存储过程进行更改。更新审计的必要性就记录在那里。因为我们使用了一个存储过程,所以对表及其审计表进行“版本化”更简单。

太好了!我会看一看这个。如果我很清楚您实际上在生产环境系统中使用这种方法,是吗?如果为真,触发器方法在写入速度方面是有效的?是的,我们在生产中使用。这是一个中等大小的数据库,它确实会降低一些速度,但不会太慢(如果您正确编写了触发器代码),因为用户所做的更改,它会降低批量导入(我们的批量导入设置为不避免触发器)的速度,但用户不会注意到这一点。我们有规定这种方法的法规要求,更改数据捕获并不能捕获我们需要的所有内容。我们也使用变化跟踪,但这是出于不同的目的。我不考虑我认为中型数据库的大小,但是在PROD中使用这个过程的DB大约是185 GIG并且有成千上万的用户。这是一个坏主意(就像从应用程序中做同样的事情),你不能保证所有的更改都要经过存储的进程。(或申请)因此,您有无用的审计。您认为当由于某些客户端更改而需要更新一百万条记录时,他们会通过存储过程吗?您认为欺诈性更改记录的人会通过存储过程吗?选择极为糟糕,所有审计都必须在数据库级别进行。没有任何保证恩,这涉及到数据库。当然,你可以稍微支撑一些东西,但从来没有任何方法可以阻止人们(包括未来的开发人员)做错误的事情。如果你的应用程序一直使用SPs,这一切都很好。不,不是,只是看起来是这样。在生产环境中,应该不超过两个人能够更改触发器(dba和备份dba)因此,您更有可能发现任何人正在进行未经授权的更改,而您根本无法使用存储过程来执行这些更改。审核您提出的方法是非常危险的,任何数据库专家都不会允许在他们的系统上进行更改。30年来,我从未见过一个数据库在应用程序之外偶尔不进行数据更改。我尽管投了反对票,我还是想把这个答案留在这里,因为我认为它很有用。阅读@HLGEM提出的反对意见也很有用。