我有一个表T,其中包含一个设置为身份和主键的ID。我已经在桌面上启用了CDC,然后添加了一个我不关心捕获的XML字段,因此我没有做任何进一步的操作(重新创建捕获表和/或迁移旧的捕获数据)。
我现在有一个存储过程(除其他外)只更新表T中新创建的字段(没有其他字段)。我注意到,而不是记录更新(操作= 3后跟操作= 4),CDC记录删除(操作= 1),然后是插入(操作= 2),所有字段都相同(当然因为没有更新)
我实际上注意到了这一点,因为我有多次插入和/或删除相同的标识值,这是不可能的(除非identity_insert打开,这不是)
为什么CDC记录操作= 1而不是3而操作= 2而不是4? 这是在任何地方记录的还是一个错误?
答案 0 :(得分:2)
您看到删除/插入对(操作编号1/2)而不是更新对(3/4)的原因是因为您正在更新一组“数据”,这些数据对您的数据也有唯一约束列。
为了让SQL理解这个没有违反独特的cosntraint,它会删除该行并重新插入它(使用“update”)。
有关此内容的更多信息。它不是问题或缺陷。它是SQL工作的方式,CDC无辜地记录它。请记住,CDC只是一个订阅者,并在事情发生时复制它们。
如果您需要查看更新,则可能需要查找1/2“对”,而不仅仅是操作代码3/4。
一些很棒的文章: 有界更新是用于描述发布者的某些类型的UPDATE语句的术语,它将作为订阅者上的DELETE / INSERT对进行复制。我们对每个基于集合的更新执行有限更新,该更新会更改作为唯一索引或约束的一部分的列。换句话说,如果UPDATE语句触及多个行并修改具有任何UNIQUE约束的列,则UPDATE语句将作为DELETE / INSERT对发送给订阅者... read more here