可能删除/插入对作为复制 UPDATE 语句


概要


如果任何列的唯一约束的一部分被更新,则 SQL Server 作为"延迟更新",这意味着删除一对为实现更新 /插入操作。此"延迟的更新"会导致复制发送一对删除/插入语句添加到订阅服务器。也有可能会导致延迟的更新的其他情形。因此,您在您的更新触发器或在订阅服务器上的自定义存储的过程中实现的任何业务逻辑应该也包含在删除/插入触发器或自定义存储的过程。

详细信息


在事务复制中的默认行为是使用
插入更新删除的自定义存储过程来将更改在订阅服务器上应用。

在发布服务器的INSERT语句将应用于订阅服务器通过插入存储过程调用。与此类似,删除语句应用通过删除存储过程调用。

但是,当"延迟更新"作为执行UPDATE语句时,日志读取器代理程序将删除插入存储过程调用将应用于订阅服务器,而不是更新存储在分发数据库中过程调用。例如,假设您有发布表,名为 TABLE1,这三个列:
  • col1 int
  • 第 2 列 int
  • col3 varchar(30).
通过主键约束的 col1 上定义对表 1 的唯一约束。假定您有一个记录 (1,1,达拉斯)。

当您执行以下代码:
UPDATE TABLE1 set col1 = 3 where col2 = 'Dallas'
UPDATE语句由 SQL Server删除一对 / 由于插入语句更新第 1 列,有定义一个唯一索引。因此,日志读取器将置于一对删除/插入调用在分发数据库中。这可能会影响中的触发器或自定义存储的过程在订阅服务器上存在的任何业务逻辑。应该采用中删除插入触发器或存储的过程来处理这种情况下的其他业务逻辑。

如果您更喜欢使用一个逻辑,并且要作为删除复制的所有更新命令 /插入对,您可以启用的跟踪标记此 Microsoft 知识库文章中所述:
160181 INF: 跟踪标志复制删除/插入对形式的更新
此外,如果在出版物中使用水平筛选和更新的行不能满足筛选器条件,只能删除过程调用将被发送到订阅服务器。如果以前更新的行不符合筛选条件,但更新后符合条件,只能插入过程调用发送完成整个复制过程。


在前面的示例中,假定您还具有在表 1 中定义的水平筛选: 其中 col2 = 达拉斯。如果您执行以下代码:
UPDATE table1 set col2 = 'New York' where col1 = 3
日志读取器代理程序仅将删除存储过程调用应用到订阅服务器,因为已更新的行不满足水平筛选条件。

现在,如果您执行以下代码:
UPDATE table1 set col2 = 'Dallas' where col1 = 3
日志读取器生成仅插入存储过程调用,因为该行没有以前满足筛选器条件。

虽然在发布服务器上执行更新操作,在订阅服务器上应用适当的命令。

参考资料


对于 SQL Server 2000 Service Pack 1 或更高版本,请参阅以下文章 Microsoft 知识库中相应的文章:
302341 INF: 要启用单一实例更新为事务复制的新跟踪标记