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