我们知道,SQL Server 2000的Merge Replication支持dynamic filter的功能。如果我们有多个subscriber,每个subscriber只需要维护自己特定的数据,这时候我们只需创建一个publication, 然后利用dynamic filter的功能,把每个subscriber需要的特定数据复制过去。最常用的用于dynamic filter的系统函数是SUSER_SNAME() 和 HOST_NAME(),针对每个subscriber的merge agent连到publisher时,SQL Server会计算出么特定merge agent连接的SUSER_SNAME() 或 HOST_NAME()值,然后根据结果来过滤数据。
直接利用SUSER_SNAME() 或 HOST_NAME()时候,需要table中有相应SUSER_SNAME() 或 HOST_NAME()的值。比如如果我们的publisher server叫shanghai来维护所有的数据,三个subscriber分别叫nanjing, suzhou和hangzhou来维护各自的数据,如果我们希望利用HOST_NAME()把数据复制到三个subscriber, 我们的表中应该有一列来存HOST_NAME()的值,然后我们才能用dynamic filter如”filter_column = host_name()”来过滤数据:
create table orders(orderID int not null, filter_column char(20), Quantity int)
go
insert into orders values(1,’ nanjing ’,100)
insert into orders values(2,’ suzhou ’,200)
insert into orders values(3,’ hangzhou ’,120)
insert into orders values(4,’ hangzhou ’,100)
go
但是,如果我们的表中的数据没有恰好和SUSER_SNAME() 或 HOST_NAME()匹配的,我们该怎样来做dynamic filter呢?
比如下表,只有一个zoneID可以用来区分不同subscriber需要的数据,但是它的值和SUSER_SNAME() 或 HOST_NAME()都不同。
create table orders(orderID int not null, zoneID nvarchar(5), Quantity int)
go
insert into orders values(1,N'1',100)
insert into orders values(2,N'2',200)
insert into orders values(3,N'3',120)
insert into orders values(4,N'3',100)
要为这种数据做dynamic filter, 我们可以利用Merge Agent 的一个参数, hostname, 来实现。SQL Server Books Online没有很好解释该参数的用法。当我们没有为merge agent指定该参数时候,针对merge agent连接 的host_name()函数返回merge agent 所在服务器的计算机名称;当我们为merge agent指定了该参数时候,host_name()函数返回hostname参数指定的价值。
比如,如果我们想把zoneID = N’1’的记录复制到nanjing, 我们仍然可以用”zoneID = host_name()” filter, 只需为nanjing的merge agent添加“-hostname=1”参数即可。
为了添加这个参数,右键单击merge agent, 选择Agent Properties, 选择steps选项页,双击Run agent,然后在Command最后添加”-hostname 1”即可。
关于merge agent的所有可用参数,见MSDN.