合并复制的概述 也许读者对下面的实际例子并不陌生,在某一大型企业的分销系统中,销售经理或一些销售骨干人员经常要外出处理业务,将签订的合同通过手边的笔记本电脑传递到总部销售信息数据库。在这一例子中有两个主要的特;征任何销售经理和销售骨干都可以修改销售信息数据库;只有在进行数据传递时才将源数据库与目标数据库相连。在sql server 中,合并复制为这一情况提供了较好的解决方案。
可以看出尽管最后所有的数据库都有相同的结果集,但这个结果是在多个节点共同参与下形成的,是多个修改合并到目标数据库的结果。因此合并复制并不维护事务的一致。 与创建快照复制和事务复制出版物相比,当创建一个合并出版物时,sql server 会对数据库以及出版表进行以下处理(见图16-54):
(1) sql server 把出版表中的每一行都加上一个标识列,这样在表的多个拷贝间能惟一标识出该行。如果基本表上已存在具有rowguidcol 属性的标识列,则 sql server 将自动把其作为复制表的行标识,如果没有,则或在创建出版物过程中这些表被激活时,或在sql server agent 第一次为该出版物提供服务时, sql server 将向表中添加一个具有rowguidcol 属性的rowguid。
(2) sql server 添加一个触发器来跟踪每一行或列数据的变化,并把捕捉到的变化存储到几个系统表中,或在创建出版物过程中复制表被激活时,或在sql server agent 第一次为出版物提供服务时,将创建这些跟踪触发器。 (3) sql server 把用户跟踪的系统表添加到数据库,来执行冲突的检测,解决和记录。msmerger_contents msmerger_tombstone 系统表用来跟踪对出版物中数据的update、 delete、 inserts 操作。