搜尋本站文章

2010-07-24

認識「同義字(SYNONYM)」

在 SQL Server 2005 上增加了「同義字(SYNONYM)」。

同義字是結構描述範圍物件的替代名稱。

用戶端應用程式可以利用同義字,使用單一部份名稱來參考基底物件,而不是使用兩部份、三部份或四部份名稱來參考基底物件。

同義字是具有下列用途的資料庫物件:

  • 對在本機或遠端伺服器上的另一個資料庫物件 (稱為基底物件) 提供別名。
  • 提供抽象層來保護用戶端應用程式,避免變更基底物件的名稱或位置。

例如,以位於伺服器 Server1 上 AdventureWorks2008R2 範例資料庫的 Employee 資料表為例。
若要從另一個伺服器 Server2 參考此資料表,用戶端應用程式使用的名稱必須包含四個部分:Server1.AdventureWorks.HumanResources.Employee。

另外,若是資料表的位置已變更 (例如,變更至另一個伺服器),則必須修改用戶端應用程式以反映該變更。

若要解決這些問題,您可以在 Server2 建立同義字 EmpTable,來代表在 Server1 的 Employee 資料表。
現在,用戶端應用程式只需要使用單一部份的名稱 EmpTable 來參考 Employee 資料表。

此外,如果 Employee 資料表的位置變更,您必須修改同義字 EmpTable,指向 Employee 資料表的新位置。
因為沒有 ALTER SYNONYM 陳述式,首先您必須卸除同義字 EmpTable,再以相同的名稱重新建立同義字,但要將同義字指向 Employee 的新位置。




請參考以下的範例程式碼:

--EX1. 橫跨資料庫使用「同義字(SYNONYM)」
--01 建立「同義字(SYNONYM)」
/*
在資料庫 AdventureWorks2008 內,替另外一個資料庫 Northwind 上的資料表 dbo.Orders ,建立「同義字(SYNONYM)」:dbo.nw_dbo_Orders。
*/
USE AdventureWorks2008
GO
IF  EXISTS (SELECT * FROM sys.synonyms WHERE name = N'nw_dbo_Orders')
DROP SYNONYM [dbo].[nw_dbo_Orders]
GO
CREATE SYNONYM [dbo].[nw_dbo_Orders] 
FOR [Northwind].[dbo].[Orders]
GO

請參考下圖所示:




--02 查詢「同義字(SYNONYM)」:dbo.nw_dbo_Orders,但此「同義字」物件,一直被系統判斷為無效的物件,看來系統無法偵測「同義字」是否存在、正確等特性。
SELECT * FROM dbo.nw_dbo_Orders

請參考下圖所示:


--03 檢視「執行計畫」的差異:查詢「同義字」物件 vs. 使用三部分名稱(資料庫.結構描述.物件)
-- 結果:無論是查詢「同義字」或是資料表,都是耗用相同的成本(Subtree Cost)
SELECT * FROM dbo.nw_dbo_Orders
WHERE OrderID=10248
--
SELECT * FROM Northwind.dbo.Orders
WHERE OrderID=10248

請參考下圖所示:






同義字和基底物件之間只透過名稱繫結。
基底物件的存在性、類型及權限,全部會延遲到執行階段再檢查。

因此,和原始基底物件名稱相同的另一個物件,可以修改、卸除或卸除並取代基底物件。

例如,以同義字 MyContacts 為例,此同義字參考 Adventure Works 中的 Person.Person 資料表。
如果 Person 資料表被卸除並由名稱為 Person.Person 的檢視所取代,則 MyContacts 會變成參考 Person.Person 檢視。

同義字的參考不受結構描述的約束。
因此,隨時可以卸除同義字。

不過,如果卸除同義字,已卸除的同義字有可能會留下懸吊參考。
只有等到執行階段才會發現這種參考。

您可以使用同義字在數個 SQL 陳述式和運算式內容中取代其參考的基底物件。


下表包含這些陳述式及運算式內容的清單:
SELECT、INSERT、UPDATE、DELETE、EXECUTE、子 SELECT

Sys.synonyms 目錄檢視含有一個關於給定資料庫中各個同義字的項目。
此目錄檢視會公開同義字中繼資料,例如同義字的名稱與基底物件的名稱。

透過擴充屬性的運用,您可以將描述性或指示性文字、輸入遮罩以及格式化規則新增為同義字的屬性。
由於屬性儲存在資料庫中,因此讀取屬性的所有應用程式都能夠以同樣的方式評估物件。

若要尋找同義字基底物件的基底類型,請使用 OBJECTPROPERTYEX 函數。



注意事項:
不支援函數基底物件的四部份名稱。
同義字不可為另一個同義字的基底物件,而且同義字不可以參考使用者自訂的彙總函式。

只有同義字擁有者、db_owner 的成員或 db_ddladmin 的成員,才可授與同義字的權限。
您無法參考位於連結伺的服器上的同義字。

您無法在 DDL 陳述式中參考同義字。


同義字不是結構描述繫結性質,因此,下列結構描述繫結的運算式內容無法參考同義字:
CHECK 條件約束、計算資料行、預設運算式、規則運算式、結構描述繫結的檢視、結構描述繫結的函數



參考資料:
CREATE SYNONYM (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms177544.aspx