SQL Server 2005 引入 **同義詞** 輕量級抽象機制:為現有物件 (資料表、檢視表、函數、預存程序) 建立替代名稱。**同義詞不儲存資料,僅儲存解析路徑**,在查詢編譯期透明導向基底物件。本文深度解析同義詞在**跨資料庫重構**、**舊版相容**、**分散式查詢簡化** 三大場景的實戰模式。
CREATE SYNONYM [Schema.]SynonymName
FOR [Server].[Database].[Schema].ObjectName;
-- Server 僅支援連結伺服器四部分名稱
Inventory 資料庫包含 SalesHistory 表SalesHistory 移至獨立 SalesData 資料庫 (效能隔離、備份策略差異)Inventory.dbo.SalesHistory,**無時間逐一修改**SalesData 建立新表並同步資料 (SSIS/複寫/BCP)Inventory 重命名舊表:EXEC sp_rename 'dbo.SalesHistory', 'SalesHistory_Old'Inventory 建立同義詞導向新位置:
USE Inventory;
GO
CREATE SYNONYM dbo.SalesHistory
FOR SalesData.dbo.SalesHistory;
GO
Inventory.dbo.SalesHistory 的程式碼**零修改**繼續運作SalesData.dbo.SalesHistoryDROP SYNONYM dbo.SalesHistory; EXEC sp_rename 'dbo.SalesHistory_Old', 'SalesHistory'
-- 原始分散式查詢
SELECT * FROM [PROD-SQL-01].[ERP].[dbo].[Customers];
-- 建立同義詞
CREATE SYNONYM dbo.ERP_Customers
FOR [PROD-SQL-01].[ERP].[dbo].[Customers];
-- 簡化後
SELECT * FROM dbo.ERP_Customers WHERE Region = 'APAC';
舊系統使用 usp_GetCustomerList,新版重構為 dbo.GetCustomerList (表值函數)。建立同義詞:
CREATE SYNONYM dbo.usp_GetCustomerList
FOR dbo.GetCustomerList;
舊程式碼繼續呼叫 EXEC usp_GetCustomerList,實際執行新函數。**同義詞支援函數、預存程序、檢視表、資料表** 互相導向。
同義詞**不能**指向另一個同義詞,否則建立時會報錯。每個同義詞必須直接指向基底物件。
GRANT SELECT ON SalesData.dbo.SalesHistory TO AppRole
SELECT name, base_object_name
FROM sys.synonyms
WHERE name = 'SalesHistory';
IF EXISTS (SELECT 1 FROM sys.synonyms WHERE name = 'SalesHistory')
DROP SYNONYM dbo.SalesHistory;
CREATE SYNONYM dbo.SalesHistory FOR SalesData.dbo.SalesHistory;
同義詞是 SQL Server **「輕量級、零侵入、延遲繫結」** 的抽象層利器。核心價值在於:
建議在**資料庫重構專案啟動時**即規劃同義詞策略,將所有跨資料庫/跨伺服器引用統一導向同義詞層,賦予架構演進彈性。