我过去使用的一个简单方法基本上就是创建第二个表,其结构镜像我想要审计的表,然后在主表上创建更新/删除触发器。在更新/删除记录之前,当前状态将通过触发器保存到审计表中。
虽然有效,但审计表中的数据并不是最有用或最简单的报告。我想知道是否有人有更好的方法来审核数据更改?
这些记录的更新不应太多,但它是高度敏感的信息,因此对客户来说,所有更改都经过审核并轻松报告非常重要。
答案 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中描述的方法,并使用从表触发器调用的存储过程填充审计表。