我正在调试我的数据库,我发现在删除语句上复制失败。
我查看源表和目标表,它们是相同的。所以有人从源中删除了一行,然后将其放回原处。(删除失败是因为 FK 引用了一些我不想级联删除的手动数据。)
有没有办法找出它试图删除的行的PK?
(所有复制监视器都会告诉我导致删除语句失败的 FK 的名称。)
我正在调试我的数据库,我发现在删除语句上复制失败。
我查看源表和目标表,它们是相同的。所以有人从源中删除了一行,然后将其放回原处。(删除失败是因为 FK 引用了一些我不想级联删除的手动数据。)
有没有办法找出它试图删除的行的PK?
(所有复制监视器都会告诉我导致删除语句失败的 FK 的名称。)
有几种方法。我会告诉你一个简单的(因为我很懒)。跟踪您的订阅者是否执行不成功的存储过程。你应该得到一个名为 sp_MSdel_table (其中 table 是你的表的名称)之类的东西的命中。该过程的参数将是它试图删除的记录的主键。
简单的方法二是修改前面方法中确定的存储过程,不要对丢失的行生气(毕竟,它只是要删除它,所以它现在丢失的事实并不是什么大问题)。您可能还有其他不收敛的问题,但至少您可以让您的命令再次流动。(编辑:刚刚注意到您的问题的原因。我建议在订阅者处不要有 FK 约束,因为应该在发布者处处理任何引用完整性。当 SQL 不必检查时,我会让您的复制更快每次执行适用的插入、更新或删除时)。
第一个困难的方法是查看复制监视器中的错误,并注意指定了事务 id 和序列号。然后,您使用分发数据库中的存储过程来获取正在执行的命令的文本。
第二个困难的方法是使用 tablediff.exe 来区分表,比如 RedGate 的 SQLCompare,或者在链接服务器上滚动你自己的连接以显示差异。把它放在你的后口袋里,以防万一上面提到的其他一次一行的方法不适合你。我对这类事情的门槛大约是三。YMMV。