以下测试是在 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 行受影响)
*/
----〉实际大家可以看出来上述方法,只要链接服务器改为其他任何数据库,皆通用。
--转自