国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

經驗總結:SQL Server與Oracle的數據同步

2024-08-31 00:52:34
字體:
來源:轉載
供稿:網友
這篇論壇文章(賽迪網技術社區)主要介紹了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秒數據同步。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 赤城县| 兴国县| 修水县| 怀柔区| 四会市| 韶山市| 海原县| 老河口市| 十堰市| 宜丰县| 潢川县| 体育| 高安市| 平舆县| 汨罗市| 定安县| 师宗县| 广丰县| 麦盖提县| 长丰县| 民权县| 武城县| 新闻| 哈巴河县| 洛扎县| 高州市| 通化县| 隆德县| 灌南县| 商洛市| 溧阳市| 富顺县| 桓台县| 西贡区| 肥东县| 定襄县| 任丘市| 昆明市| 尤溪县| 屏东县| 沈丘县|