Sql server 2008 r2 CDC同一标识值的多次插入/删除

Sql server 2008 r2 CDC同一标识值的多次插入/删除,sql-server-2008-r2,change-data-capture,Sql Server 2008 R2,Change Data Capture,我有一个表T,其中包含一个设置为标识和主键的ID。我在表上启用了CDC,然后添加了一个我不在乎捕获的XML字段,因此我不再做任何进一步的操作(重新创建捕获表和/或迁移旧的捕获数据) 我现在有一个存储过程,它(除其他外)只更新表T中新创建的字段(没有其他字段)。我注意到CDC没有记录更新(操作=3,然后是操作=4),而是记录删除(操作=1),然后是插入(操作=2),所有字段都是相同的(当然,因为它们都没有更新) 实际上,我注意到了这一点,因为我多次插入和/或删除了相同的标识值,这是不可能的(除非启

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

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

实际上,我注意到了这一点,因为我多次插入和/或删除了相同的标识值,这是不可能的(除非启用了identity_insert,否则不可能)

为什么CDC记录操作=1而不是3,操作=2而不是4?
这是在任何地方记录的还是一个bug?

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

为了让SQL理解这一点而不违反唯一的COSNTAINT,它将删除该行并重新插入该行(使用“更新”)

关于这方面的更多信息。这不是问题或缺陷。这就是SQL的工作方式,CDC在看到它时会无辜地记录它。请记住,CDC只是一个订阅者,在事情发生时进行复制

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

一些很棒的文章: Bounded Update是一个术语,用于描述发布服务器将在订阅服务器上复制为删除/插入对的某些类型的更新语句。我们对更改作为唯一索引或约束一部分的列的每个基于集合的更新执行有界更新。换句话说,如果UPDATE语句涉及多行并修改具有唯一约束的列,则UPDATE语句将作为DELETE/INSERT对发送给订阅服务器


非常有趣,但它实际上并没有回答我的问题。在我的例子中,我只更新不属于任何唯一约束的XML字段。