SQL Server (來源) → 連結伺服器 (MySQL ODBC) → 觸發器 → 迴環連結伺服器 → 預存程序 → 寫入 MySQL。
MySQL Connector/ODBC 5.3 (ANSI/Unicode 均可)。jt,填入 MySQL IP、Port、Database、UID、PWD。EXEC sp_addlinkedserver
@server='jt', @srvproduct='mysql', @provider='MSDASQL',
@datasrc=NULL, @location=NULL,
@provstr='DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=192.168.5.188;DATABASE=suzhou;UID=root;PORT=3306;',
@catalog=NULL;
EXEC sp_addlinkedsrvlogin @rmtsrvname='jt', @useself='false', @rmtuser='root', @rmtpassword='password';
-- 允許 RPC 輸出、關閉分散式交易提升
EXEC sp_serveroption @server='jt', @optname='rpc out', @optvalue='TRUE';
EXEC sp_serveroption @server='jt', @optname='remote proc transaction promotion', @optvalue='FALSE';
EXEC sp_addlinkedserver @server=N'loopback', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=@@SERVERNAME;
EXEC sp_serveroption @server='loopback', @optname='rpc out', @optvalue='TRUE';
EXEC sp_serveroption @server='loopback', @optname='remote proc transaction promotion', @optvalue='FALSE';
-- SQL Server
CREATE DATABASE suzhou;
CREATE TABLE sz (
id INT IDENTITY(1,1) PRIMARY KEY,
orderno CHAR(20) NOT NULL,
ordertime DATETIME NOT NULL DEFAULT GETDATE(),
remark VARCHAR(200)
);
-- MySQL
CREATE TABLE sz (
id INT(11) NOT NULL,
orderno CHAR(20) NOT NULL,
ordertime DATETIME(6) NOT NULL,
remark VARCHAR(200),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- INSERT 觸發器
CREATE TRIGGER tr_insert_sz ON suzhou.dbo.sz FOR INSERT AS
BEGIN
DECLARE @id INT, @orderno CHAR(20), @ordertime DATETIME, @remark VARCHAR(200);
SELECT @id=id, @orderno=orderno, @ordertime=ordertime, @remark=remark FROM inserted;
EXEC loopback.suzhou.dbo.sp_insert @id, @orderno, @ordertime, @remark;
END;
-- INSERT 預存程序
CREATE PROCEDURE sp_insert @id INT, @orderno CHAR(20), @ordertime DATETIME, @remark VARCHAR(200) AS
BEGIN
SET NOCOUNT ON;
INSERT OPENQUERY(jt, 'SELECT * FROM sz') (id, orderno, ordertime, remark)
VALUES (@id, @orderno, @ordertime, @remark);
END;
-- UPDATE/DELETE 同理,略
USE suzhou;
INSERT INTO sz (orderno, remark) VALUES ('a001', 'test');
UPDATE sz SET remark='ocpyang' WHERE orderno='a001';
DELETE FROM sz WHERE orderno='a001';
檢查 MySQL 端資料是否同步。
sp_configure 'show advanced options',1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries',1; RECONFIGURE;