在弹出来的Add Filter这个页面,在左边的栏里你可以到表中的字段都罗列出来了,双击CityId列将它移到右边的Fileter statement,增加一个条件像CityId=1这样的,这样的话就会减小订阅用户同步数据的数量,当然这里的值你必须定义一个常量,因此这个叫做Static Filter(静态查询).
在我们的应用中表里的数据有几百万条是一件很正常的事,但有时候设备所需要的数据却仅仅是这几百万条中的几千条,这个时候静态过滤就派上它的用场了。我们继续,先将CityId=1删除掉因为我们有更重要的条件要应用。
如果你想减小客户端同步数据的数量,举个例子,就想我们这里的应用一样,每个用户只需同步他相应城市的数据,我们有字段CityId可以做到这个过滤,但我们不能用静态过滤,因为那只能过滤到一个城市。其实这个时候我们有个方法那就是用Parameterized Filter(参数查询).这里要求使用到SQL SERVER的HOST_NAME()这个函数来实现这个过滤,只需将Replication对象的属性设置成HOST_NAME()所对应的值就可以了。你似乎可以写成下面这样的条件:
WHERE [CityId]
=
CONVERT(
int
,HOST_NAME())
不过很不幸的是,这样子的结果是无法创建 Publication,因为 HOST_NAME()的值是无法强制转换成Integer类型的。不过你可以这样写:
CONVERT(nchar,CityId)
=
HOST_NAME()
其实解决这个问题也不难,你可以执行 sp_changemergearticle存储过程来替换下面的条件
WHERE [CityId]
=
CONVERT(
int
,HOST_NAME())
整个的执行过程如下所示:
USE [ParkSurvey]
EXEC sp_changemergearticle
@publication = ' ParkSurveyPublication ' ,
@article = ' Cities ' ,
@property = ' subset_filterclause ' ,
@value = ' CityId=CONVERT(int,HOST_NAME()) ' ,
@force_invalidate_snapshot = 1 ,
@force_reinit_subscription = 1 ;
GO
EXEC sp_changemergearticle
@publication = ' ParkSurveyPublication ' ,
@article = ' Cities ' ,
@property = ' subset_filterclause ' ,
@value = ' CityId=CONVERT(int,HOST_NAME()) ' ,
@force_invalidate_snapshot = 1 ,
@force_reinit_subscription = 1 ;
GO
这样做的结果是新建一个快照文件夹,但性能会比上面的好。
最后我们来看看 Add Filter页面中底部的单选按钮,对于每一张建立参数查询的表来说,你既不能在各个订阅者的 HOSTNAME的值是一样的时候选择第一个按钮,也不能在各个订阅者的 HOSTNAME 的值不一样时选择第二个按钮,这很重要因为这样子会报错。如果每个订阅者的 HOSTNAME的值是唯一的值的时候你应该选择第二个按钮。因此所有的静态查询你都必须选择第一个按钮让每一行的数据都发送给每个订阅者。点击 OK,一个有查询条件的表就显示在 Filter Table Rows页面上了。
好了,一个有同步参数的表就被建立了,下面我要教你如何与另外张表进行关联。在我们的例子里面,Cities表只让订阅者同步订阅者所对应的城市,但如果订阅者也想查看Parks表里的数据的话,这个就不能够满足我们的需求了。这里CityId是Parks的外键,我们可以扩展Cities表中的 HOSTNAME查询条件,选择Cities,点击 Add按钮,然后选择 Add Join to Extend the Selected Filter..如下图所示的。
Add Join菜单会列出你可以关联的所有的表
这里,我们选择Parks做为我们要去关联的表。
在我们的例子中,左边 Filtered table column显示的是显示的主表的列,右边 Joined table column显示的是想要与主表关联的列。在下面的预览文本框中你可以看到主表与它的外键是怎么关联起来的。你可以点击选择你所需要关联的列,当然你也可以手动创建它们当你们点击 Write the Join statement manually.这里我们以一对多的关系关联Cities和Parks的CityId.因为CityId在各自的表中都是为主键,因此我们将下面的 Unique key复选框选上。(这样子能改进同步的性能,也只有当关联的字段是主键时才有效),然后我们点击 OK。
在 Filter Table Rows就能够显示我们加了同步查询条件的表跟它的关联表了,点击 Next.
在 Snapshot Agent页面将会提示你是否立即建立快照,在这里你也可以点击 change来修改快照代理的频率,在这个例子中我们选择14天,然后我们点击 Next.
在 Agent Security页面,我们要选择快照代理线程运行在哪个账户底下,所以我们选择点击 Security Settings.
接下来的是 Snapshot Agent Security 页面,选择 Run under the following Windows account单选框,然后输入 SYNCDOMAIN\syncuser在 Process account 文本框中,在密码跟确认密码都输入P@ssw0rd,细心的您一定会发现,这个用户就是我们创建的域用户,在确认 By impersonating the process account单选按钮已经被选上后就可以点击 OK了。
回到 Agent Security这个页面, Snapshot Agent里就有我们刚刚所加入的 syncuser用户了。然后我们点击 Next.
在 Wizard Actions页面,我们把两个复选框的内容都选上,然后点击 Next.
在 Script File Properties页面,这个页面让我们选择脚本的存放位置,我们保持默认的选择然后点击 Next.
在最后的 Complete the Wizard页面,我们在 Publication name那输入ParkSurveryPublication做为我们发布复制的名称,当我们确认我们填入的信息跟下面显示的信息一致时我们就可以点击 Finish来完成这个 Publication了.
在 Creating Publication 这个页面我们就可以看到这个 Publication的完成情况了,如果都显示 success的话我们就可以点击 Close来关闭它,这样一个 Publication就被建立起来了。