同步数据
同步处理数据是指在初始快照已经应用于订阅服务器之后,数据在发布服务器和订阅服务器之间传播的过程。当对某个订阅进行同步处理时,发生的过程会有所不同,这取决于使用的复制类型以及此订阅是否标记为重新初始化。对于快照发布,同步处理数据意味着在订阅服务器上重新应用快照,以便订阅数据库上的架构和数据与发布数据库保持一致。对于事务复制,同步处理数据意味着数据更新、插入、删除和其它修改在发布服务器和订阅服务器之间分发。对于合并发布,同步处理数据意味着合并在多个站点进行的更新,检测、解决冲突(如果有的话)并将数据最终汇聚为相同的值。分发代理程序和合并代理程序移动发生在发布服务器或订阅服务器上的数据更改。为取得一致,Microsoft® SQL Server™ 2000 复制使用术语同步处理来表示这些复制代理程序之一运行时所进行的处理。快照复制同步处理
当对某个快照发布的订阅进行同步处理时,分发代理程序(使用 distrib.exe 或分发 ActiveX® 控件)会运行而且最新的快照将应用于订阅服务器上。如果已经对数据进行修改,那么在订阅服务器能够应用新数据之前必须生成新的快照。事务复制同步处理
当对事务发布的订阅进行同步处理时,分发代理程序(使用 distrib.exe 或分发 ActiveX 控件)会运行而且已经在分发服务器上登录的 UPDATE、INSERT 和 DELETE 语句会传播到订阅服务器。如果此订阅已标记为重新初始化,那么快照代理程序和分发代理程序必须运行,以生成新的快照并传播到订阅服务器。合并复制同步处理
当合并复制拓扑中的发布服务器和订阅服务器使用合并代理程序(replmerg.exe 或合并 ActiveX 控件)重新连接,并且更新在站点之间进行传播(如果有必要的话,还要检测和解决冲突)时,即发生同步处理。在同步处理过程中,合并代理程序将所有更改过的数据发送到其它站点。数据从更改发生处流向需要更新或同步处理的站点。在目的数据库中,从其它站点传播来的更新与现有的值进行合并,合并按照可扩展且灵活的冲突检测和解决方法进行。合并代理程序评估送来的值和当前的值,而新旧值之间的任何冲突由默认的解决程序自动解决。可在创建发布或自定义解决程序时指定此解决程序。只有在同步处理发生时,更改过的数据值才被复制到其它站点并与那些站点上的更改汇聚在一起。两次同步处理的时间间隔可以是几分钟、几天甚至几周。数据进行集中,并且最终所有站点的数据值相同。但是,如果检测并解决了冲突,便意味着根据您定义的策略改变或撤消了某些用户提交的工作以解决冲突。同步处理架构更改
Microsoft® SQL Server™ 2000 支持对现有发布数据库进行有限的架构更改。可以向某个已发布的表中添加列和从中除去列,而无须除去和重新创建引用此表的发布和订阅。快照复制、事务复制和合并复制支持对架构更改的复制。列的添加和删除在表级别执行并传播到从该表接收数据的所有订阅服务器。有关更多信息,请参见发布数据库上的架构更改。按需脚本执行
按需脚本执行使您得以发布一个 SQL 脚本,然后在分发或合并过程中,该脚本可以在特定发布的所有订阅服务器上执行。按需脚本执行可用于快照复制、事务复制和合并复制。若要指定为合并发布的所有订阅服务器运行某个脚本,请执行 sp_addreplmerge_script。下次合并代理程序运行时,该脚本将在各订阅服务器上执行。若要指定为快照发布或事务发布的所有订阅服务器运行某个脚本,请执行 sp_addscriptexec。下次分发代理程序运行时,该脚本将在各订阅服务器上执行。当执行 sp_addscriptexec 或 sp_addreplmerge_script 时,需要指定以下参数。参数 数据类型 描述 
@publication sysname 指定一个有效的发布。必需的。无默认。 
@scriptfile nvarchar(8000) 指定 SQL 脚本位于的 UNC 路径。必需的。无默认。 
按需脚本执行将脚本复制到复制工作目录,然后使用 osql.exe 将该脚本应用于订阅服务器。如果为快照发布或事务发布应用脚本时失败,则分发代理程序将停止。sp_addscriptexec 系统存储过程有另一个参数 @SkipError,以指定分发代理程序遇到错误时是应当停止 (@SkipError = 0),还是应当将错误记入日志并且分发代理程序应当继续 (@SkipError = 1)。

解决方案 »

  1.   

    如何将sql服务器上的数据传到下面的终端。???什么意思啊?
      

  2.   

    --数据较少时,可以手工同步,更方便控制/ 我的例子是在两个SQL之间,对于SQL与非SQL数据库的同步,处理方法也相同.因为openrowset支持多种数据库格式--即时同步两个表的实例:--测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test--创建测试表,不能用标识列做主键,因为不能进行正常更新
    --在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器
    if exists (select * from dbo.sysobjects where id = object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [test]create table test(id int not null constraint PK_test primary key
    ,name varchar(10))
    go--创建同步的触发器
    create trigger t_test on test
    for insert,update,delete
    as
    delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)
    where id in(select id from deleted)
    insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)
    select * from inserted
    go--插入数据测试
    insert into test
    select 1,'aa'
    union all select 2,'bb'
    union all select 3,'c'
    union all select 4,'dd'
    union all select 5,'ab'
    union all select 6,'bc'
    union all select 7,'ddd'--删除数据测试
    delete from test where id in(1,4,6)--更新数据测试
    update test set name=name+'_123' where id in(3,5)--显示测试的结果
    select * from test a full join
    openrowset('sqloledb','xz';'sa';'',test.dbo.test) b on a.id=b.id
      

  3.   

    --定时同步服务器上的数据--例子:
    --测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
    --服务器上的表(查询分析器连接到服务器上创建)
    create table [user](id int primary key,number varchar(4),name varchar(10))
    go
    --以下在局域网(本机操作)
    --本机的表,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--为了方便同步处理,创建链接服务器到要同步的服务器,对象可以是其他类型的数据库.
    --这里的远程服务器名为:xz,用户名为: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','xz'
    exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'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
    --同步删除的数据
    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
    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
      

  4.   

    你在终端上使用的数据库是sql server吗?
    如果是采用邹建的方法。使用复制技术,定期更新数据就行了。
    如果不是,就比较麻烦。
    你必须在前台编写代码,调用服务器上的存储过程,通过程序来实现数据的同步。
      

  5.   

    非常感谢各位仁兄,回楼上和马克,我的终端数据库不是sql数据库。邹建的方法我想应该不行。
    在终端调用存储过程,如何实现呢,请赐教两招。再次感谢大家。
      

  6.   

    触发器不可以,因为你的数据库类型是不同的.
    事务复制也不可以,因为你的数据库类型是不同的.写程序是可以的,但是很麻烦,工作量很大.
    利用SQL Server的DTS导入导出数据很方便,可以作一些简单的规则,但可能在事务控制方面不够严谨。自己权衡吧,因为你问的是个难题!