繁体   English   中英

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

[英]SQL Server 2008 change data capture vs triggers in audit trail

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

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

任何意见将是有益的。

编辑:- http://tec.net.microsoft.com/en-us/magazine/2008.11.sql.aspx?pr=blog

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

不管怎样,CDC 是一个非常有用的机制,可以帮助我跟踪数据库中的所有更改。

在SQL Server中一共找到四种解决方案,具体如下:

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

SQL 服务器更改跟踪 [CTC]

优点

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

缺点

  • 需要在数据库和每个需要的表上启用
  • 同步跟踪机制
  • 所有表的跟踪数据存储在名为 CHANGETABLE 的单个临时表中
  • 无法获取历史数据,也无法在跟踪列中提供有关以前和新数据的确切详细信息
  • 复合键支持问题
  • 需要主键
  • 只维护当前state的数据w.r.t操作I=Insert,U=Update,D=Delete
  • SQL 服务器用户组 'sysadmin' 只能启用 CTC

SQL 服务器更改数据捕获 [CDC]

优点

  • 在数据库级别启用后,此功能提供逐表解决方案。
  • 高效快速,异步跟踪机制
  • 可以获取历史数据,也可以在影子表中给出关于以前和新数据的准确细节
  • 不需要 DML 触发器,因为新表是由 CDC 创建的,每个表都带有前缀“dbo_”和后缀“_CT”。
  • 所有与 CDC 相关的表和函数都将使用“cdc”架构进行引用。
  • 所有与 CDC 相关的存储过程都将使用“sys”或“cdc”模式引用

缺点

  • 不会捕获有关进行更改的用户的信息,因为您可能需要在每个需要跟踪的表中创建一些额外的列,这些列如下所示:

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

  • SQL Server Agent应该为CDC启用,CDC也不能正常工作,当数据库引擎服务或SQL Server Agent服务运行在.NETWORK SERVICE账户下
  • 需要在数据库和每个需要的表上启用
  • 仅适用于企业版、开发人员版和数据中心版
  • 需要访问该特定数据库的 LDF 文件
  • SQL 应启用服务器代理以捕获数据
  • 启用 CDC 时无法在主表上清除/截断,启用后无法关闭影子表上的自动清理
  • 事务日志(LDF 文件)需要额外空间
  • Db 的用户组 'db_owner' 或服务器的角色 'sysadmin' 只能启用 CDC
  • 跟踪包含 XML、Sparse、Timestamp、CLOB 和 BLOB 数据类型的列的更改时存在限制
  • 当调用者没有权限查看源数据时,function返回错误229

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

优点

  • 可以获取历史数据,也可以在影子表中给出关于以前和新数据的准确细节
  • 控制好w.r.t选择列,操作[I=Insert,U=Update,D=Delete]
  • 由于复杂性,流程可以自动化,审计跟踪流程可以通过一些例程或服务进行管理。
  • 清除/截断以及自动清理也可以自动化

缺点

  • 作为影子表,需要具有一些额外列的表的精确副本
  • 复杂过程 w.r.t 开发、数据管理和清除
  • 当影子表中的数据变得巨大时,性能会受到影响,需要清除
  • 考虑到可靠性、安全性和性能的所有重要方面,需要花费很多时间来自动化该过程。 在本机解决方案中,DB Engine 默认提供。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM