同義字是提供下列用途的資料庫物件:
提供另一個資料庫物件的替代名稱,稱為基底物件,可存在於本機或遠端伺服器上。
提供一層抽象概念,可保護用戶端應用程式免於對基底對象的名稱或位置所做的變更。
例如,請考慮 Adventure Works 的 Employee 數據表,位於名為 Server1 的伺服器上。 若要從另一部伺服器參照此數據表, Server2,用戶端應用程式必須使用四部分名稱 Server1.AdventureWorks.Person.Employee。 此外,如果數據表的位置要變更為另一部伺服器,則必須修改用戶端應用程式以反映該變更。
若要解決這兩個問題,您可以在 Server1 上的 Employee 數據表的 Server2 上建立同義字 EmpTable。 現在,用戶端應用程式只需要使用單一部分名稱 EmpTable 來參考 Employee 數據表。 此外,如果 Employee 數據表的位置變更,您必須修改同義字 EmpTable,以指向 Employee 數據表的新位置。 因為沒有 ALTER SYNONYM 語句,您必須先卸除同義字 EmpTable,然後重新建立同名同義字,但將同義字指向 Employee 的新位置。
同義字屬於架構,就像架構中的其他對象一樣,同義字的名稱必須是唯一的。 您可以建立下列資料庫物件的同義字:
| 組件 (CLR) 預存程序 | 程序集(CLR)表值函數 |
| 程序集(CLR)純量函式 | 元件 (CLR) 聚合函數 |
| 複製篩選程序 | 延伸儲存程序 |
| SQL 純量函式 | SQL 資料表值函式 |
| SQL 內嵌的返回資料表的函式 | SQL 預存程式 |
| 查看 | 表1 (使用者定義) |
1 包含本地和全域臨時資料表
備註
不支援四部分名稱的函數基本對象。
同義字不能是另一個同義字的基底物件,同義字不能參考用戶定義的聚合函數。
同義字與其基底對象之間的系結只有名稱。 基底物件上的所有存在、類型和許可權檢查都會延遲到運行時間。 因此,基底物件可以修改、移除或移除後以另一個具有與原始基底物件同樣名稱的物件取代。 例如,請考慮參考 Adventure Works 中 Person.Contact 數據表的同義字 MyContacts。 如果 [ 聯繫人 ] 數據表已卸除,並以名為 Person.Contact 的檢視取代, MyContacts 現在會參考 Person.Contact 檢視。
對於同義詞的引用不受架構綁定。 因此,您可以隨時卸除同義字。 不過,刪除同義字會冒著使對該同義字的引用懸空的風險。 這些參考只會在執行時間中找到。
同義字和架構
如果您有一個您不擁有的默認架構,但想為其建立同義字,則必須使用您擁有的架構名稱為該同義字命名。 例如,如果您擁有架構 x,但 y 是預設架構,而且您使用 CREATE SYNONYM 語句,則必須在同義字名稱前面加上架構 x,而不是使用單一部分名稱來命名同義字。 如需如何建立同義字的詳細資訊,請參閱 CREATE SYNONYM (Transact-SQL) 。
授與同義詞的許可權
只有同義字擁有者、 db_owner成員或 db_ddladmin 成員可以授與同義字的許可權。
您可以在同義字上授予、拒絕、撤銷所有或下列任何許可權:
| 控制 | 刪除 |
| 執行指令 | 插入 |
| 選擇 | 掌握主控權 |
| 更新 | 檢視定義 |
使用同義字
您可以在數個 SQL 語句和表示式內容中使用同義字來取代其參考基底物件。 下表包含這些語句和表示式內容的清單:
| 選擇 | 插入 |
| 更新 | 刪除 |
| 執行指令 | 子選取 |
當您在先前所述的內容中使用同義字時,基底物件會受到影響。 例如,如果同義字參考的是數據表的基底物件,而您將數據列插入同義字中,實際上就是將數據列插入參考數據表中。
備註
您無法參考位於連結伺服器上的同義字。
您可以使用同義字作為OBJECT_ID函式的參數;不過,函式會傳回同義字的物件標識符,而不是基底物件。
您無法在 DDL 語句中參考同義字。 例如,下列語句會參考名為 dbo.MyProduct的同義字,會產生錯誤:
ALTER TABLE dbo.MyProduct
ADD NewFlag int null;
EXEC ('ALTER TABLE dbo.MyProduct
ADD NewFlag int null');
下列許可權語句只會與同義字相關聯,而不是基底物件:
| 許可 | 否認 |
| 撤銷 |
同義字不是架構系結,因此無法由下列架構系結表達式內容參考:
| 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