2

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

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

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

为什么 CDC 记录 operation=1 而不是 3 和 operation=2 而不是 4?这是记录在任何地方还是一个错误?

4

1 回答 1

3

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

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

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

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

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

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

于 2016-09-30T21:03:09.577 回答