<ruby id="h6500"><table id="h6500"></table></ruby>
    1. <ruby id="h6500"><video id="h6500"></video></ruby>
          1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>
            • 軟件測試技術(shù)
            • 軟件測試博客
            • 軟件測試視頻
            • 開(kāi)源軟件測試技術(shù)
            • 軟件測試論壇
            • 軟件測試沙龍
            • 軟件測試資料下載
            • 軟件測試雜志
            • 軟件測試人才招聘
              暫時(shí)沒(méi)有公告

            字號: | 推薦給好友 上一篇 | 下一篇

            軟件數據庫中SQL Server與Oracle的數據同步

            發(fā)布: 2010-12-20 09:38 | 作者: 網(wǎng)絡(luò )轉載 | 來(lái)源: 領(lǐng)測軟件測試網(wǎng)采編 | 查看: 109次 | 進(jìn)入軟件測試論壇討論

            領(lǐng)測軟件測試網(wǎng)

            軟件數據庫中SQL Server與Oracle的數據同步
            SQL Server 是一個(gè)關(guān)系數據庫管理系統。它最初是由Microsoft、 Sybase 和Ashton-Tate三家公司共同開(kāi)發(fā)的,于1988 年推出了第一個(gè)OS/2 版本。在Windows NT 推出后,Microsoft與Sybase 在SQL Server 的開(kāi)發(fā)上就分道揚鑣了,Microsoft 將SQL Server 移植到Windows NT系統上,專(zhuān)注于開(kāi)發(fā)推廣SQL Server 的Windows NT 版本。Sybase 則較專(zhuān)注于SQL Server在UNIX 操作系統上的應  SQL Server安裝界面用。

            這篇論壇文章主要介紹了SQL Server與Oracle的數據同步方案及解決過(guò)程,更多內容請參考下文:

                    說(shuō)到同步,其實(shí)是靠"作業(yè)"定時(shí)調度存儲過(guò)程來(lái)操作數據,增,刪,改,全在里面,結合觸發(fā)器,游標來(lái)實(shí)現,關(guān)于作業(yè)調度,我使用了5秒運行一次來(lái)實(shí)行"秒級作業(yè)",這樣基本就算比較快的"同步"


                    我做的是SQL Server往Oracle端同步,先在sql server上建立往Oracle端的鏈接服務(wù)器,我用一個(gè)視圖"封裝"了一下鏈接服務(wù)器下的一張表。

                     create view v_ora_PUBLISHLASTREC

                    as

                    select * from ORACLEDB..ROADSMS.PUBLISHLASTREC


                    //ORACLEDB鏈接服務(wù)器名,ROADSMS為表空間名,PUBLISHLASTREC 為數據表名


                    然后我們分別在sql server 要同步的表上建立,insert,delete,update觸發(fā)器


                    腳本如下:

                     --說(shuō)明: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為已執行的


                    接著(zhù)就是最關(guān)鍵的一步,存儲過(guò)程


                    腳本如下:

                     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


                    該存儲過(guò)程使用游標逐行提取PublishLastRec_Sql記錄,根據modiid判斷不同的數據操作,該條記錄處理完畢后把isexec字段更新為1.


                    最后是調用該存儲過(guò)程的作業(yè),我們先建一個(gè)一分鐘運行一次的作業(yè),然后在"步驟"的腳本中這樣寫(xiě):

                     DECLARE @dt datetime

                    SET @dt = DATEADD(minute, -1, GETDATE())

                    WHILE @dt < GETDATE()

                    BEGIN

                    EXEC pro_PublishLastRec_Sql --這里pro_PublishLastRec_Sql 為你要作業(yè)執行的存儲過(guò)程

                    WAITFOR DELAY '00:00:05' -- 等待5秒, 根據你的需要設置即可

                    END

                    現在,我們即可以實(shí)現5秒執行一次該存儲過(guò)程,做到5秒數據同步。

            延伸閱讀

            文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/


            關(guān)于領(lǐng)測軟件測試網(wǎng) | 領(lǐng)測軟件測試網(wǎng)合作伙伴 | 廣告服務(wù) | 投稿指南 | 聯(lián)系我們 | 網(wǎng)站地圖 | 友情鏈接
            版權所有(C) 2003-2010 TestAge(領(lǐng)測軟件測試網(wǎng))|領(lǐng)測國際科技(北京)有限公司|軟件測試工程師培訓網(wǎng) All Rights Reserved
            北京市海淀區中關(guān)村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
            技術(shù)支持和業(yè)務(wù)聯(lián)系:info@testage.com.cn 電話(huà):010-51297073

            軟件測試 | 領(lǐng)測國際ISTQBISTQB官網(wǎng)TMMiTMMi認證國際軟件測試工程師認證領(lǐng)測軟件測試網(wǎng)

            老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
              <ruby id="h6500"><table id="h6500"></table></ruby>
              1. <ruby id="h6500"><video id="h6500"></video></ruby>
                    1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>