在SQL Server中实现审计表的建议?

时间:2008-08-06 18:39:34

标签: sql sql-server database audit

我过去使用的一个简单方法基本上就是创建第二个表,其结构镜像我想要审计的表,然后在主表上创建更新/删除触发器。在更新/删除记录之前,当前状态将通过触发器保存到审计表中。

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

这些记录的更新不应太多,但它是高度敏感的信息,因此对客户来说,所有更改都经过审核并轻松报告非常重要。

6 个答案:

答案 0 :(得分:17)

您对此表的阅读与阅读量有多大关系?

我使用了一个审计表,其中包含Table,Column,OldValue,NewValue,User和ChangeDateTime的列 - 通用程序足以处理数据库中的任何其他更改,并且有大量数据写入该表表中,有关该数据的报告非常稀少,可以在当天的低使用期间运行。

<强>加了: 如果需要关注数据量与报告量,则可以将审计表复制到只读数据库服务器,从而允许您在必要时运行报告,而不会让主服务器停止工作。

答案 1 :(得分:6)

我们正在使用两个表设计。

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

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

另一种选择是使用第三方工具,例如SQL Server中的ApexSQL Audit或更改数据捕获功能。

答案 2 :(得分:2)

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

使用CLR和单一审核表 Creating a generic audit trigger with SQL 2005 CLR

为每个被审计的表使用触发器和单独的审计表 How do I audit changes to SQL Server data?

答案 3 :(得分:1)

是否有任何内置审核包? Oracle有一个很好的软件包,它甚至可以将审计更改发送到一个单独的服务器上,而不是任何正在修改SQL的坏人访问。

他们的例子非常棒......它显示了如何警告任何修改审计表的人。

答案 4 :(得分:1)

OmniAudit可能是您需要的好方法。我之前从未使用它,因为我很乐意编写自己的审计程序,但听起来不错。

答案 5 :(得分:1)

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