2012-04-08 111 views
12

我们在我们的Web应用程序中使用触发器实现了审计跟踪。这些触发器记录字段级别的更新。因此,在表格中,如果您更改了5个列值,那么对于具有旧值和新值的每列,审计跟踪中有5条记录。SQL Server 2008更改数据捕获与审计跟踪中的触发器

最近我们升级到SQL Server 2008.我一直在考虑使用新的更改数据捕获功能,因为它可以非常简单地实现非常简洁的行级更新,而且实现起来非常简单。只是希望从那些一直在使用变更追踪的人那里得到一些意见,以了解任何警告或任何其他真实世界中有用的信息。

任何建议都会有所帮助。

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

+0

这提供了一些很好的建议:-http://stackoverflow.com/questions/2684293/change-data-capture-or-change-tracking-same-as-traditional-audit-trail-table – 2012-04-08 04:40:15

+1

如果您需要跟踪同一列已连续两次更改,您可能需要查看CDC而不是更改跟踪。 [MSDN Comparison](http://msdn.microsoft.com/en-us/library/cc280519.aspx) – 2012-04-08 07:36:39

+0

对不起,我的意思是CDC。 – 2012-04-08 15:00:07

回答

7

我用CDC在我的WPF应用程序。工作得很好,但我已经发现了三个问题:

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

+2

我在猜测有一项工作可以清理变更表。那是对的吗?如果是,我们是否可以“禁用”那项工作?另外,如何跟踪哪个应用程序用户更改了数据? – 2012-04-12 15:08:46

+1

我从来没有尝试过,因为我必须每天禁用cdc来更新一些数据而不进行日志记录,但根据这篇文章,您可以禁用任何工作,没有任何问题:http://social.msdn.microsoft.com/Forums/en- US/sqldatabaseengine/thread/1a073ef0-9a49-488f-a6c5-7b4b1c71f4c0/ – devarc 2012-04-13 07:11:34

+3

我在我的应用程序中跟踪用户。我使用EF和“OnPropertyChanged”方法来跟踪对象和日志记录用户的更改。这不是“干净”的解决方案,但我不知道有没有更好的。 – devarc 2012-04-13 07:16:59

5

有在SQL Server中共有四个解决方案,下面是详细:

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

SQL服务器赞GE跟踪[CTC]

优点

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

缺点

  • 需要启用数据库和EA上CH所需的表
  • 同步跟踪机制
  • 所有表的跟踪数据存储在一个名为 CHANGETABLE一个临时表
  • 无法获得的历史数据也没有给出有关以前 和新的数据准确详细的跟踪列
  • 组合键支持问题
  • 需要主键
  • 只有保持数据WRT操作的当前状态,I =插入, U =更新,d =删除
  • SQL Server用户组 '系统管理员' 只能使CTC

SQL Server的变化数据捕捉[CDC]

优点

  • 此特征提供一个表在启用数据库级别 后,逐个解决方案。
  • 高效&快速异步跟踪机制
  • 可以得到历史数据,还能够提供有关
  • DML触发器不需要在影子表 以前和新的数据准确的细节,如新的表被创建对于每个表,CDC用 前缀'dbo_'和后缀'_CT'。
  • 所有与CDC相关的表&函数将与'cdc' 模式一起引用。
  • 所有CDC相关的存储过程将与 'SYS' 或 'CDC' 的架构

缺点被称为

  • 是谁做出更改的用户的信息不捕获,对于 ,你可能需要创建现有的期望每个要跟踪表 一些额外的列,列是这样的:

    CreatedAt日期时间默认(GETDATE()), CreatedBy为nvarchar(100)默认(SUSER_SNAME()), UpdatedAt日期时间默认(GETDATE()), UpdatedBy为nvarchar(100)默认(SUSER_SNAME())

  • SQL Server代理应为CDC启用,也CDC不能工作 正常,当数据库引擎服务或SQL Server代理 服务的网络服务帐户下运行
  • 需要启用数据库每个所需的表
  • 仅工作在企业版,开发版和数据中心版
  • 需要访问特定数据库
  • SQL Server代理应能够捕获数据的LDF文件
  • 吹扫/截断是不可能的,当启用CDC主表,在影子表 自动清理可以“T被关闭,一旦启用所需的事务日志(LDF文件)
  • Db的的用户群
  • 额外空间‘追踪时的db_owner’或服务器的角色‘系统管理员’只能 使CDC
  • 有限制列中的更改包含荷兰国际集团 XML,稀疏,时间戳,CLOB和BLOB数据类型
  • 当呼叫者没有权限,以查看所述源数据,所述 函数返回错误229

审核跟踪与触发器[通用的解决方案]

优点

  • 可以得到历史数据,也能给出确切的详细介绍 以前和新数据的影子表
  • 列的精心控制WRT的选择,操作[I =插入, U =更新,d =删除]
  • 过程可以由于复杂性而自动化,审计跟踪流程 可以用一些常规或服务来管理。
  • 吹扫/截断以及自动清理,也可以自动

缺点

  • 表的精确副本与一些额外的列被要求作为暗影 表
  • 开发,数据管理和清除的复杂过程
  • 数据存在时性能下降Omes巨大的阴影表中,清除是 要求
  • 考虑到可靠性,安全性和性能方面的所有重要方面,需要很多时间来自动执行该过程。在原生的 解决方案中,DB Engine默认提供。
+3

它只是我,还是你列出了4个选项,然后只描述三个细节? – 2016-04-21 19:35:42