—测试是否可以访问mysql数据库中的表
select * from openquery(MySqll_Aggregation,\’SELECT * FROM tb; \’)
—–建立允许远程访问连接操作
USE [master]
GO
EXEC master .dbo. sp_serveroption @server =N\’MySqll_Aggregation\’ , @optname= N\’rpc out\’, @optvalue=N\’TRUE\’
GO
EXEC master .dbo. sp_serveroption @server =N\’MySqll_Aggregation\’ , @optname= N\’remote proc transaction promotion\’, @optvalue =N\’false\’
GO
–建立LOOPBACK 服务器链接
EXEC sp_addlinkedserver @server = N\’loopback\’ , @srvproduct = N\’ \’ , @provider = N\’SQLNCLI\’,
@datasrc = @@SERVERNAME
go
–设置服务器链接选项,阻止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\’
GO
—编写触发器和存储过程
–insert
CREATE TRIGGER TR_INSERT_TB ON DB_TY2015 .DBO. TB
FOR INSERT
AS
DECLARE @ID INT,
@QTY INT
SELECT @ID =ID, @QTY=QTY FROM INSERTED;
BEGIN
EXEC loopback .db_ty2015. dbo.sp_insert @id, @qty;
END
CREATE PROCEDURE SP_INSERT
@ID INT ,
@QTY INT
AS
BEGIN
SET NOCOUNT ON
INSERT OPENQUERY (db_ty2015, \’select * from tb\’)(id ,qty) values(@id ,@qty);
SET NOCOUNT OFF
END
—update
CREATE TRIGGER TR_UPDATE_TB ON DB_TY2015 .DBO. TB
FOR UPDATE
AS
DECLARE @ID INT, @QTY INT
SELECT @ID =ID, @QTY=QTY FROM INSERTED;
BEGIN
EXEC loopback .db_ty2015. dbo.sp_update @id, @qty;
END
CREATE PROCEDURE SP_UPDATE
@ID INT ,
@QTY INT
AS
BEGIN
SET NOCOUNT ON
UPDATE OPENQUERY (db_ty2015, \’select * from tb\’) set qty =@qty where id =@id
SET NOCOUNT OFF
END
–delete
CREATE TRIGGER TR_DELETE_TB ON DB_TY2015 .DBO. TB
FOR DELETE
AS
DECLARE @ID INT
SELECT @ID =ID FROM DELETED ;
BEGIN
EXEC loopback .db_ty2015. dbo.sp_DELETE @id;
END
CREATE PROCEDURE SP_DELETE
@ID INT
AS
BEGIN
SET NOCOUNT ON
DELETE OPENQUERY (db_ty2015, \’select * from tb\’) where id =@id
SET NOCOUNT OFF
END
——-初始化数据 表已存在的情况
insert openquery (MySqll_Aggregation, \’select * from bi.tb\’) select * from [FSLogin] .[dbo]. [tb] with(nolock )
—从mysql同步表结构及数据到sqlserver上(与本案例无关)
select * into [SqlServerDBName].dbo .tb from openquery (localmysql, \’select * from mysqldbname.weibosession\’)