首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server 2005 連結伺服器實作:透過 ODBC 連接 MySQL 完整設定指南

     編輯:SQL Server 2005

SQL Server 連結伺服器允許在 T-SQL 中直接查詢異構資料來源 (Oracle、MySQL、PostgreSQL、Excel、文字檔等)。本文以 MySQL ODBC 驅動程式 為例,完整說明驅動安裝、系統 DSN 設定、連結伺服器建立 (GUI 與 T-SQL)、安全性對應、查詢語法與常見錯誤排查。

前置需求

  • MySQL ODBC 驅動程式 (建議 8.0+,支援 MySQL 5.7/8.0):官方下載
  • 目標 MySQL 伺服器開放遠端連線 (bind-address、防火牆、帳戶權限)
  • SQL Server 服務帳戶需能存取 ODBC DSN (系統 DSN 對所有使用者可見)

步驟 1:安裝 MySQL ODBC 驅動程式

  1. 下載對應架構安裝包 (32-bit/64-bit) — 必須與 SQL Server 版本一致 (64-bit SQL Server 需 64-bit 驅動)
  2. 執行安裝,選擇「典型」或「完整」

步驟 2:建立系統 DSN (關鍵:必須用系統 DSN,非使用者 DSN)

  1. 控制台 → 系統管理工具 → ODBC 資料來源 (64-bit) (或 32-bit 視 SQL Server 而定)
  2. 系統 DSN** 索引標籤 → 新增**
  3. 選擇 MySQL ODBC 8.0 Unicode Driver
  4. 設定參數:
    • Data Source Name:MySQL_Link (自訂,連結伺服器將引用此名稱)
    • Description:選填
    • TCP/IP Server:MySQL 主機 IP/主機名
    • Port:3306 (預設)
    • User/Password:MySQL 帳戶密碼
    • Database:預設資料庫 (可留空)
  5. 點選 測試** → 成功 → 確定
常見錯誤:使用「使用者 DSN」建立連結伺服器時,SQL Server 服務帳戶 (通常是 Local System/Network Service) 看不見使用者 DSN,報錯 Data source name not found and no default driver specified。務必用系統 DSN。

步驟 3:建立連結伺服器 (SSMS GUI)

  1. SSMS 物件總管 → 伺服器物件** → 連結伺服器** → 右鍵 新增連結伺服器**
  2. 一般頁籤:
    • 連結伺服器名稱:MYSQL_LINK (自訂,查詢時使用)
    • 伺服器類型:其他資料來源**
    • 提供者:Microsoft OLE DB Provider for ODBC Drivers
    • 產品名稱:MySQL (必填,留空會報錯)
    • 資料來源:MySQL_Link (步驟 2 的系統 DSN 名稱)
    • 提供者字串:UID=mysql_user;PWD=mysql_password (或留空由 DSN 提供)
  3. 安全性頁籤:
    • 選擇 使用此安全性內容建立** (對應遠端登入)
    • 遠端登入:MySQL 帳戶
    • 遠端密碼:MySQL 密碼
  4. 確定,無錯誤即建立成功

步驟 4:T-SQL 建立連結伺服器 (腳本化部署)

EXEC sp_addlinkedserver 
    @server = 'MYSQL_LINK',
    @srvproduct = 'MySQL',
    @provider = 'MSDASQL',
    @datasrc = 'MySQL_Link';  -- 系統 DSN 名稱

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname = 'MYSQL_LINK',
    @useself = 'FALSE',
    @locallogin = NULL,  -- 所有本機登入對應同一組遠端認證
    @rmtuser = 'mysql_user',
    @rmtpassword = 'mysql_password';

查詢語法:OPENQUERY (推薦) vs 四部分命名

OPENQUERY (推薦:在遠端執行、支援原生語法、效能佳)

SELECT * FROM OPENQUERY(MYSQL_LINK, 'SELECT id, name, created_at FROM users WHERE status = 1 LIMIT 100');

四部分命名 (本地解析、語法受限、效能較差)

SELECT * FROM MYSQL_LINK...users;  -- 資料庫名稱需確認
-- 或
SELECT * FROM MYSQL_LINK.`database_name`.`users`;

進階應用範例

參數化查詢 (避免動態 SQL 注入)

DECLARE @status INT = 1;
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM OPENQUERY(MYSQL_LINK, ''SELECT id, name FROM users WHERE status = ?'')';
-- 注意:OPENQUERY 不支援參數化,需動態組裝字串 (注意單引號跳脫)
-- 實務上建議在 MySQL 建立 View/SP,OPENQUERY 呼叫 View/SP

異構聯結 (SQL Server 本地表 JOIN MySQL 遠端表)

SELECT s.OrderID, s.CustomerID, u.Email
FROM LocalDB.dbo.Orders s
JOIN OPENQUERY(MYSQL_LINK, 'SELECT UserID, Email FROM users') u
    ON s.CustomerID = u.UserID;

寫入遠端資料 (INSERT/UPDATE/DELETE)

INSERT OPENQUERY(MYSQL_LINK, 'SELECT UserID, Email FROM users')
VALUES (999, 'new@example.com');

UPDATE OPENQUERY(MYSQL_LINK, 'SELECT UserID, Email FROM users WHERE UserID = 999')
SET Email = 'updated@example.com';

常見錯誤排查表

錯誤訊息原因解決
Data source name not found...用使用者 DSN、DSN 名稱錯誤、架構不符 (32/64-bit)改用系統 DSN、確認架構一致
Cannot initialize the data source object...MySQL 伺服器不可達、連接埠封鎖、帳戶無遠端權限檢查網路、防火牆、MySQL GRANT ... @'%'
OLE DB provider "MSDASQL" reported error...驅動版本不符、字元集編碼問題升級驅動、DSN 設定 charset=utf8mb4
Distributed transaction error (MSDTC)跨伺服器寫入需分散式交易啟用 MSDTC、或改用 OPENQUERY 單向寫入

效能與安全建議

  • 大量資料查詢 務必用 OPENQUERY 下推過濾到 MySQL 端
  • 建立 MySQL View/SP 封裝複雜邏輯,SQL Server 僅呼叫
  • 連結伺服器密碼加密儲存 (sp_addlinkedsrvlogin 自動加密)
  • 限制連結伺服器存取權限:GRANT SELECT ON LinkedServer::MYSQL_LINK TO [AppRole]
  • 監控 sys.dm_exec_connections 連結伺服器連線數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved