指定合并项目的处理顺序

从 Microsoft SQL Server 2005 开始便可以覆盖合并发布的项目默认处理顺序。例如,如果通过触发器定义引用完整性而这些触发器又必须按某顺序激发,以上操作就会很有用。

指定项目的处理顺序

如何确定处理顺序

合并同步过程中,项目在默认情况下按照对象间相关性要求的顺序处理,包括基表中定义的声明性引用完整性 (DRI) 约束。 处理涉及将更改枚举到表,然后应用这些更改。 若不存在 DRI,但在表项目之间存在联接筛选器或逻辑记录,则就以筛选器和逻辑记录要求的顺序处理项目。 未通过 DRI、联接筛选器、逻辑记录或其他相关性与任何其他项目关联的项目,根据 sysmergearticles (Transact-SQL) 系统表中的项目别名进行处理。

考虑一个包含 SalesOrderHeader 表和 SalesOrderDetail 表的发布,并且 SalesOrderHeader 表中具有主键列 SalesOrderIDSalesOrderDetail 表中具有对应的外键列 SalesOrderID。 同步过程中,合并复制通过在 SalesOrderDetail 中插入相关行之前先在 SalesOrderHeader 中插入某些新行的方式来防止违反外键。 同样,要先从 SalesOrderDetail 中删除行,然后才从 SalesOrderHeader 中删除相关行。

但是,在某些应用程序中,通过数据库触发器(或者在应用程序级,而不是通过 DRI)强制引用完整性。 考虑上述具有引用完整性的发布(而不是 DRI),SalesOrderDetail 表可能会有一个插入触发器以确保在允许插入之前 SalesOrderHeader 表中存在相关行。 SalesOrderHeader 可能有一个删除触发器以确保在允许删除之前 SalesOrderDetail 中没有相关行。 由于合并复制无法在激发触发器之前确定触发器的结果,所以在确定项目的处理顺序时,合并复制不会考虑触发器。 同样,复制也不会考虑在应用程序级定义的约束。

通过触发器或在应用程序级维护引用完整性时,您应该指定项目应处理的顺序。 在有关触发器的示例中,需要指定在处理 SalesOrderDetail 之前先处理 SalesOrderHeader 表,因为项目排序是根据插入顺序进行的。 合并复制会自动反转删除顺序。 不进行项目排序也不会导致合并复制失败,因为即使违反约束,合并代理也会继续处理项目;然后它会在处理完其他项目后重试所有过去失败的操作。 指定项目顺序仅避免重试以及其他与其相关联的处理。 如果指定了错误顺序(比如,导致详细记录在标题记录前处理的顺序),合并复制会重试处理直到成功。