日期:2014-05-17  浏览次数:20457 次

如何使多台SQL服务器A,B,C的,相同名称,相同结构的表my_table的数据,按指定要求同步更新。
我们公司有A,B,C,...多个分公司,每个分公司都有自已的SQL服务器,目前通过VPN联到一个局域网内。
A是总公司的服务器。
总公司在下订单时,都存盘在A服务器中,当然在下订单时,先会指定分公司的名称B,C,D,E....

当一个订单指定公司名为A时,我只需要存盘在A数据库中,不需要再转存到其它几个数据库中去;
当一个订单指定公司名为B时,我除了需要存盘在A数据库中外,还需要再转存到B数据库中去;
当一个订单指定公司名为C时,我除了需要存盘在A数据库中外,还需要再转存到C数据库中去;
... ...

每个分公司在接到订单之后,都只在自已的SQL服务器中操作了,不需要再连线总公司的SQL数据库。


A服务器的IP是: 192.168.0.201, 数据库名称是:AA_data,表名称:my_table(id_no, mingch, shul, danj, bb)
B服务器的IP是: 192.168.0.152, 数据库名称是:BB_data,表名称:my_table(id_no, mingch, shul, danj, bb)
C服务器的IP是: 192.168.0.254, 数据库名称是:CC_data,表名称:my_table(id_no, mingch, shul, danj, bb)

ABC三台SQL服务器上,有相同名称的表my_table,表字段结构完全相同, id_no是表的主键值。


现在的需求是:

当用户给A服务器,AA_data.my_table添加/修改/删除一条记录时,我想在A服务器上执行一个存储过程PR_aa_to_bb, 给B服务器BB_data.my_table表中,也自动添加/修改/删除相同的记录。

也就是说,我希望在A服务器上,通过调用存储过程PR_aa_to_bb来连通B服务器,从而实现将指定的记录,同步更新到B服务器上。

请问这个存储过程PR_aa_to_bb要如何写?



如果数据库AA_data同BB_data在同一台服务器192.168.0.201上的话,我测试使用如下语句可以实现我的需求。
CREATE PROCEDURE [PR_aa_to_bb] @table_name char(10), @field_id char(10), @lc_add1_edit2_del3 char(1)
AS
begin
  --@table_name ID字段名称;@field_id ID号; @lc_add1_edit2_del3 1新增2修改3删除
  if @table_name = 'my_table'
  begin
  if @lc_add1_edit2_del3 = '1'
  begin
  INSERT INTO BB_data.dbo.my_table(id_no, mingch, shul, danj, bb)
  select id_no, mingch, shul, danj, bb
  from AA_data.dbo.my_table a 
  where id_no = rtrim(ltrim(@field_id))
  end
  else
  if @lc_add1_edit2_del3 = '2'
  begin
  update b SET mingch = a.mingch, shul = a.shul, danj = a.danj, bb = a.bb
  from AA_data.dbo.my_table a
  left outer join BB_data.dbo.my_table b on a.id_no = b.id_no
  where a.id_no = rtrim(ltrim(@field_id))
  end
  else
  if @lc_add1_edit2_del3 = '3'
  begin
  delete BB_data.dbo.my_table where id_no = rtrim(ltrim(@field_id))
  end
  end
end
GO


AA_data.my_table表中有100条记录,但我可能只要将其中30条,同步到BB_data.my_table表中去的。
所以使用“发布/订阅”好象不合适。


但现在的问题是,两个数据库分别在两台服务器上,这个语句要如何写呢?
请各位大师指点一下。




------解决方案--------------------
探讨

引用:
SQL code

添加链接服务器
EXEC sp_addlinkedserver
'RemoteServer',
'',
'MSDASQL',
NULL,
NULL,
'DRIVER={SQL Server};SERVER=192.168.2.44,1433;UID=POS;PWD=PO$$IBLE;'
……



使用你上面的方法,好象……