我过去使用的一种简单方法基本上只是创建第二个表,其结构反映了我要审核的表,然后在主表上创建更新/删除触发器。在更新/删除记录之前,当前状态通过触发器保存到审计表中。
虽然有效,但审计表中的数据并不是最有用或最容易报告的数据。我想知道是否有人有更好的方法来审核数据更改?
这些记录不应该有太多更新,但它是高度敏感的信息,因此对客户而言,对所有更改进行审计并轻松报告是很重要的。
我过去使用的一种简单方法基本上只是创建第二个表,其结构反映了我要审核的表,然后在主表上创建更新/删除触发器。在更新/删除记录之前,当前状态通过触发器保存到审计表中。
虽然有效,但审计表中的数据并不是最有用或最容易报告的数据。我想知道是否有人有更好的方法来审核数据更改?
这些记录不应该有太多更新,但它是高度敏感的信息,因此对客户而言,对所有更改进行审计并轻松报告是很重要的。
您预计该表的写入与读取量是多少?
我使用了一个审计表,其中包含 Table、Column、OldValue、NewValue、User 和 ChangeDateTime 的列 - 足够通用,可以处理数据库中的任何其他更改,虽然大量数据被写入该表,但报告这些数据足够稀疏,可以在一天中的低使用时段运行。
补充: 如果数据量与报告是一个问题,审计表可以复制到只读数据库服务器,允许您在必要时运行报告,而不会让主服务器停止工作。
我们为此使用了两个表设计。
一张表保存有关事务的数据(数据库、表名、模式、列、触发事务的应用程序、启动事务的登录主机名、日期、受影响的行数等等)。
第二个表仅用于存储数据更改,以便我们可以在需要时撤消更改并报告旧/新值。
另一种选择是为此使用第三方工具,例如ApexSQL 审计或 SQL Server 中的更改数据捕获功能。
是否有任何内置的审计包?Oracle 有一个不错的软件包,它甚至可以将审计更改发送到一个单独的服务器,任何修改 SQL 的坏人都无法访问。
他们的例子很棒......它展示了如何提醒任何修改审计表的人。
OmniAudit可能是您需要的一个很好的解决方案。我以前从未使用过它,因为我很高兴编写自己的审计程序,但这听起来不错。
我使用 Greg 在他的回答中描述的方法,并使用从表触发器调用的存储过程填充审计表。