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

32

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

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

这些记录的更新不应该太多,但由于它们是高度敏感信息,因此客户认为必须对所有更改进行审计并轻松地进行报告。


2
SQL Server 2008 具有新的 Change Data Capture 功能的一些内置支持。 http://msdn.microsoft.com/en-us/library/bb522489.aspx - andyp
1
我应该指出,这个功能只在企业版中可用。 - user17060
Change Data Capture 功能似乎更多是为了确保应用程序对象与数据库保持一致,而不是审计解决方案。(例如,它只存储两天的更改。)您仍然需要轮询更改并将其写入表格,因此最好创建和使用触发器将其写入中央审计表格,如下所示。哦,上面的 URL 已经失效,请使用这个链接 - BJury
6个回答

19

您预计对该表的写入和读取有多少需求?

我使用了一个单一的审计表,其中包含表格、列、旧值、新值、用户和更改日期时间等列,足够通用以适应数据库中的任何其他更改。尽管有大量数据被写入到该表中,但对该数据的报告较为稀疏,因此可以在低使用期间运行报告。

补充: 如果数据量与报告相比是一个问题,审计表可以被复制到只读数据库服务器上,这样您就可以在必要时运行报告而不会拖慢主服务器的工作。


6
我们在这里使用了两个表设计。
一个表用于存储有关事务的数据(数据库、表名、模式、列、触发事务的应用程序、启动事务的登录主机名、日期、受影响行数等)。
第二个表仅用于存储数据更改,以便我们可以在需要时撤消更改并报告旧/新值。
另一个选项是使用第三方工具,例如ApexSQL Audit或SQL Server中的Change Data Capture功能。

2

1

是否有任何内置的审计软件包?Oracle有一个不错的软件包,甚至可以将审核更改发送到一个独立的服务器上,超出任何修改SQL的坏人的访问范围。

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


1

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


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接