SQL Server 2008在审计跟踪中更改数据捕获与触发器

时间:2012-04-08 04:36:20

标签: sql sql-server-2008 triggers

我们在Web应用程序上使用触发器实现了审计跟踪。这些触发器记录字段级别更新。因此,在表格中,如果您更改了5个列值,我们在审计跟踪中有5个记录,每个列具有旧值和新值。

最近我们已经升级到SQL Server 2008.我一直在考虑使用新的更改数据捕获功能,因为它提供了非常简洁的行级更新,而且工作量非常简单,而且非常容易实现。只是想从那些使用变更跟踪的人那里获得一些意见,以获取任何警告或任何其他真实有用的信息。

任何建议都会有所帮助。

修改: - http://technet.microsoft.com/en-us/magazine/2008.11.sql.aspx?pr=blog

2 个答案:

答案 0 :(得分:7)

我在WPF应用中使用CDC。效果很好,但我发现了三个问题:

无论如何,CDC是非常有用的机制,它可以帮助我跟踪数据库的所有变化。

答案 1 :(得分:6)

SQL Server中总共有四个解决方案,详情如下:

  • SQL Server更改跟踪[CTC]
  • SQL Server更改数据捕获[CDC]
  • 带触发器的SQL Server审计跟踪[通用 - 手动]
  • SQL Server审核

SQL Server更改跟踪[CTC]

<强> 赞成

  • 适用于所有SQL Server版本
  • DML触发器和其他表不是必需的,因为单个临时值 表由CTC创建,名为CHANGETABLE
  • 最小磁盘空间成本
  • 可用于查询数据的打包函数
  • 可配置的保留政策和自动清理CHANGETABLE
  • 可以在需要时关闭自动清理功能
  • 无需访问该特定数据库的LDF文件
  • 启用CTC时可以清除/截断

<强> 缺点

  • 需要在数据库和每个必需的表上启用
  • 同步跟踪机制
  • 所有表的跟踪数据都存储在名为的单个临时表中 CHANGETABLE
  • 无法获取历史数据也未提供有关之前的详细信息 以及跟踪列中的新数据
  • 复合键支持问题
  • 需要主键
  • 仅保持数据的当前状态w.r.t操作I = Insert, U =更新,D =删除
  • SQL Server用户组&#39; sysadmin&#39;只能启用CTC

SQL Server更改数据捕获[CDC]

<强> 赞成

  • 此功能在启用后提供逐个表解决方案 数据库级别。
  • 高效&amp;快速,异步跟踪机制
  • 可以获取历史数据,也可以提供详细的详细信息 影子表中的上一个和新数据
  • 不需要DML触发器,因为新表是由CDC创建的 前缀&#39; dbo _&#39;和后缀&#39; _CT&#39;对于每张桌子。
  • 所有与CDC相关的表格&amp;函数将被引用&amp; cdc&#39; 架构。
  • 所有与CDC相关的存储过程都将通过&#39; sys&#39;要么 &#39; CDC&#39;模式

<强> 缺点

  • 没有捕获有关进行更改的用户的信息 您可能需要在每个表中创建一些额外的列 希望被跟踪,列如下:

    CreatedAt datetime default(getdate()),    CreatedBy nvarchar(100)默认(suser_sname()),    UpdatedAt datetime default(getdate()),    UpdatedBy nvarchar(100)default(suser_sname())

  • 应为CDC启用SQL Server代理,CDC也无法运行 正确地,当数据库引擎服务或SQL Server代理时 服务正在NETWORK SERVICE帐户下运行
  • 需要在数据库和每个必需的表上启用
  • 仅适用于Enterprise,Developer和DataCenter版本
  • 需要访问该特定数据库的LDF文件
  • 应启用SQL Server代理以捕获数据
  • 启用CDC时,主表上无法清除/截断, 影子表上的自动清理一旦启用就无法关闭
  • 事务日志(LDF文件)
  • 需要额外空间
  • Db的用户组&#39; db_owner&#39;或服务器的角色&#39;系统管理员&#39;只可以 启用CDC
  • 跟踪包含列的更改时存在限制 XML,稀疏,时间戳,CLOB和BLOB数据类型
  • 当调用者没有查看源数据的权限时, 函数返回错误229

带触发器的审计跟踪[通用解决方案]

<强> 赞成

  • 可以获取历史数据,也可以提供详细的详细信息 影子表中的上一个和新数据
  • 选择好的列,操作[I = Insert, U =更新,D =删除]
  • 由于复杂性,审计跟踪流程,流程可以自动化 可以用一些例行公事或服务来治理。
  • 清除/截断以及自动清理也可以自动化

<强> 缺点

  • 需要一些额外列的表的精确副本作为Shadow 表
  • 复杂的流程w.r.t开发,数据管理和清除
  • 当影子表中的数据变得很大时,性能会受到影响,清除就是这样 需要
  • 考虑到所有重要因素,需要花费很多时间来自动化流程 可靠性,安全性和性能方面。哪个是原生的 解决方案,默认情况下提供数据库引擎。