32

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

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

这些记录不应该有太多更新,但它是高度敏感的信息,因此对客户而言,对所有更改进行审计并轻松报告是很重要的。

4

6 回答 6

19

您预计该表的写入与读取量是多少?

我使用了一个审计表,其中包含 Table、Column、OldValue、NewValue、User 和 ChangeDateTime 的列 - 足够通用,可以处理数据库中的任何其他更改,虽然大量数据被写入该表,但报告这些数据足够稀疏,可以在一天中的低使用时段运行。

补充: 如果数据量与报告是一个问题,审计表可以复制到只读数据库服务器,允许您在必要时运行报告,而不会让主服务器停止工作。

于 2008-08-06T18:51:48.793 回答
6

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

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

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

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

于 2013-05-10T09:41:37.720 回答
2

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

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

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

于 2008-09-01T09:14:48.070 回答
1

是否有任何内置的审计包?Oracle 有一个不错的软件包,它甚至可以将审计更改发送到一个单独的服务器,任何修改 SQL 的坏人都无法访问。

他们的例子很棒......它展示了如何提醒任何修改审计表的人。

于 2008-08-06T18:49:23.150 回答
1

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

于 2008-08-06T19:56:14.763 回答
1

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

于 2008-08-06T20:23:27.750 回答