テストは何回も失敗したバグのMySQLのインストールの数につながる、そして再インストールする必要があるとき、同期の前提の下で、環境は、舞台を設定する必要があります
---インストールmysqlconnector
http://www.mysql.com/products/connector/ 現在のバージョン8.0がすでにあります
-----設定mysqlconnector
ODBCデータマネージャ - >システムDSN->追加 - > MySQLのODBC 5.3 ANSI driver-> JTデータ・ソース名として満たされ、IPのMySQL、ユーザー名、パスワード
- 新しいリンクサーバー
EXEC sp_addlinkedserverを
@サーバー=「MySqll_Aggregation」、 - コネクタODBCデータ・ソース名の内側いっぱい
@ Srvproduct = 'MySQLの'、 - そのカジュアル
@プロバイダ= 'MSDASQL'、 - 固定
@ DATASRC = 'MySqll_Aggregation'、---- ODBC里面データソース名
@場所= NULL、
- @ provstr = 'DRIVER = { MySQLのODBC 8.0 ANSIドライバ}; SERVER = 127.0.0.1; DATABASE =のMySQL; UID =ルート; PORT = 3306;'、// コンテンツに対応するコネクタのODBC構成 この構成の@datasrc 両方の設定を持っている必要があります
@カタログ= NULL
文を実行します
---接続mysqlデータベースのアカウントとパスワードを作成
幹部sp_addlinkedsrvloginが
@rmtsrvname='MySqll_Aggregation',----ODBC里面data source name
@useself='false',
@rmtuser='root',---mysql账号
@rmtpassword='root';--mysql账号密码
执行语句
刷新对象资源管理器中的链接服务器,能看到的Connector ODBC里面填的data source name内容,目录下对应的是mysql里的数据库
在本地SQLSERVER数据库里建一张表(TB),在本地mysql数据库里建张表(tb),同步需要的,表结构一样(测试时的字段为id,qty)
---测试是否可以访问mysql数据库中的表
select * from openquery(MySqll_Aggregation,'SELECT * FROM tb; ')
//tb 是本地数据库mysql里面的测试表
成功的结果如下:(tb表内的状态)
执行下面的语句
--建立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 PROCEDURE SP_INSERT
@ID INT,
@QTY INT
AS
BEGIN
SET NOCOUNT ON
INSERT OPENQUERY(MySqll_Aggregation, 'select * from tb')(id,qty) values (@id,@qty);
SET NOCOUNT OFF
END
创建另一查询窗口
db_ty2015是SQL SERVER里同步的表TB的所在数据库
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
---update
单独查询窗口
CREATE PROCEDURE SP_UPDATE
@ID INT,
@QTY INT
AS
BEGIN
SET NOCOUNT ON
UPDATE OPENQUERY(MySqll_Aggregation,'select * from tb') SET
qty = @qty WHERE id=@id
SET NOCOUNT OFF
END
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
--delete
CREATE PROCEDURE SP_DELETE
@ID INT
AS
BEGIN
SET NOCOUNT ON
DELETE OPENQUERY(MySqll_Aggregation,'select * from tb') WHERE id=@id
SET NOCOUNT OFF
END
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
执行完增删改之后都能在mysql的表里看到结果
---从mysql同步表结构及数据到sqlserver上
测试语句
select * into [DB_TY2015].[dbo].[tb3] from openquery([MySqll_Aggregation],'select * from mysql.tb')
tb3是创建的一张空表,执行完后表结构变成了tb的,表数据也复制过来了
-------初始化数据 表已存在的情况
INSERT OPENQUERY([MySqll_Aggregation],'select * from tb')(id,qty) select*from [DB_TY2015].[dbo].[tb3]with(nolock)