有关在SQL Server中实现审核表的建议?

有关在SQL Server中实现审核表的建议?

Suggestions for implementing audit tables in SQL Server?

我过去使用的一种简单方法基本上是创建第二个表,该表的结构与我要审核的结构相同,然后在主表上创建更新/删除触发器。 在更新记录/删除记录之前,当前状态通过触发器保存到审核表中。

虽然有效,但审计表中的数据并不是最有用或最简单的报告依据。 我想知道是否有人有更好的方法来审核数据更改?

这些记录的更新不应该太多,但它是高度敏感的信息,因此对客户而言,所有更改都必须经过审核并易于报告,这一点很重要。


您期望该表有多少写作与阅读?

我使用了一个审计表,其中有用于Table,Column,OldValue,NewValue,User和ChangeDateTime的列-通用性足以与数据库中的任何其他更改一起工作,并且在将大量数据写入该表的同时,报告这些数据非常稀疏,因此可以在一天的低使用时段运行。

添加:
如果需要考虑数据量与报告数量之间的关系,则可以将审核表复制到只读数据库服务器,从而使您可以在需要时运行报告,而不会使主服务器停止工作。


为此,我们使用了两个表设计。

一个表保存着有关事务的数据(数据库,表名,架构,列,触发事务的应用程序,启动事务的登录主机名,日期,受影响的行数以及更多)。

第二个表仅用于存储数据更改,以便我们可以在需要时撤消更改并报告新旧值。

另一个选择是为此使用第三方工具,例如ApexSQL Audit或SQL Server中的Change Data Capture功能。


我发现这两个链接很有用:

使用CLR和单个审核表。
使用SQL 2005 CLR创建通用审核触发器

对要审核的每个表使用触发器和单独的审核表。
如何审核对SQL Server数据的更改?


我使用Greg在他的答案中描述的方法,并使用从表触发器调用的存储过程填充审核表。


OmniAudit可能是您需要的一个很好的解决方案。我以前从未使用过它,因为我很高兴编写自己的审计例程,但这听起来不错。


有内置的审计程序包吗? Oracle有一个很好的软件包,它甚至可以将审核更改发送到其他修改SQL的恶意人员无法访问的服务器上。

他们的例子很棒...它显示了如何向任何修改审核表的人发出警报。


推荐阅读