我的sql server与oracle数据同步方案
来源:互联网 发布:php7 mysql数据库 编辑:程序博客网 时间:2024/05/18 03:37
说到同步,其实是靠"作业"定时调度存储过程来操作数据,增,删,改,全在里面,结合触发器,游标来实现,关于作业调度,我使用了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秒同步,^_^,please enjoy!
- 我的sql server与oracle数据同步方案
- SQL Server与Oracle的数据同步方案及解决过程
- Oracle与SQL Server的数据同步方法。
- SQL server与Oracle数据同步以及数据库结构同步的问题
- Oracle的数据同步方案
- SQL Server与Oracle链接服务器 实现数据同步
- Sql Server 2005 与Sql Server Mobile(Sql server 2005 mobile Edition)数据同步步骤以及问题解决方案
- Sql Server 2005 与Sql Server Mobile(Sql server 2005 mobile Edition)数据同步步骤以及问题解决方案
- SQL Server数据导出到Oracle的方案
- SQL Server数据导出到Oracle的方案
- SQL Server数据导出到Oracle的方案
- Oracle 与 Sql 数据同步
- 一种客户端同步server数据的方案
- oracle 同步数据方案
- Oracle 提供的数据同步方案
- 关于SQL与Oracle 数据同步
- Sql Server数据同步
- SQL Server数据同步
- 人物专访:唯一不变的是信息本身
- linux系统裁减
- avascript定义二维数组的方法
- 综合面试题
- 国学入门书要目及其读法----梁启超
- 我的sql server与oracle数据同步方案
- 确定组织是否真正敏捷的五种方法 - 非常喜欢的一篇文章
- 双向非循环递增链表——插入,删除,清空
- Java自定义事件
- [转]16道C语言面试题
- 熊猫烧香
- MyEclipse中导入已经编辑好的.jsp文件,中文显示乱码...?
- 熊猫病毒源码与专杀源码
- 盖茨:软件开发不只是坐在办公室里猛写代码