我正在尝试找到一种高效的审计表中数据更改的方法。目前我正在使用一个触发器来查看INSERTED和DELETED表以查看哪些行已更改并将这些更改插入到Audit表中。
问题是这被证明是非常低效的(显然!)。有可能一次将3千行插入数据库(这并不罕见),总共需要插入215000行来审计这些行。
在没有花费很长时间插入数据库的情况下审核所有这些数据的合理方法是什么?它需要快速!
感谢。
答案 0 :(得分:4)
正确写入的触发器应该足够快。
您还可以查看Change Data Capture
我经常使用AutoAudit:
AutoAudit是一个创建的SQL Server(2005,2008,2012)Code-Gen实用程序 审计跟踪触发器:
Created,CreatedBy,Modified,ModifiedBy和RowVersion(递增 INT)列到表
将记录的事件记录到审计表
更新记录到审计表的旧值和新值删除所有记录 审计表的最终值
查看重建已删除的行
UDF重建行历史
用于跟踪架构更改的架构审核触发器
当Alter Table更改表
时,会重新编码gens
更新 :(原始编辑遭到拒绝,但我正在重新添加):
2013年11月发布了对3.20版本的重大升级,增加了这些功能:
处理最多包含5个PK列的表
性能提升比版本2.00快<90%
改进了历史数据检索UDF
处理需要引用[]
存档过程,以保持实时审核表更小/更快,但保留存档AutoAudit表中的旧数据
答案 1 :(得分:1)
正如其他人已经提到的 - 您可以在SQL Server中使用更改数据捕获,更改跟踪和审核功能,但为了保持简单并使用一个解决方案来跟踪所有SQL Server活动,包括这些DML操作,我建议尝试ApexSQL Comply。您可以禁用所有其他,并仅保留DML审核选项 它使用集中存储库来捕获有关多个SQL Server实例及其数据库的信息。
最好首先阅读本文,然后决定使用此工具: http://solutioncenter.apexsql.com/methods-for-auditing-sql-server-data-changes-part-9-the-apexsql-solution/
答案 2 :(得分:1)
SqlTableDependency C#componentsnet提供了用于接收创建SQL Server队列和Service Broker的数据库通知的低级实现。
查看http://www.sqltabledependency.it/
对于任何记录更改,SqlTableDependency的事件处理程序将获得包含已修改的表记录值的通知以及在数据库表上执行的DML - 插入,更新,删除 - 更改。
答案 3 :(得分:0)
您可以通过添加其他列来允许表进行自我审核,例如:
对于INSERT - 这是一条新记录,它在表中的存在就是审计本身。
使用DELETE - 您可以在表格中添加IsDeleted BIT \ DeletingUserID INT \ DeletingTimestamp DATETIME
等列。
通过更新,您可以添加IsLatestVersion BIT \ ParentRecordID INT
等列来跟踪版本更改。