早期 SQL Server 提供「遠端伺服器」功能讓用戶透過一台 SQL Server 連接另一台執行預存程序。但受限於安全性、效能與異構支援,Microsoft 官方已明確建議改用「連結伺服器」。本文深度解析連結伺服器在架構、安全、異構存取、OLE DB 提供者配置上的優勢,並提供管理控制台與系統預存程序兩種部署方式。
遠端伺服器僅支援 SQL Server 之間。連結伺服器透過 OLE DB Provider,支援:
資料遷移、跨平台報表、主從同步場景極具價值。
連結伺服器提供精細的 登入映射 機制:
sp_addlinkedsrvlogin 管理映射關係,集中管控,避免連接字串硬編碼在應用程式/預存程序中。實現「保安」角色:連結伺服器驗證本地身份後,才代理遠端連線,阻擋未授權存取。
提供者選項 (Provider Options) 可控制行為:
| 參數 | 功能 | 典型值 |
|---|---|---|
| NestedQueries | 允許 FROM 子句巢狀 SELECT | 0=禁止, 非0=允許 |
| NonTransactedUpdates | 允許非交易更新 (無法 Rollback) | 0=允許更新, 非0=禁止 |
| DynamicParameters | 支援參數化查詢 | 1=啟用 |
建議: 初學者保持預設值;進階調校需充分測試,錯誤參數導致查詢失敗極難排查。
物件總管 → 伺服器物件 → 連結伺服器 → 右鍵「新增連結伺服器」 → 填寫一般/安全性/伺服器選項頁籤。直觀、即時驗證。
-- 建立
EXEC sp_addlinkedserver
@server = 'LINK_ORA',
@srvproduct = 'Oracle',
@provider = 'OraOLEDB.Oracle',
@datasrc = 'ORCL_TNS';
-- 登入映射
EXEC sp_addlinkedsrvlogin 'LINK_ORA', 'false', NULL, 'ora_user', 'ora_pwd';
-- 查詢元資料
SELECT * FROM sys.servers WHERE is_linked = 1;
SELECT * FROM sys.linked_logins WHERE server_id = (SELECT server_id FROM sys.servers WHERE name = 'LINK_ORA');
-- 移除
EXEC sp_dropserver 'LINK_ORA', 'droplogins';
連結伺服器是分散式查詢的基礎設施。查詢優化器會分析遠端資料列集請求,決定在遠端執行 (下推謂詞、聯結) 或拉回本地處理。善用 OPENQUERY 強制遠端執行複雜邏輯,減少跨網路資料傳輸。
連結伺服器以獨立 OLE DB 架構提供優異效能、完整異構支援、集中安全映射管理,全面超越遠端伺服器。掌握 sp_addlinkedserver/sp_addlinkedsrvlogin 腳本化部署、提供者參數調校、分散式查詢優化技巧,是跨平台資料整合的核心能力。