admin

在 SQL Server 中创建审计触发器

sql

我需要对我的 SQL Server 2005 数据库中的两个表实施更改跟踪。我需要审核添加、删除、更新(包含更新内容的详细信息)。我打算使用触发器来做到这一点,但在谷歌上搜索之后,我发现错误地执行此操作非常容易,我想在开始时避免这种情况。

任何人都可以发布一个以优雅的方式成功完成此操作的更新触发器示例吗?我希望最终得到一个具有以下结构的审计表:

  • ID
  • LogDate
  • TableName
  • TransactionType (update/insert/delete)
  • RecordID
  • FieldName
  • OldValue
  • NewValue

阅读 192

收藏
2021-07-01

共1个答案

admin

我只想指出几点:

使用代码生成器不能有一个过程来跟踪所有表,您需要在每个被跟踪表上生成相似但不同的触发器。这种工作最适合自动化代码生成。在您那里,我将使用 XSLT 转换从 XML 生成代码,并且可以从元数据自动生成 XML。这使您可以通过在每次更改审计逻辑/结构或添加/更改目标表时重新生成触发器来轻松维护触发器。

考虑审计的容量规划。迄今为止,跟踪所有值更改的审计表将是数据库中最大的表:它将包含所有当前数据和当前数据的所有历史记录。这样的表会使数据库大小增加 2-3 个数量级 (x10, x100)。而审计表很快就会成为一切的瓶颈:

  • 每个 DML 操作都需要在审计表中加锁
  • 由于审计,所有管理和维护操作都必须适应数据库的大小

考虑架构更改。一个名为“Foo”的表可能会被删除,稍后可能会创建一个名为“Foo”的不同表。审计跟踪必须能够区分两个不同的对象。最好使用缓慢变化的维度]方法。

考虑有效删除审计记录的需要。当您的应用程序主题策略规定的保留期限到期时,您需要能够删除到期的审计记录。现在看起来可能没什么大不了,但是 5 年后,当第一条记录到期时,审计表已增长到 9.5TB,这可能是一个问题。

考虑需要查询审计。必须准备审计表结构以有效响应审计查询。如果您的审计无法查询,则它没有价值。查询将完全由您的需求驱动,只有您知道这些,但大多数审计记录都是按时间间隔(“昨天晚上 7 点到晚上 8 点之间发生了什么变化?”)、按对象(“此记录发生了什么变化”表?”)或作者。

2021-07-01