• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

软件数据库中SQL Server与Oracle的数据同步

发布: 2010-12-20 09:38 | 作者: 网络转载 | 来源: 领测软件测试网采编 | 查看: 109次 | 进入软件测试论坛讨论

领测软件测试网

软件数据库中SQL Server与Oracle的数据同步
SQL Server 是一个关系数据库管理系统。它最初是由Microsoft、 Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本。在Windows NT 推出后,Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了,Microsoft 将SQL Server 移植到Windows NT系统上,专注于开发推广SQL Server 的Windows NT 版本。Sybase 则较专注于SQL Server在UNIX 操作系统上的应  SQL Server安装界面用。

这篇论坛文章主要介绍了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 MILY: 宋体">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秒数据同步。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网