从标记为复制的SQL表中删除行

时间:2008-09-17 13:55:49

标签: sql-server sql-server-2000 replication

我错误地删除了合并复制中使用的MS SQL 2000表中的所有行(该表位于发布者上)。然后,我通过使用DTS操作从备份数据库中检索行并重新填充表来复杂化该问题。

这造成了以下问题: 删除操作在客户端上标记要删除的行,但DTS操作会绕过复制触发器,因此导入的行不会标记为在订阅者上插入。实际上,订阅者会丢失数据,尽管它在发布者身上。

所以我认为“不用担心”我会再次删除行,然后通过insert语句正确添加它们,然后将它们标记为插入订阅者。

这是我的问题: 我无法删除DTSed行,因为我得到了“无法在对象'MSmerge_tombstone'中插入具有唯一索引'uc1MSmerge_tombstone'的重复键行。”错误。我想要做的是以某种方式删除表中的行,绕过合并复制触发器。这可能吗?我不想删除和重做复制,因为订阅者是50多个Windows移动设备。

编辑:我已经尝试过Truncate Table命令。这会出现以下错误“无法截断表xxxx,因为它是为复制而发布的”

6 个答案:

答案 0 :(得分:2)

你试过截断表吗?

答案 1 :(得分:2)

如果您需要插入的行具有相同的ID,则可能必须截断表并将ID字段重置为0。如果没有,只需截断,它应该没问题。

答案 2 :(得分:1)

您还可以考虑暂时删除唯一索引,并在完成后将其添加回来。

答案 3 :(得分:1)

查看sp_mergedummyupdate

答案 4 :(得分:0)

创建第二张表是一种选择吗?您可以创建第二个表,使用所需数据填充它,添加约束/索引,然后删除第一个表并重命名第二个表。这应该为您提供具有正确密钥的数据......并且它应该都包含允许逐步复制的SQL语句。它可能不是最好的表现......并且肯定会带来一些风险。

我没有在复制的环境中尝试过第一手......但它至少值得一试。

答案 5 :(得分:0)

感谢您的提示......我最终找到了解决方案:

我从表中删除了合并删除触发器 删除了DTSed行
重新创建合并删除触发器
使用insert语句正确添加了我的行。

我有点担心摆弄合并触发器但是出现的每件事都能正常工作。