sqlserver 触发器 mysql_sqlserver利用触发器实时同步数据到mysql

本文介绍了如何通过触发器实现在SQLServer和MySQL之间的实时数据同步。作者详细讲述了从安装ODBC驱动,设置ODBC连接,到在SQLServer中创建存储过程和触发器,以实现数据的插入、更新和删除操作同步到MySQL的过程。遇到的问题及解决方案也被分享,特别是解决分布式操作不支持的错误,更换ODBC版本至8.0。
摘要由CSDN通过智能技术生成

1、前言

在工作中,想从sqlserver同步一些表的数据到mysql,原有方案是,在原项目中添加多数据源,然后从一个写,一个读,利用定时器定时执行更新。sqlserver的数据表结构建立的不严谨,没有一些创建、更新的时间,所以每次同步都能全部数据删除再写入,数据量多的话就会很慢,所以自己就想用触发器执行,同事说跨服务器跨数据库,你这样做的话,能达到么,自己研究了一下,中途试了很多错,最终还是实现了,现将自己的研究笔记记录一下,怕自己日后也忘记了。

2、背景

可以本地,也可以跨服务器,本文案例,使用的是两台window系统电脑,A电脑有sqlserver,B电脑有mysql,两个电脑均有结构相同的表sud,目的:每次sqlserver的sud表有增删改操作时,同步到mysql的sud表,A电脑sqlserver的sud表在MES_WORKBECH_TD数据库里,B电脑mysql的sud表在jeecgbootsy里。

3、准备工作

1、下载ODBC并安装,因自己下载过一些版本,一直报错分布式相关问题,此处直接放自己的使用版本链接,方便大家下载;

下载链接:https://download.csdn.net/download/qq_40065816/13196371

2、可能在安装ODBC的时候,会提示报错,根据提示,应该要安装visual Studio 2019,所以得继续下载安装,

下载链接:https://download.csdn.net/download/qq_40065816/13196382

这个安装的需要好久,但是 不需要安装完,大约过个几分钟,就可以继续让他安装,自己继续回到ODBC的安装。

3、确保两台电脑的ip能够通信。互相打开cmd,ping对方ip,能ping通,才可以正常操作,不能ping通的话,请关闭防火墙活查看其他原因,只有ping通了对方才可以访问到。

`

c47c05fe114f5e76288d5ab6f2ff5219.png

4、正式配置并设置同步

(1)打开ODBC,在电脑开始处搜索既可以看到,打开后点击系统DNS,并点击添加

e35b86fcb6781eff3a630bad2478eac8.png

选择驱动

df5de3f36d9c29e42ad71afb201dff96.png

4472d25dd59a598994d3598370ae3c4d.png

填写完Test,如果成功说明可以连得上,如果不成功,在检查没有填写错误ip的情况下,原因可能是:mysql的数据库不支持A电脑的登录,开个账户给A电脑授权使用即可。

步骤:打开mysql,输入

grant select,update,insert,delete on . to root@ip identified by “123456”;

root:账户名,自己可以随意设置

ip :A电脑的ip地址

123456为密码,自己设置的在连接的时候注意填写自己的就可以了。

(2)、设置完之后,就可以打开A电脑的sqlserver数据库,此处sqlserver用的是

SQL Server Management Studio 2008软件,

1)新建查询

--新建链接服务器

exec sp_addlinkedserver

@server='AA' , --ODBC里面data source name

@srvproduct='MySql' , --自己随便 @provider='MSDASQL' , --固定这个

@datasrc=NULL,

@location=NULL,

@provstr='DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=***ODBC里填的IP***;DATABASE=jeecgbootsy;UID=root;PORT=3306;

--新建查询。输入以下,登录服务器

exec sp_addlinkedsrvlogin

@rmtsrvname='AA' ,----ODBC里面data source name

@useself='false' ,

@rmtuser='root' ,---mysql账号

@rmtpassword='123456';--mysql账号其密码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

完后可以刷新左侧sqlserver,看看是否连接得上,是否有对应的数据库及表,有则成功

e056ca4043e1e0e8a8a35f9a5b8bef35.png

也可以新建查询,用数据库语句测试以下:select * from openquery(AA,'SELECT * FROM sud; ')

能正常查询则连接正常

2)、分别依次运行下列三个语句

-----(1)建立允许远程访问连接操作

USE [master]

GO

EXEC master .dbo. sp_serveroption @server =N'AA' , @optname= N'rpc out', @optvalue=N'TRUE'

GO

EXEC master .dbo. sp_serveroption @server =N'AA' , @optname= N'remote proc transaction promotion', @optvalue =N'false'

GO

--(2)建立LOOPBACK 服务器链接

EXEC sp_addlinkedserver @server = N'loopback' , @srvproduct = N' ' , @provider = N'SQLNCLI',

@datasrc = @@SERVERNAME

Go

--(3)设置服务器链接选项,阻止SQL Server 由于远过程调用而将本地事务提升为分布事务

USE [master]

GO

EXEC master .dbo. sp_serveroption @server =N'loopback', @optname= N'rpc out', @optvalue=N'TRUE'

GO

EXEC master .dbo. sp_serveroption @server =N'loopback', @optname= N'remote proc transaction promotion' , @optvalue=N'false'

GO1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

3)、开始建立插入的存储过程

use MES_WORKBECH_TD

go

create PROCEDURE sp_insert_sud(

@id int,

@name nvarchar(200)

)

AS

BEGIN

SET NOCOUNT ON;

Insert openquery(AA, 'select * from sud')(id,name)values(@id,@name)

END

Go1

2

3

4

5

6

7

8

9

10

11

12

建立触发器

use MES_WORKBECH_TD

go

create trigger tr_insert_sud on dbo.sud

for insert

as

declare @id int, @name nvarchar(200)

select @id=id,@name=name from inserted;

begin

print @id

print @name

exec loopback.MES_WORKBECH_TD.dbo.sp_insert_sud @id,@name

end

go1

2

3

4

5

6

7

8

9

10

11

12

13

在建立过程中,可能会出现该列找不到的报错,ctrl+Shift+R,报错就消失了,sqlserver插入一条试试:

insert into MES_WORKBECH_TD.dbo.sud values (5,'apple');1

mysql也真的新增了一条;

07c7fe8766c53a9dd2d76e75eeec36ec.png

4)、建立修改的存储过程与触发器

--update

use MES_WORKBECH_TD

go

CREATE PROCEDURE sp_update_sud

@id INT ,

@name nvarchar(200)

AS

BEGIN SET NOCOUNT ON UPDATE OPENQUERY (AA, 'select * from sud') set name =@name where id =@id SET NOCOUNT OFF

END use MES_WORKBECH_TD

go

CREATE TRIGGER tr_update_sud ON dbo.sud

FOR UPDATE

AS

DECLARE @id INT, @name nvarchar(200)

SELECT @id =id, @name=name FROM INSERTED;

BEGIN EXEC loopback .MES_WORKBECH_TD. dbo.sp_update_sud @id, @name;

END1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

修改试试:update MES_WORKBECH_TD.dbo.sud set name = 'banana' where id=5

真的修改到了

0f4280629a1dc3143c3d69c8b0eaeb61.png

5)删除存储过程与触发器的建立:

--delete

USE [MES_WORKBECH_TD]

GO

CREATE PROCEDURE sp_delete_sud

@ID INT

AS

BEGIN SET NOCOUNT ON DELETE OPENQUERY (AA, 'select * from sud') where id =@id SET NOCOUNT OFF

END

USE [MES_WORKBECH_TD]

GO

CREATE TRIGGER rt_delete_sud ON dbo.sud

FOR DELETE

AS

DECLARE @ID INT

SELECT @ID =ID FROM DELETED ;

BEGIN

EXEC loopback .MES_WORKBECH_TD. dbo.sp_delete_sud @id;

END1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

删除试试:delete from MES_WORKBECH_TD.dbo.sud where id=5

真的没了

e8c4b6b082dd0f5e1876d12f08562509.png

5、总结

以上就是自己测试了用触发器同步的步骤,看着简单,但是在做的时候,遇到了一个提示:不支持分布式,困扰了自己很久,打算放弃了,后来抱着试试看的心态,真的成功了:

7f0627e0e80f73f3699675d9527a4cd7.png

类似与图片上的报错,结果,原因是:我用的ODBC是5.1的版本,这个版本,真的很崩溃,这个版本可以链接到mysql,也可以查询,但是在触发器中做增删改,就会报错无法启动分布式,网上查了很多办法都试不成功,最后换了8.0的就成功了,在做的过程中,如大家遇到问题,欢迎一起留言讨论:

a93f98c82ec6c46641d0cc473d255260.png

文章来源: blog.csdn.net,作者:JO安,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_40065816/article/details/110230235

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值