SQL Server merge replication: 巧用Merge Agent的hostname参数创建dyna
发表于:2007-07-02来源:作者:点击数:
标签:
我们知道,SQL Server 2000的Merge Replication支持dynamic filter的功能。如果我们有多个subscriber,每个subscriber只需要维护自己特定的数据,这时候我们只需创建一个publication, 然后利用dynamic filter的功能,把每个subscriber需要的特定数据复制过去
我们知道,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), Qu
antity 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.
原文转自:http://www.ltesting.net