Sql server 如何查找下一个SQL Server复制语句

Sql server 如何查找下一个SQL Server复制语句,sql-server,sql-server-2008-r2,replication,Sql Server,Sql Server 2008 R2,Replication,我正在调试数据库,发现delete语句的复制失败 我查看源表和目标表,它们是相同的。所以有人从源代码中删除了一行,然后将其放回。(删除失败,因为FK引用了一些我不想级联删除的手动数据。) 有没有办法找出它试图删除的行的主键 (复制监视器将告诉我导致delete语句失败的FK的名称。)有几种方法。我告诉你最简单的(因为我很懒)。在订阅服务器上跟踪未成功执行的存储过程。您应该会找到一个名为sp_MSdel_table(其中table是您的表的名称)的表。该过程的参数将是它试图删除的记录的主键 第二个

我正在调试数据库,发现delete语句的复制失败

我查看源表和目标表,它们是相同的。所以有人从源代码中删除了一行,然后将其放回。(删除失败,因为FK引用了一些我不想级联删除的手动数据。)

有没有办法找出它试图删除的行的主键


(复制监视器将告诉我导致delete语句失败的FK的名称。)

有几种方法。我告诉你最简单的(因为我很懒)。在订阅服务器上跟踪未成功执行的存储过程。您应该会找到一个名为sp_MSdel_table(其中table是您的表的名称)的表。该过程的参数将是它试图删除的记录的主键

第二个简单的方法是修改前一个方法中标识的存储过程,使其不会对丢失的行生气(毕竟,它只是将其删除,所以它现在丢失的事实没有什么大不了的)。您可能会遇到其他非收敛问题,但至少可以让您的命令重新运行。(编辑:刚刚注意到问题的原因。我建议订阅服务器上不要有FK约束,因为任何引用完整性都应该在发布服务器上处理。如果SQL不必每次都检查是否执行了适用的插入、更新或删除操作,我将加快复制速度)

第一个难题是查看复制监视器中的错误,注意指定了事务id和序列号。然后使用分发数据库中的存储过程获取正在执行的命令的文本

第二个困难的方法是使用tablediff.exe(类似于RedGate的SQLCompare)对表进行差异化,或者在链接服务器上滚动您自己的连接以显示差异。把这个放在你的后口袋里,以防上面提到的其他一排一排的方法不适合你。我对这类事情的门槛大约是三。YMMV