共用方式為


同義字 (資料庫引擎)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

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

  • 對在本機或遠端伺服器上的另一個資料庫物件 (稱為基底物件) 提供別名。

  • 提供抽象層來保護用戶端應用程式,避免變更基底物件的名稱或位置。

例如,以位於伺服器 Server1 上的 Adventure Works Employee 資料表為例。 若要從另一個伺服器 Server2參考此資料表,用戶端應用程式使用的名稱必須包含四個部分: Server1.AdventureWorks.Person.Employee。 另外,若是資料表的位置已變更 (例如,變更至另一個伺服器),則必須修改用戶端應用程式以反映該變更。

若要解決這些問題,您可以在 Server2 上的專用或現有架構 RemoteObjects 中建立同義字 EmpTable,來代表 Server1Employee 資料表。 現在,用戶端應用程式只需要使用兩部分名稱 RemoteObjects.EmpTable,即可參考 Employee 資料表 Server1。 此外,如果 Employee 資料表的位置變更,您必須修改同義字 EmpTable以指向 Employee 資料表的新位置。 由於沒有 ALTER SYNONYM 陳述式,因此您必須先卸除同義字 RemoteObjects.EmpTable,然後重新建立同名同義字,但現在要將同義字指向 Employee 資料表的新位置。

同義字放在結構描述中,如同結構描述中的其他物件一樣,同義字的名稱也必須是唯一的。 您可以為下列資料庫物件建立同義字:

組件 (CLR) 存儲過程

組件 (CLR) 純量函數

複寫篩選程序

SQL 純量函數

SQL 內嵌資料表值函式

檢視

組件 (CLR) 資料表值函式

組件 (CLR) 彙總函式

SQL 資料表值函式

SQL 預存程序

資料表* (使用者定義)

*包括本機和全域暫存資料表

注意

不支援函數基底物件的四部份名稱。

同義字不可為另一個同義字的基底物件,而且同義字不可以參考使用者自訂的彙總函式。

同義字和基底物件之間只透過名稱繫結。 基底物件的存在性、類型及權限,全部會延遲到執行階段再檢查。 因此,原始基底物件可以被修改、卸除,或者被卸除並由另一個具有相同名稱的物件取代。 例如,以同義字 dbo.MyContacts 為例,此同義字參考 Adventure Works 中的 Person.Contact 資料表。 如果 Contact 資料表被卸除並由名稱為 Person.Contact的檢視所取代,則 MyContacts 會變成參考 Person.Contact 檢視。

同義字的參考不受結構描述的約束。 因此,隨時可以卸除同義字。 不過,如果移除某個同義字,您可能冒著遺留下與該同義字相關的孤立引用的風險。 這些參考只有在執行時才會發現。

同義字和結構描述

如果預設的結構描述不是由您擁有,但您想要建立同義字,則必須使用您擁有的結構描述名稱來限定同義字名稱。 例如,如果您擁有結構描述 S1,但預設結構描述是 S2,且您使用 CREATE SYNONYM 陳述式,則必須以結構描述 S1 作為同義字名稱的前置詞,而不是使用單一部分名稱來命名同義字。 如需如何建立同義字的詳細資訊,請參閱 CREATE SYNONYM (Transact-SQL)

授與同義字的權限

只有同義字擁有者、 db_owner的成員或 db_ddladmin 的成員,才可授與同義字的權限。

您可以對同義字的任何或所有下列權限進行 GRANTDENYREVOKE

控制

執行 CREATE 陳述式之前,請先執行命令。

SELECT

更新

刪除

插入

掌握所有權

檢視定義

使用同義字

您可以使用同義字在數個 SQL 陳述式和運算式內容中取代其參考的基底物件。 下列欄位包含這些陳述式和運算式內容的清單:

SELECT

更新

執行 CREATE 陳述式之前,請先執行命令。

插入

刪除

子查詢

當您在前述上下文中使用同義字時,基底物件會受到影響。 例如,如果同義字參考的基底物件是資料表,而且您將資料列插入同義字,則實際上您是將資料列插入參考的資料表。

注意

您無法引用位於連結伺服器上的同義字。

您可以使用同義字做為 OBJECT_ID 函數的參數。不過,此函數會傳回同義字的物件識別碼,而非基底物件。

您無法在 DDL 陳述式中參考同義字。 例如,下列陳述式 (參考名為 dbo.MyProduct的同義字) 會產生錯誤:

ALTER TABLE dbo.MyProduct  
   ADD NewFlag int null;  
EXEC ('ALTER TABLE dbo.MyProduct  
   ADD NewFlag int null');  

下列權限陳述式只與同義字有關聯,但與基底物件無關:

授權

撤銷

拒絕

同義詞不是架構綁定的,因此,下列架構綁定的表達式內容無法引用同義詞:

CHECK 約束條件

預設表達式

結構綁定視圖

計算資料行

規則表達式

綱要綁定的函數

如需結構描述繫結函數的詳細資訊,請參閱建立使用者定義函數 (資料庫引擎)

取得同義字的相關資訊

sys.synonyms 目錄檢視會針對特定資料庫中的每個同義字包含一個項目。 此目錄檢視會公開同義字中繼資料,例如同義字的名稱與基底物件的名稱。 如需詳細資訊,請參閱 sys.synonyms (Transact-SQL)

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

若要尋找同義字基底物件的基底類型,請使用 OBJECTPROPERTYEX 函數。 如需詳細資訊,請參閱 OBJECTPROPERTYEX (Transact-SQL)

範例

以下範例將傳回同義字基底物件的基礎型別,該基底物件是本機物件。

USE tempdb;  
GO
CREATE SCHEMA SynSchema
GO  
CREATE SYNONYM SynSchema.MyEmployee   
FOR AdventureWorks2022.HumanResources.Employee;  
GO  
SELECT OBJECTPROPERTYEX(OBJECT_ID('SynSchema.MyEmployee'), 'BaseType') AS BaseType;  

以下範例將傳回屬於遠端物件 (位於 Server1伺服器上) 之同義字基底物件的基底類型。

EXECUTE sp_addlinkedserver Server1;  
GO  
CREATE SYNONYM SynSchema.MyRemoteEmployee  
FOR Server1.AdventureWorks2022.HumanResources.Employee;  
GO  
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyRemoteEmployee'), 'BaseType') AS BaseType;  
GO  

建立同義字
建立同義詞 (Transact-SQL)
刪除同義詞 (Transact-SQL)