使用合并复制,如果订阅者在插入发生时用完某个范围的身份,则订阅者将在插入表时抛出错误,因为发布必须授予更多身份- 并且插入发生在订户。更好的做法是让发布者只是插入的接收者,但在某些环境或情况下,发布者和订阅者都可能发生插入,因此许多人扩展了范围。
我很好奇序列与此处的身份相比如何,因为我找不到任何迹象表明序列像身份字段一样受到合并复制设置的限制。
我相信 Aaron Bertrand 或其他 MVP 在序列方面非常重要,我一直在努力推动我的组织使用它们而不是身份,但这是一段漫长的旅程。
使用合并复制,如果订阅者在插入发生时用完某个范围的身份,则订阅者将在插入表时抛出错误,因为发布必须授予更多身份- 并且插入发生在订户。更好的做法是让发布者只是插入的接收者,但在某些环境或情况下,发布者和订阅者都可能发生插入,因此许多人扩展了范围。
我很好奇序列与此处的身份相比如何,因为我找不到任何迹象表明序列像身份字段一样受到合并复制设置的限制。
我相信 Aaron Bertrand 或其他 MVP 在序列方面非常重要,我一直在努力推动我的组织使用它们而不是身份,但这是一段漫长的旅程。
使用合并复制,必须将身份范围分配给发布者和每个订阅者。标识范围管理可以是手动的或自动的。
正如您已经发现的那样,当一个范围用完时,必须分配一个新的范围。使用自动范围管理,合并代理负责分配新范围,使用手动范围管理,您可以决定应该发生什么。
对于序列,您仍然会遇到同样的问题,不同之处在于没有自动序列范围管理之类的东西,因此您唯一的选择是手动范围分配。(FWIW,身份是通过 SQL Server 2012 及更高版本中的序列实现的)。
我的建议是完全避免身份和序列:它们弊大于利。您是否知道,为了让身份范围分配发生在发布者处,在数据库中插入数据的用户需要成为 db_owner 角色的成员?是的,那太可怕了。
对于合并复制,您无论如何都需要一个唯一标识符 ROWGUIDCOL,那么为什么不将该列用作您的代理键呢?如果您的密钥确实是代理项,那么任何人都应该无法看到或使用它,并且它应该对应用程序完全透明。