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

Ash*_*pta 12 sql triggers sql-server-2008

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

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

任何意见将是有益的.

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

dev*_*arc 7

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

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

  • 我在我的应用程序中跟踪用户.我正在使用EF和"OnPropertyChanged"方法来跟踪对象的变化并记录用户.这不是"干净"的解决方案,但我不知道是否有更好的解决方案. (3认同)
  • 我猜是有一份工作可以清理更改表.那是对的吗?如果是的话,我们可以"禁用"那份工作吗?另外,如何跟踪哪个应用程序用户更改了数据? (2认同)

emk*_*ays 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的单个临时表中
  • 无法获取历史数据也无法提供跟踪列中先前和新数据的确切详细信息
  • 复合键支持问题
  • 需要主键
  • 仅保持数据的当前状态,操作I =插入,U =更新,D =删除
  • SQL Server用户组'sysadmin'只能启用CTC

SQL Server更改数据捕获[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())

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

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

优点

  • 可以获取历史数据,也可以在影子表中提供有关先前和新数据的确切详细信息
  • 良好控制的wrt选择列,操作[I =插入,U =更新,D =删除]
  • 由于复杂性,流程可以自动化,审计跟踪流程可以通过某些例程或服务来管理.
  • 清除/截断以及自动清理也可以自动化

缺点

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

  • 它只是我,还是你列出了4个选项然后只详细描述了三个? (5认同)