同義字是具有下列用途的資料庫物件:
對在本機或遠端伺服器上的另一個資料庫物件 (稱為基底物件) 提供別名。
提供抽象層來保護用戶端應用程式,避免變更基底物件的名稱或位置。
例如,以位於伺服器 Server1 上 Adventure Works 的 Employee 資料表為例。 若要從另一個伺服器 Server2 參考此資料表,用戶端應用程式使用的名稱必須包含四個部份:Server1.AdventureWorks.Person.Employee。 另外,若是資料表的位置已變更 (例如,變更至另一個伺服器),則必須修改用戶端應用程式以反映該變更。
若要解決這些問題,您可以在 Server2 建立同義字 EmpTable,來代表在 Server1 的 Employee 資料表。 現在,用戶端應用程式只需要使用單一部份的名稱 EmpTable 來參考 Employee 資料表。 此外,如果 Employee 資料表的位置變更,您必須修改同義字 EmpTable,指向 Employee 資料表的新位置。 因為沒有 ALTER SYNONYM 陳述式,首先您必須卸除同義字 EmpTable,再以相同的名稱重新建立同義字,但要將同義字指向 Employee 的新位置。
同義字放在結構描述中,如同結構描述中的其他物件一樣,同義字的名稱也必須是唯一的。 您可以為下列資料庫物件建立同義字:
組件 (CLR) 預存程序 |
組件 (CLR) 資料表值函式 |
組件 (CLR) 純量函數 |
組件 (CLR) 彙總函式 |
複寫篩選程序 |
擴充預存程序 |
SQL 純量函數 |
SQL 資料表值函式 |
SQL 內嵌資料表值函式 |
SQL 預存程序 |
檢視 |
資料表1 (使用者自訂) |
1 包含本機和全域暫存資料表
[!附註]
不支援函數基底物件的四部份名稱。
同義字不可為另一個同義字的基底物件,而且同義字不可以參考使用者自訂的彙總函式。
同義字和基底物件之間只透過名稱繫結。 基底物件的存在性、類型及權限,全部會延遲到執行階段再檢查。 因此,和原始基底物件名稱相同的另一個物件,可以修改、卸除或卸除並取代基底物件。 例如,以同義字 MyContacts 為例,此同義字參考 Adventure Works 中的 Person.Contact 資料表。 如果 Contact 資料表被卸除並由名稱為 Person.Contact 的檢視所取代,則 MyContacts 會變成參考 Person.Contact 檢視。
同義字的參考不受結構描述的約束。 因此,隨時可以卸除同義字。 不過,如果卸除同義字,已卸除的同義字有可能會留下懸吊參考。 只有等到執行階段才會發現這種參考。
同義字和結構描述
如果預設的結構描述不是由您擁有,但您想要建立同義字,則必須使用您擁有的結構描述名稱來限定同義字名稱。 例如,如果您擁有結構描述 x,但預設結構描述是 y,且您使用 CREATE SYNONYM 陳述式,則必須以結構描述 x 做為同義字名稱的前置詞,而非使用單一部份的名稱來命名同義字。 如需如何建立同義字的詳細資訊,請參閱<CREATE SYNONYM (Transact-SQL)>。
授與同義字的權限
只有同義字擁有者、db_owner 的成員或 db_ddladmin 的成員,才可授與同義字的權限。
您可以 GRANT、DENY、REVOKE 同義字上的任何或所有下列權限:
CONTROL |
DELETE |
EXECUTE |
INSERT |
SELECT |
TAKE OWNERSHIP |
UPDATE |
VIEW DEFINITION |
使用同義字
您可以使用同義字在數個 SQL 陳述式和運算式內容中取代其參考的基底物件。 下表包含這些陳述式及運算式內容的清單:
SELECT |
INSERT |
UPDATE |
DELETE |
EXECUTE |
子 SELECT |
當您正在先前陳述的內容中使用同義字時,基底物件會受影響。 例如,如果同義字參考的基底物件是資料表,而且您將資料列插入同義字,則實際上您是將資料列插入參考的資料表。
[!附註]
您無法參考位於連結伺的服器上的同義字。
您可以使用同義字做為 OBJECT_ID 函數的參數。不過,此函數會傳回同義字的物件識別碼,而非基底物件。
您無法在 DDL 陳述式中參考同義字。 例如,下列陳述式 (參考名為 dbo.MyProduct 的同義字) 會產生錯誤:
ALTER TABLE dbo.MyProduct
ADD NewFlag int null;
EXEC ('ALTER TABLE dbo.MyProduct
ADD NewFlag int null');
下列權限陳述式只與同義字有關聯,但與基底物件無關:
GRANT |
DENY |
REVOKE |
|
同義字不是結構描述繫結性質,因此,下列結構描述繫結的運算式內容無法參考同義字:
CHECK 條件約束 |
計算資料行 |
預設運算式 |
規則運算式 |
結構描述繫結的檢視 |
結構描述繫結的函數 |
如需結構描述繫結函數的詳細資訊,請參閱<建立使用者定義函數 (Database Engine)>。
取得同義字的相關資訊
sys.synonyms 目錄檢視會針對特定資料庫中的每個同義字包含一個項目。 此目錄檢視會公開同義字中繼資料,例如同義字的名稱與基底物件的名稱。 如需 sys.synonyms 目錄檢視的詳細資訊,請參閱<sys.synonyms (Transact-SQL)>。
透過擴充屬性的運用,您可以將描述性或指示性文字、輸入遮罩以及格式化規則新增為同義字的屬性。 由於屬性儲存在資料庫中,因此讀取屬性的所有應用程式都能夠以同樣的方式評估物件。 如需詳細資訊,請參閱<sp_addextendedproperty (Transact-SQL)>。
若要尋找同義字基底物件的基底類型,請使用 OBJECTPROPERTYEX 函數。 如需詳細資訊,請參閱<OBJECTPROPERTYEX (Transact-SQL)>。
範例
以下範例將傳回屬於本機物件之同義字基底物件的基底類型。
USE tempdb;
GO
CREATE SYNONYM MyEmployee
FOR AdventureWorks2012.HumanResources.Employee;
GO
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyEmployee'), 'BaseType') AS BaseType;
以下範例將傳回屬於遠端物件 (位於 Server1 伺服器上) 之同義字基底物件的基底類型。
EXECUTE sp_addlinkedserver Server1;
GO
CREATE SYNONYM MyRemoteEmployee
FOR Server1.AdventureWorks2012.HumanResources.Employee;
GO
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyRemoteEmployee'), 'BaseType') AS BaseType;
GO