默认选项Drop existing object and create a new one是人们非常常用的。但它们通常也不需要复制其表的主键和外键,因为您不会向订阅服务器端的这些表写入任何数据。因此,您不需要在订阅服务器端进行此类数据一致性检查,因为它已经在发布服务器端的源处进行了处理。
您可能不想使用该选项的原因是,如果您对订阅服务器上的复制表进行任何架构更改,例如自定义索引、触发器、更改跟踪功能(例如临时表或 CDC)等。那么您将有编写额外的代码来自动管理删除/将这些东西放回原位,每当重新初始化发生时。在这种情况下,Truncate all data in the existing object对于您的用例来说,这可能是更好的选择。
没有单一正确的方法,它只取决于您的用例。
默认选项
Drop existing object and create a new one
是人们非常常用的。但它们通常也不需要复制其表的主键和外键,因为您不会向订阅服务器端的这些表写入任何数据。因此,您不需要在订阅服务器端进行此类数据一致性检查,因为它已经在发布服务器端的源处进行了处理。您可能不想使用该选项的原因是,如果您对订阅服务器上的复制表进行任何架构更改,例如自定义索引、触发器、更改跟踪功能(例如临时表或 CDC)等。那么您将有编写额外的代码来自动管理删除/将这些东西放回原位,每当重新初始化发生时。在这种情况下,
Truncate all data in the existing object
对于您的用例来说,这可能是更好的选择。但该选项也有缺点。如果该选项设置为仅截断,则发布服务器上的某些架构更改将破坏您的复制拓扑。例如,如果将新列添加到发布服务器中表的中间,则需要删除并重新创建订阅服务器中的表。选择仅截断选项后,您的复制拓扑将出错并停止同步数据。(此特定场景假设您没有对正在复制的文章使用列过滤器。)
我的建议是在可能的情况下坚持使用默认值
Drop existing object and create a new one
(并且不要复制主键或外键),并且只有Truncate all data in the existing object
在该文章有异常情况且无法处理的情况下才将其切换到默认值。