軟件數據庫中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
|
然后我們分別在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
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
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)
begin truncate table PublishLastRec_SQL return end
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
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/