mysql实时触发_MYSQL实时触发SQL SERVER

本文档介绍了一种实现MySQL数据变化实时同步到SQLServer的方法。通过在MySQL中创建插入、更新、删除触发器,记录操作行为及状态,然后在SQLServer端设置存储过程和定时任务来轮询并应用这些变更,达到近乎实时的数据同步效果。
摘要由CSDN通过智能技术生成

大家大多能够找到SQL SERVER触发后改变MYSQL的表,这个实现起来比较简单,只要sql server写好触发器来实现。这边要说的当MYSQL的一些表发生了增删改的情况下,如何接近实时的去触发来更新sql server的对应表,这边我借鉴了网上这篇文档做了些改进。

http://www.searchdatabase.com.cn/showcontent_39889.htm

64e4c1933c1eafa78a1f080ded7a9e5f.png

和上面的图也有类似的操作过程,唯一不同的是我这边在mysql定义了三个触发器来更新一个每个表的备份表,把修改日期,是插入还是删除的行为状态以及是否完成作为字段写在该表,如下图:

234cb4c3857e88339e9fa634f2ca0ac8.gif

这边sugarcrmtable是原表,而sugardcrmtablebackup是用来记录状态和做过哪些操作的。I代表插入,U代表更新,D代表删除,而executingstate为d代表已经操作。然后在sql server里写好存储过程用作业定时去跑。

USE [SugarCRMDB]

GO

/****** Object: StoredProcedure [dbo].[select_sugarcrmtablebackup] Script Date: 2015/6/18 17:41:45 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER procedure [dbo].[select_sugarcrmtablebackup]

as

--insert into sugarcrmtablebackup(id,name) select * from openquery(MySql, 'select id,name from sugarcrmtablebackup where NOT ISNULL(ExecutingState) ')

--插入BehaviorState为I的记录

insert into sugarcrmtablebackup(id,name) select * from openquery(MySql, 'select id,name from sugarcrmtablebackup where ISNULL(ExecutingState) and BehaviorType=''i''')

update openquery (MySql, 'select id,name,ExecutingState,ModificationTime from sugarcrmtablebackup where ISNULL(ExecutingState) and BehaviorType=''i''') set ExecutingState='D',ModificationTime=getdate()

--删除BehaviorState为U的记录

if object_id('tempdb..#temp') is not null Begin

drop table #temp

End

select * into #temp from openquery(MySql, 'select id,name from sugarcrmtablebackup where ISNULL(ExecutingState) and BehaviorType=''D''')

delete from sugarcrmtablebackup where id in (select id from #temp)

update openquery (MySql, 'select id,name,ExecutingState,ModificationTime from sugarcrmtablebackup where ISNULL(ExecutingState) and BehaviorType=''D''') set ExecutingState='D',ModificationTime=getdate()

--更新BehaviorState为D的记录

if object_id('tempdb..#temp1') is not null Begin

drop table #temp1

End

select * into #temp1 from openquery(MySql, 'select id,name from sugarcrmtablebackup where ISNULL(ExecutingState) and BehaviorType=''U''')

update sugarcrmtablebackup set id=id,name=name select id,name from #temp1

update openquery (MySql, 'select id,name,ExecutingState,ModificationTime from sugarcrmtablebackup where ISNULL(ExecutingState) and BehaviorType=''U''') set ExecutingState='D',ModificationTime=getdate()

定时器好像我这边只能十秒执行一次,但是我看下来速度也接近于实时的了,如下图:

5d9accf6846139cd1e03dacce5f3ff51.gif

除此之外,这边还有mysql需要写的三个触发器:

插入触发器

delimiter ||

DROP TRIGGER IF EXISTS t_afterinsert_on_tab1 ||

CREATE TRIGGER t_afterinsert_on_tab1

AFTER INSERT ON sugarcrmtable

FOR EACH ROW

BEGIN

insert into sugarcrmtablebackup(id,name,BehaviorType) values(new.id,new.name,‘I’);

END||

delimiter ;

更新触发器

delimiter ||

DROP TRIGGER IF EXISTS t_afterdelete_on_tab1 ||

CREATE TRIGGER t_afterdelete_on_tab1

AFTER update ON sugarcrmtable

FOR EACH ROW

BEGIN

insert into sugarcrmtablebackup(id,name,BehaviorType) values(new.id,new.name,‘U’);

END||

delimiter ;

删除触发器

delimiter ||

DROP TRIGGER IF EXISTS t_afterdelete_on_tab1 ||

CREATE TRIGGER t_afterdelete_on_tab1

AFTER delete ON sugarcrmtable

FOR EACH ROW

BEGIN

insert into sugarcrmtablebackup(id,name,BehaviorType) values(old.id,old.name,‘D’);

END||

delimiter ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值