SQL Server与Oracle的数据同步方案及解决过程

转载 2012年07月02日 18:08:28
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秒数据同步。

我的sql server与oracle数据同步方案

说到同步,其实是靠"作业"定时调度存储过程来操作数据,增,删,改,全在里面,结合触发器,游标来实现,关于作业调度,我使用了5秒运行一次来实行"秒级作业",这样基本就算比较快的"同步"我做的是sql s...
  • lee576
  • lee576
  • 2007-12-18 15:29:00
  • 1707

Oracle与SQL Server的数据同步方法。

情况描述:现在有两个系统,一个主要系统使用Oracle,就叫它OracleProject。 另外一个系统使用SQL Server,就叫它SQLServerProject。现在需要将它们的数据进行同步。...
  • dutguoyi
  • dutguoyi
  • 2007-03-02 11:53:00
  • 2069

SQLServer数据库同步准实时方案

1. 需求    1)如何将在线运营的SQLServer数据库数据及时同步到另外一个SQLServer数据库。    2)数据仓库系统的数据抽取会对源系统造成巨大压力,严重影响性能和响应速度。如何将生...
  • trueback
  • trueback
  • 2007-04-13 17:10:00
  • 3380

通过SSIS导入数据(SQL Server2005-->Oracle11g)

  • 2009年08月26日 16:58
  • 2KB
  • 下载

Oracle同步数据到Sql Server

  • 2014年06月16日 14:08
  • 609KB
  • 下载

SQL Server AB表同结构的简单数据同步存储过程

/*近日无事,写了一存储过程实现A,B同结构表的数据同步的简单处理的存储过程,欢迎大家丢砖.基本功能为同步insert AB的记录,最后以AB其中一表为准更新另外一表的差异记录.1.对于关键或者有些列...
  • zhangqu_980371
  • zhangqu_980371
  • 2006-05-15 06:43:00
  • 1126

Oracle GoldenGate 将 SQLServer 数据实时同步到 ORACLE

Oracle GoldenGate  (简称 OGG)使在不同关系型数据库之间能进行实时同步复制可谓非常强大。 OGG 支持 oracle、sql server、mysql、db2、Sybase 等关...
  • kk185800961
  • kk185800961
  • 2016-12-01 21:09:39
  • 4957

将SQL Server 2005中数据同步到Oracle中

  • 2017年07月07日 11:05
  • 21KB
  • 下载

轻松解决异构数据同步:赶集网CDC数据同步方案实践.

  • 2012年05月04日 18:23
  • 764KB
  • 下载
收藏助手
不良信息举报
您举报文章:SQL Server与Oracle的数据同步方案及解决过程
举报原因:
原因补充:

(最多只允许输入30个字)