基本问题是这样的:
订阅者已使用事务复制成功从发布者复制了一行。现在,我们如何跟踪上次成功复制此行的时间?

一位朋友建议使用以下解决方案,用于他的SQL Server 2000:
1)添加日期时间列。
2)更改复制存储过程以更新datetime列(!)。

步骤#2引发了我内心的各种警告,所以我想在这种情况下是否有更好的SQL Server 2005解决方案,在我详细介绍他的解决方案之前。

有帮助吗?

解决方案

我会完全按照朋友的建议行事。这样,只有对复制过程的调用才会更新时间戳。

这种方法的问题是你需要一个写锁,但我没有看到任何其他实用的方法。

否则你可以使用在你获取行时触发的触发器(不要引用我,我很少使用触发器),但这似乎不对(你可能以误报结束)

其他提示

几周前我遇到了这个确切的问题,试图找到最近发生变化的记录。

创建一个新列并将数据类型设置为TIMESTAMP。更新行时,SS2005会自动更新此类型。唯一的问题是这个'时间戳'与日期或时间没有任何关系,它只是一个数字反映了该行的最后一次成功更新(任何更新,而不仅仅是通过复制)。如果这就是你所需要的,那么你应该没事。

如果您需要最后一次复制更新,事情可能会有点棘手,您需要亲自动手触发和存储过程。

http://www.sqlteam.com/article/timestamps -VS-日期时间数据类型

希望有所帮助〜

如果您正在使用事务复制,为什么不记录主数据更新的时间并认为它在下一个复制作业上被复制到其他数据库?

@Philippe:该方法的主要问题是由于网络连接不良,复制可能需要一段时间才能到达某些更远程的数据库。因此,主记录的更新时间不会反映实际在远程数据库中复制的记录的时间。

无论如何,我已经测试了我朋友的方法,并且它符合我们的要求。

如果有人想要这样做,这里有一个重要的注意事项:小心初始化订阅和未来的架构更改。

就我而言,我们决定初始化快照手动,以便在订阅者数据库中保留添加的日期时间列。另一种可能的方法可能是允许初始化,但修改现有的存储过程以忽略复制添加的datetime列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top