[sql server] sql server 链接 MySql 实测经过

[sql server] sql server 链接 MySql 实测经过

以下测试是在 xp sp3系统下,使用 sql server 2005 express 与 MySql 5.0

 

 

--通过odbc创建链接服务器

-- 方法1、在系统odbc数据源中 预先添加一个DSN名为MySQL_TestDB的数据源
--EXEC sp_addlinkedserver  @server = 'MySQL_TestDB', @srvproduct='MySQL', @provider = 'MSDASQL', @datasrc = 'MySQL_TestDB'
--GO
-- 方法2、不在系统odbc数据源中数据源,直接写在配置参数中
EXEC sp_addlinkedserver  @server = 'MySQL_TestDB', @srvproduct='MySQL', @provider = 'MSDASQL', @provstr = 'Driver={BMF MySQL ODBC Driver};Server=localhost;Database=testdb;User=root;Password=;Option=3;'
GO

EXEC sp_addlinkedsrvlogin  @rmtsrvname='MySQL_TestDB',@useself='false',@locallogin='sa',@rmtuser='root',@rmtpassword=''
--删除链接服务器
exec sp_dropserver 'MySQL_TestDB' , 'droplogins'

--查询
SELECT * FROM OPENQUERY (MySQL_TestDB ,'select * from tb' )
/*
id          name
----------- --------------------
35586       35586
35587       35587
35588       35588
.....
*/
--插入
insert OPENQUERY (MySQL_TestDB ,'select * from tb' ) select 1,2
--更新
update OPENQUERY (MySQL_TestDB ,'select * from tb' ) set name=3 where id=1
--删除
delete  FROM OPENQUERY (MySQL_TestDB ,'select * from tb' ) where id=1
delete  FROM OPENQUERY (MySQL_TestDB ,'select * from tb' )

 

 

--触发器中测试,大家比较关系如何同步

--建立测试环境
IF OBJECT_ID('tb') IS NOT NULL  DROP TABLE tb
GO
CREATE TABLE tb
(
 id int identity,
 code varchar(10),
 name varchar(20),  
    CONSTRAINT PK_TB PRIMARY KEY (id)
)
GO

IF OBJECT_ID('tri_tb') IS NOT NULL  DROP trigger tri_tb
GO
create trigger tri_tb
on tb
for insert , update ,delete
as
begin
 if not exists(select 1 from deleted)
  insert OPENQUERY (MySQL_TestDB ,'select * from tb' ) select id,code from inserted
 else
 if not exists(select 1 from inserted)
  delete t from OPENQUERY (MySQL_TestDB ,'select * from tb' ) t,deleted d where t.id=d.id
 else
 update t
 set name=i.code
 from OPENQUERY (MySQL_TestDB ,'select * from tb' ) t,inserted i, deleted d
 where i.id=d.id and i.id=t.id
end
go
--1 isnert
insert tb select 111,111
--第一次执行报错
/*
消息 8501,级别 16,状态 3,过程 tri_tb,第 8 行
服务器 'LANDSEA-8CC1455/SQLEXPRESS' 上的 MSDTC 不可用。
*/

--查看了一下系统服务,发现dtc的服务未启动 (Distributed Transaction Coordinator)
--将其启动后,再次执行,就没有问题,可能是我都是本机数据库,没有分布式的问题(我没有太多机器),
--这里很多人都遇到问题,对于这里的问题已经有很多人整理的很好了,我们可以参考:


[sql server] SQL Server 分布式数据库的问题和解决方法1
http://blog.csdn.net/xys_777/archive/2010/07/12/5729339.aspx

[sql server] SQL Server 分布式数据库的问题和解决方法2
http://blog.csdn.net/xys_777/archive/2010/07/12/5729334.aspx

 

--继续执行成功,为了显示了影响的行数,我故意没有在触发器中加 set nocount on,
/*
(1 行受影响)

(1 行受影响)
*/

--以下测试均很顺利
select * from tb
/*
id          code       name
----------- ---------- --------------------
1           111        111

(1 行受影响)

*/
SELECT * FROM OPENQUERY (MySQL_TestDB ,'select * from tb' )
/*
id          name
----------- --------------------
1           111

(1 行受影响)
*/
insert tb select 222,222 union select 333,333
SELECT * FROM OPENQUERY (MySQL_TestDB ,'select * from tb' )
--顺序有些乱
/*
id          name
----------- --------------------
2           222
3           333
1           111

(3 行受影响)
*/
update tb set code = 555
SELECT * FROM OPENQUERY (MySQL_TestDB ,'select * from tb' )
--顺序有些乱
/*
id          name
----------- --------------------
2           555
3           555
1           555

(3 行受影响)
*/
delete from tb where id=1
SELECT * FROM OPENQUERY (MySQL_TestDB ,'select * from tb' )
/*
id          name
----------- --------------------
2           555
3           555

(2 行受影响)
*/

 

----〉实际大家可以看出来上述方法,只要链接服务器改为其他任何数据库,皆通用

 

网上类似文章:

http://doc.chinaunix.net/sqlserver/201004/492237.shtml(带图推荐)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值