我们知道, 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 .