我在WPF应用中使用CDC。效果很好,但我发现了三个问题:
无论如何,CDC是非常有用的机制,它可以帮助我跟踪数据库的所有变化。
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开发,数据管理和清除
- 当影子表中的数据变得很大时,性能会受到影响,清除就是这样
需要
- 考虑到所有重要因素,需要花费很多时间来自动化流程
可靠性,安全性和性能方面。哪个是原生的
解决方案,默认情况下提供数据库引擎。