如题!利用sql的发布、订阅实现的数据同步是双向的吗??可不可以是从服务器上(oracle数据库)将数据复制到客户机上(sqlserver)呢??
 求助!!

解决方案 »

  1.   


    SQL Server 2000订阅与发布的具体操作
    同步过程
      一、准备工作,如果完成则可跳过。
      1、内网DB服务器作为发布服务器,外网DB服务器作为订阅服务器。
      发布服务器和订阅服务器上分别创建Windows用户jl,密码jl,隶属于administrators,注意要保持一致。
      2、发布服务器上创建一个共享目录,作为发布快照文件的存放目录。例如:在D盘根目录下建文件夹名为SqlCopy,设置用户jl,权限为完全控制。
      3、确定发布服务器和订阅服务器的数据库autoweb保持一致。
      4、在发布服务器和订阅服务器的SQL Server中创建用户登陆名jl,作为发布数据库autoweb的拥有者(设置为dbo_owner和public)。用户名和密码都一致。
      5、打开服务(控制面板---管理工具---服务)
      ---右击SQLSERVER AGENT---属性---登录---选择“此帐户”
      ---输入或选择第一步中创建的WINDOWS 用户jl,
      ---“密码“中输入该用户密码jl
      6、开启SQL Server 2000的网络协议TCP/IP和管道命名协议并重启网络服务。
      7、设置SQL SERVER 身份验证,解决连接时的权限问题(发布、订阅服务器均设置)
      步骤为:对象资源管理器----右击SQL实例-----属性----安全性----服务器身份验证------选“SQL Server和WINDOWS“,然后点确定。
      8、发布服务器和订阅服务器互相注册
      步骤如下:视图----单击以注册服务器----右键数据库引擎----新建服务器注册-----填写要注册的远程服务器名称------身份验证选“SQL Server验证“-----用户名(sa) 密码------创建组(也可不建)-----完成。对于只能用IP,不能用计算机名的,为其注册服务器别名
      二、发布和订阅
      如下工作都在发布服务器上配置,包括发布和订阅。
      快照发布和订阅
      1、 选择 复制 节点,右键本地发布 ----下一步---------系统弹出对话框看提示----直到“指定快照文件夹”----在“快照文件夹“中输入准备工作中创建的目录(指向步骤3所建的共享文件夹)------选择发布数据库-------选择发布类型
      下一步―――选择要发布的数据库autoweb中的表,将b(B)开头的表去掉,V开头的表去掉,c_开头的表去掉,t_开头的表去掉,剩下的表作为快照发布到订阅服务器上(单向传输)
      根据情况决定执行发布的间隔时间,如图每天每20分钟执行一次。
      下一步快照代理安全性,设置如图,连接到发布服务器用户jl,密码jl.
      -------填写发布名称。
      2、 选择 复制 节点,右键本地订阅,选择发布服务器-------选择订阅方式(选择推送订阅))-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。
      至此完成快照发布和订阅。
      合并发布和订阅
      1、选择如下三个表作为合并发布的对象,用于双向通讯
      根据情况决定执行发布的间隔时间,如图每天每20分钟执行一次。
      2、 选择 复制 节点,右键本地订阅,选择发布服务器-------选择订阅方式(选择推送订阅))-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。
      至此完成合并发布和订阅
      -------------------------------------------------------------------
      主要是要注意权限的问题,一般做发布/订阅,建议你做如下准备工作:
      1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
      我的电脑
      --控制面板
      --管理工具
      --计算机管理
      --用户和组
      --右键用户
      --新建用户
      --建立一个隶属于administrator组的登陆windows的用户
      2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
      我的电脑--D: 新建一个目录,名为: PUB
      --右键这个新建的目录
      --属性--共享
      --选择"共享该文件夹"
      --通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限
      --确定
      3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)
      开始--程序--管理工具--服务
      --右键SQLSERVERAGENT
      --属性--登陆--选择"此账户"
      --输入或者选择第一步中创建的windows登录用户名
      --"密码"中输入该用户的密码
      4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)
      企业管理器
      --右键SQL实例--属性
      --安全性--身份验证
      --选择"SQL Server 和 Windows"
      --确定
      5.在发布服务器和订阅服务器上互相注册
      企业管理器
      --右键SQL Server组
      --新建SQL Server注册...
      --下一步--可用的服务器中,输入你要注册的远程服务器名--添加
      --下一步--连接使用,选择第二个"SQL Server身份验证"
      --下一步--输入用户名和密码
      --下一步--选择SQL Server组,也可以创建一个新组
      --下一步--完成
      6.对于只能用IP,不能用计算机名的,为其注册服务器别名
      (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
      开始--程序--Microsoft SQL Server--客户端网络实用工具
      --别名--添加
      --网络库选择"tcp/ip"--服务器别名输入SQL服务器名
      --连接参数--服务器名称中输入SQL服务器ip地址
      --如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号
      

  2.   

    情况描述:现在有两个系统,一个主要系统使用Oracle,就叫它OracleProject。 另外一个系统使用SQL Server,就叫它SQLServerProject。现在需要将它们的数据进行同步。主要数据库为Oracle,SQL Server是需要Update的。两个数据库中的数据表结构不相同。有什么方法?自己以前没有做过,会逐渐把解决方法写出来。大家有什么建议,请不吝赐教。:) 谢谢。现在使用的方法是: SQLServer数据库-->Security-->linked servers,在这里将Oracle数据库添加进来。例如,linked server的名字为LS,Oracle的schema是LSschema,数据表为table1。那么通过下面的语句就可以在SQLServer中查询Oracle的数据表了。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dutguoyi/archive/2007/03/02/1519017.aspx
      

  3.   

    http://www.cnblogs.com/yunhuasheng/archive/2008/09/19/1293992.html
      

  4.   

    现在来通过SQL Server 2005来建立数据复制的操作 。1、先在两台服务器上建立两个完全一样的数据库、表结构及存放的数据;2、在服务器一上打开SQL Server 2005,然后选择“复制”——>“本地发布”,然后右键选择新建发布;3、在新建发布向导中首先要求选择分发服务器,在操作中我们暂选择本机作为分发服务器,所以选择默认值。4、选择快照的路径,一般情况下选择默认路径,根据向导选择要发布的数据库;5、选择发布的内容,可以选择发布表,也可以发布其他的数据库对象,比如函数。在选择某一个表之后还可以选择对应的列;6、发布的内容设置好后,然后运行SQL代理的账号。然后再按照向导给建立的复制名命。这样就建立好了发布和分发的应用了。下面接着来配置订阅的应用。1、先在服务器二上打开SQL Server 2005,然后选择“复制”——>“本地订阅”,然后右键选择新建订阅;2、选择发布服务器,在发布服务器的下接列表中找到对应已经建立好的SQL SERVER 发布服务器,然后就可以看到刚才新建的发布复制名称;3、选择订阅方式。在这里可以选择请求订阅,然后选择订阅的本地需要同步的数据库;4、设置完本地数据库之后要求设置运行代理的安全性,设置成SQL 代理账号。订阅的设置就已经完成。下面我们就可以做一个操作的示范,在服务器一上面新插入一条记录后,然后再去服务器二上面看看对应表的数据,会发现到,也会看到更新后的数据。我也上一菜!
      

  5.   

    SQL Server与Oracle的数据同步方案及解决过程,更多内容请参考下文:  
    说到同步,其实是靠"作业"定时调度存储过程来操作数据,增,删,改,全在里面,结合触发器,游标来实现,关于作业调度,我使用了5秒运行一次来实行"秒级作业",这样基本就算比较快的"同步"  
    我做的是SQL Server往Oracle端同步,先在sql server上建立往Oracle端的链接服务器,我用一个视图"封装"了一下链接服务器下的一张表。  
    create view v_ora_PUBLISHLASTREC  as  select * from ORACLEDB..ROADSMS.PUBLISHLASTREC  
    //ORACLEDB链接服务器名,ROADSMS为表空间名,PUBLISHLASTREC 为数据表名  
    然后我们分别在sql server 要同步的表上建立,insert,delete,update触发器  
    脚本如下:  
    --说明:modiid等于1为insert,2为delete,3为update  create trigger trg_PUBLISHLASTREC_insert on PUBLISHLASTREC for insert  as  insert into dbo.PublishLastRec_SQL(modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,IsExec)  select '1',SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,'0' from inserted  
    create trigger trg_PUBLISHLASTREC_update on PUBLISHLASTREC for update  as  insert into dbo.PublishLastRec_SQL(modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,IsExec)  select '3',SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,'0' from inserted  
    create trigger trg_PUBLISHLASTREC_delete on PUBLISHLASTREC for delete  as  insert into dbo.PublishLastRec_SQL(modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,IsExec)  select '2',SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,'0' from deleted  
    所有的操作都是把各幻表的数据插入到一张表中,上面统一插入的表为PublishLastRec_SQL,记录下操作的标识,以标识该条记录是插入,删除,还是修改,modiid等于1为insert,2为delete,3为update,字段isexec标识该条记录是否已处理,0为未执行的,1为已执行的  
    接着就是最关键的一步,存储过程  
    脚本如下:  
    ALTER proc pro_PublishLastRec_Sql  as  declare @modiid int  declare @signalguid int  declare @areano numeric(1,0)  declare @signalnote varchar(50)  declare @areanote varchar(50)  declare @publishroadstatus varchar(20)  declare @publishtime varchar(50)  
    if not exists(select * from PublishLastRec_SQL where IsExec=0)  begin  truncate table PublishLastRec_SQL  return  end  
    declare cur_sql cursor for  select modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime from  PublishLastRec_SQL where IsExec=0 order by [id]--IsExec 0为未执行的,1为已执行的  open cur_sql  fetch next from cur_sql into @modiid,@SignalGUID,@AreaNo,@SignalNote,@AreaNote,@PublishRoadStatus,@PublishTime  
    while @@fetch_status=0  begin  if (@modiid=1) --插入  begin  insert into v_ora_PUBLISHLASTREC(SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime)  values(@SignalGUID,@AreaNo,@SignalNote,@AreaNote,@PublishRoadStatus,@PublishTime)  end  if (@modiid=2) --删除  begin  delete from v_ora_PUBLISHLASTREC where SignalGUID=@SignalGUID and AreaNo=@AreaNo  end  if (@modiid=3) --修改  begin  update v_ora_PUBLISHLASTREC  set SignalNote=@SignalNote,AreaNote=@AreaNote,PublishRoadStatus=@PublishRoadStatus,  PublishTime=@PublishTime  where SignalGUID=@SignalGUID and AreaNo=@AreaNo  end  update PublishLastRec_SQL  set IsExec=1  where current of cur_sql  fetch next from cur_sql into @modiid,@SignalGUID,@AreaNo,@SignalNote,@AreaNote,@PublishRoadStatus,@PublishTime  end  deallocate cur_sql  
    该存储过程使用游标逐行提取PublishLastRec_Sql记录,根据modiid判断不同的数据操作,该条记录处理完毕后把isexec字段更新为1.  
    最后是调用该存储过程的作业,我们先建一个一分钟运行一次的作业,然后在"步骤"的脚本中这样写:  
    DECLARE @dt datetime  SET @dt = DATEADD(minute, -1, GETDATE())  WHILE @dt < GETDATE()  BEGIN  EXEC pro_PublishLastRec_Sql --这里pro_PublishLastRec_Sql 为你要作业执行的存储过程  WAITFOR DELAY '00:00:05' -- 等待5秒, 根据你的需要设置即可  END  现在,我们即可以实现5秒执行一次该存储过程,做到5秒数据同步。
      

  6.   

    利用sql的发布、订阅实现的数据同步是双向的吗?
    快照复制和事务复制是单向的(从发布到订阅),合并复制是双向的。可不可以是从服务器上(oracle数据库)将数据复制到客户机上(sqlserver)呢?
    在 sql server 2000 中不可以。在 sql server 2005 中可以将 oracle 的数据复制到 sql server,但需要一台 sql server 作为分发服务器。
      

  7.   

    作业(job)+3楼方法(自己改一下)