sql-server-2008-r2 - CDC 同一身份值的多次插入/删除

标签 sql-server-2008-r2 change-data-capture

我有一个表 T,其中包含设置为身份和主键的 ID。我在表上启用了 CDC,然后添加了一个我不关心捕获的 XML 字段,因此我没有执行任何进一步操作(重新创建捕获表和/或迁移旧的捕获数据)。

我现在有一个存储过程(除其他外)仅更新表 T 中新创建的字段(没有其他字段)。我注意到,CDC 不是记录更新(操作 = 3 后跟操作 = 4),而是记录更新记录删除(操作=1)后跟插入(操作=2)并且所有字段都是相同的(当然因为它们都没有更新)

我实际上注意到了这一点,因为我多次插入和/或删除了相同的身份值,这是不可能的(除非identity_insert打开,但事实并非如此)

为什么CDC记录操作=1而不是3,操作=2而不是4? 这是否记录在任何地方或者是一个错误?

最佳答案

您看到删除/插入对(操作编号 1/2)而不是更新对(3/4)的原因是因为您正在更新一组数据,该数据对您的数据也有唯一的约束专栏。

为了让 SQL 在不违反唯一约束条件的情况下理解这一点,它会删除该行并重新插入它(使用“更新”)。

有关此的更多信息。这不是问题或缺陷。这就是 SQL 的工作方式,CDC 会按照它所看到的方式无辜地记录它。请记住,CDC 只是订阅者,并会在事件发生时进行复制。

如果您需要查看更新,您可能需要查找 1/2“对”,而不仅仅是操作代码 3/4。

一些很棒的文章: 有界更新是一个术语,用于描述来自发布者的某些类型的 UPDATE 语句,这些语句将在订阅者上复制为 DELETE/INSERT 对。我们对每个基于集合的更新执行有界更新,该更新更改属于唯一索引或约束的列。换句话说,如果 UPDATE 语句涉及多行并修改具有任何 UNIQUE 约束的列,则 UPDATE 语句将作为 DELETE/INSERT 对发送到订阅者... read more here

https://support.microsoft.com/en-us/kb/238254

关于sql-server-2008-r2 - CDC 同一身份值的多次插入/删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932661/

相关文章:

sql - 我可以与 HAVING 子句一起使用的第一个聚合函数

sql-server - CDC 已启用,但未填充 cdc.dbo<table-name>_CT 表

sql-server-2008 - 更改数据捕获或更改跟踪 - 与传统审计跟踪表相同吗?

c# - 如何在 C# 中比较 SQL Server CDC LSN 值?

SQL Server 2008 R2 生成脚本时出错

sql-server - 通过触发器使用sql server 2008插入或更新时计算输入值的哈希值

sql-server - 获取每个 ID 和状态的前 3 个值

sql - select中子查询语句的where子句