两台服务器A 和B,在相应的数据库中有同样的一张表table  
两台服务器都有各自的客户机去更新表table 现在的需求:如何实现表table同步

解决方案 »

  1.   


    定时同步服务器上的数据
    --例子: 
    --测试环境,SQL Server2005,远程服务器名:marry-gao,用户名为:sa,sa,测试数据库:test 
    --服务器marry-gao上的表(查询分析器连接到服务器上创建)
    --create table [user](id int primary key,number varchar(4),name varchar(10)) --以下在局域网(本机操作) 
    --本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
    if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    drop table [user] 
    GO 
    create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit) 
    go --创建触发器,维护state字段的值
    create trigger t_state on [user] 
    after update 
    as 
    update [user] set state=1 
    from [user] a join inserted b on a.id=b.id 
    where a.state is not null 
    go --为了方便同步处理,创建链接服务器到要同步的服务器
    --这里的远程服务器名为:marry-gao,用户名为:sa,sa 
    if exists(select 1 from master..sysservers where srvname='srv_lnk') exec sp_dropserver 'srv_lnk','droplogins' 
    go 
    exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','marry-gao' 
    exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','sa'
    go --创建同步处理的存储过程
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_synchro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
    drop procedure [dbo].[p_synchro] 
    GO 
    create proc p_synchro 
    as 
    begin
    --set XACT_ABORT on 
    --启动远程服务器的MSDTC服务
    --exec master..xp_cmdshell 'isql /S"marry-gao" /U"sa" /P"sa" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output --启动本机的MSDTC服务
    --exec master..xp_cmdshell 'net start msdtc',no_output --进行分布事务处理,如果表用标识列做主键,用下面的方法
    --BEGIN DISTRIBUTED TRANSACTION 
    --同步删除的数据
    delete from srv_lnk.test.dbo.[user] 
    where id not in (select id from [user]) --同步新增的数据
    insert into srv_lnk.test.dbo.[user] 
    select id,number,name from [user] where state is null --同步修改的数据
    update srv_lnk.test.dbo.[user] set 
    number=b.number,name=b.name 
    from srv_lnk.test.dbo.[user] a 
    join [user] b on a.id=b.id 
    where b.state=1 --同步后更新本机的标志
    update [user] set state=0 where isnull(state,1)=1 
    --COMMIT TRAN 
    end
    go --创建作业,定时执行数据同步的存储过程
    if exists(SELECT 1 from msdb..sysjobs where name='数据处理') 
    EXECUTE msdb.dbo.sp_delete_job @job_name='数据处理' 
    exec msdb..sp_add_job @job_name='数据处理' --创建作业步骤
    declare @sql varchar(800),@dbname varchar(250) 
    select @sql='exec p_synchro' --数据处理的命令
    ,@dbname=db_name() --执行数据处理的数据库名exec msdb..sp_add_jobstep @job_name='数据处理', 
    @step_name = '数据同步', 
    @subsystem = 'TSQL', 
    @database_name=@dbname, 
    @command = @sql, 
    @retry_attempts = 5, --重试次数
    @retry_interval = 5 --重试间隔--创建调度
    EXEC msdb..sp_add_jobschedule @job_name = '数据处理', 
    @name = '时间安排', 
    @freq_type = 4, --每天
    @freq_interval = 1, --每天执行一次
    @active_start_time = 00000 --0点执行
    go 
      

  2.   

    可参考
    http://topic.csdn.net/u/20080523/11/08e4624a-13d1-4a6c-a9bc-7cfdd721a351.html