首页 > 解决方案 > SQL 复制错误:“在订阅者处未找到该行”但指向另一个发布的表

问题描述

我在复制监视器中收到以下错误:

对主键 = 的表 '[dgv].[POSCustomer]' 应用复制的 UPDATE 命令时,在订阅服务器上找不到该行

该错误实际上与缺少的行无关,而是表的架构说dgv.

产生错误的发布应该只复制到[ppv].[POSCustomer],甚至不应该知道[dgv].[POSCustomer]。只有在交付初始快照后创建的行才会受到影响。

的背景:

PPV我正在为 3 个本地数据库、DGVPAC单个 Azure SQL 数据库设置事务复制。

这三个数据库属于不同的法律实体,位于两个不同的服务器(PPV一个上DGVPAC另一个上),并且具有相同的架构。

每个具有相同名称的表dbs都设置为要复制。

为了在目标数据库中区分它们,我使用它们的源数据库名称将它们放入三个不同的模式中,即ppv.POSCustomer, dgv.POSCustomer, pac.POSCustomer

这是通过更改Publication properties -> Articles -> Article properties -> Destination对象所有者中的设置来完成的。

初始快照交付没有问题;但是,一段时间后,row was not found复制监视器中开始出现。

我尝试重新初始化订阅几次,但在交付快照后错误不断出现。

快照交付后创建的所有行都会受到影响。

数据库彼此完全隔离,没有跨数据库查询,没有存储过程,没有触发器说记录PPV.dbo.POSCustomer应该在 中更新DGV.dbo.POSCustomer,所以我不知道为什么会发生这个错误。

我曾经sp_browsereplcmd跟踪生成错误的命令,这导致我:

{CALL [sp_MSupd_dboPOSCustomer] (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2019-05-14 00:00 :00.000,,27280000.0000,10,,,,,,,,,,,,2019-05-14 18:30:04.000,,,,,,,,,,,,,,,,,,,,N 'vinhn4-00001395',0x00000000d000080000)}

我不明白,这sp不是我们POS应用程序的一部分。

我怎样才能让这个错误消失?手动插入缺失的行将不起作用,因为所有新行都会受到影响。打开 -skiperrors 不是一个选项。复制到不同的目标数据库之前已经成功完成,但是使用 Azure SQL 设置跨数据库查询是如此痛苦,我宁愿避免 \ 如果可能的话。

标签: sqlsql-servertransactional-replication

解决方案


推荐阅读