mergereplication:巧用MergeAgent的hostname参数创建dynamicfilter

来源:互联网 发布:网络电视怎么找电视台 编辑:程序博客网 时间:2024/06/05 12:47
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

我们知道,SQLServer2000的MergeReplication支持dynamicfilter的功能。如果我们有多个subscriber,每个subscriber只需要维护自己特定的数据,这时候我们只需创建一个publication,然后利用dynamicfilter的功能,把每个subscriber需要的特定数据复制过去。最常用的用于dynamicfilter的系统函数是SUSER_SNAME()和HOST_NAME(),针对每个subscriber的mergeagent连到publisher时,SQLServer会计算出么特定mergeagent连接的SUSER_SNAME()或HOST_NAME()值,然后根据结果来过滤数据。

 

直接利用SUSER_SNAME()或HOST_NAME()时候,需要table中有相应SUSER_SNAME()或HOST_NAME()的值。比如如果我们的publisherserver叫shanghai来维护所有的数据,三个subscriber分别叫nanjing,suzhou和hangzhou来维护各自的数据,如果我们希望利用HOST_NAME()把数据复制到三个subscriber,我们的表中应该有一列来存HOST_NAME()的值,然后我们才能用dynamicfilter如”filter_column=host_name()”来过滤数据:

 

createtableorders(orderIDintnotnull,filter_columnchar(20),Quantityint)

go

insertintoordersvalues(1,’nanjing’,100)

insertintoordersvalues(2,’suzhou’,200)

insertintoordersvalues(3,’hangzhou’,120)

insertintoordersvalues(4,’hangzhou’,100)

go

 

但是,如果我们的表中的数据没有恰好和SUSER_SNAME()或HOST_NAME()匹配的,我们该怎样来做dynamicfilter呢?

 

比如下表,只有一个zoneID可以用来区分不同subscriber需要的数据,但是它的值和SUSER_SNAME()或HOST_NAME()都不同。

 

createtableorders(orderIDintnotnull,zoneIDnvarchar(5),Quantityint)

go

insertintoordersvalues(1,N'1',100)

insertintoordersvalues(2,N'2',200)

insertintoordersvalues(3,N'3',120)

insertintoordersvalues(4,N'3',100)

 

要为这种数据做dynamicfilter,我们可以利用MergeAgent的一个参数,hostname,来实现。SQLServerBooksOnline没有很好解释该参数的用法。当我们没有为mergeagent指定该参数时候,针对mergeagent连接的host_name()函数返回mergeagent所在服务器的计算机名称;当我们为mergeagent指定了该参数时候,host_name()函数返回hostname参数指定的价值。

 

比如,如果我们想把zoneID=N’1’的记录复制到nanjing,我们仍然可以用”zoneID=host_name()”filter,只需为nanjing的mergeagent添加“-hostname=1”参数即可。

 

为了添加这个参数,右键单击mergeagent,选择AgentProperties,选择steps选项页,双击Runagent,然后在Command最后添加”-hostname1”即可。

 





关于mergeagent的所有可用参数,见MSDN.
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>