シノニム (データベース エンジン)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

シノニムは、次の目的で機能するデータベース オブジェクトです。

  • ベース オブジェクトと呼ばれる別のデータベース オブジェクトの代替名を提供します。ベース オブジェクトは、ローカル サーバーまたはリモート サーバーに配置できます。

  • ベース オブジェクトの名前や場所に加えられた変更からクライアント アプリケーションを保護する抽象層を提供します。

たとえば、Server1 という名前のサーバーにAdventure WorksのEmployeeテーブルがあるとします。 クライアント アプリケーションで、このテーブルを別のサーバー ( Server2) から参照するには、 Server1.AdventureWorks.Person.Employeeという 4 部構成の名前を使用する必要があります。 また、テーブルの場所を別のサーバーなどに変更する場合は、その変更内容を反映してクライアント アプリケーションを変更する必要があります。

このような問題の両方に対処するには、Server2上の専用スキーマまたは既存のスキーマであるRemoteObjectsに、Server1上のEmployeeテーブルのシノニムであるEmpTableを作成します。 これで、クライアント アプリケーションから Server1 のEmployeeテーブルを参照するときに、 RemoteObjects.EmpTableという 2 部構成の名前を使用するだけで済みます。 また、 Employee テーブルの場所が変更された場合は、 Employeeテーブルの新しい場所を指すように、シノニムである EmpTable を変更する必要があります。 ALTER SYNONYM というステートメントは存在しないので、RemoteObjects.EmpTableというシノニムをいったん削除してから、 Employeeテーブルの新しい場所を指す同じ名前のシノニムを作成する必要があります。

シノニムはスキーマに属しています。したがって、スキーマ内の他のオブジェクトと同様に、シノニムの名前は一意にする必要があります。 シノニムは、次のデータベース オブジェクトに対して作成できます。

アセンブリ (CLR) ストアド プロシージャ

アセンブリ (CLR) スカラー関数

レプリケーション フィルター プロシージャ

SQL スカラー関数

SQL インライン テーブル値関数

表示

アセンブリ (CLR) テーブル値関数

アセンブリ (CLR) 集計関数

SQL テーブル値関数

SQL ストアド プロシージャ

テーブル* (ユーザー定義)

*ローカル一時テーブルとグローバル一時テーブルが含まれます。

注意

4 部構成の関数ベース オブジェクト名はサポートされません。

あるシノニムを別のシノニムのベース オブジェクトにすることはできません。また、シノニムからユーザー定義集計関数を参照することもできません。

シノニムとベース オブジェクトとのバインドは、名前だけで行われます。 ベース オブジェクトの存在、種類、および権限のチェックは、すべて実行時まで行われません。 このため、ベース オブジェクトの変更や削除を行うことも、または削除してから元のベース オブジェクトと同じ名前の別のオブジェクトに置換することもできます。 たとえば、Adventure Works の Person.Contact テーブルを参照するdbo.MyContacts というシノニムがあるとします。 Contact テーブルを削除し、 Person.Contactというビューに置き換えると、 MyContactsPerson.Contact ビューを参照するようになります。

シノニムへの参照は、スキーマにはバインドされていません。 したがって、シノニムはいつでも削除できます。 ただし、シノニムを削除することにより、削除されたシノニムへの参照が未解決の状態になる可能性があります。 このような参照は、実行時まで見つかりません。

シノニムとスキーマ

所有者が自分ではない既定のスキーマのシノニムを作成する場合は、自分が所有しているスキーマ名でシノニム名を修飾する必要があります。 たとえば、 S1というスキーマを所有していて、既定のスキーマが S2 だとします。この状況で CREATE SYNONYM ステートメントを使用する場合は、1 部構成の名前を使用してシノニムに名前を付けるのではなく、スキーマ S1をシノニム名のプレフィックスにする必要があります。 シノニムの作成方法の詳細については、「CREATE SYNONYM (Transact-SQL)」を参照してください。

シノニムに対する権限の許可

シノニムに対する権限を許可できるのは、シノニムの所有者、 db_owner、または db_ddladmin のみです。

次に示すシノニムに対する権限は、すべてまたはいくつかに GRANTDENY、および REVOKE を行うことができます。

CONTROL

EXECUTE

SELECT

UPDATE

Del

INSERT

TAKE OWNERSHIP

VIEW DEFINITION

シノニムの使用

いくつかの SQL ステートメントや式のコンテキストでは、参照先のベース オブジェクトの代わりにシノニムを使用できます。 次の列に、これに該当するステートメントや式のコンテキストを示します。

SELECT

UPDATE

EXECUTE

INSERT

Del

副選択式

前に示したコンテキストでシノニムを扱っているときは、ベース オブジェクトが影響を受けます。 たとえば、シノニムが参照するベース オブジェクトがテーブルの場合に、シノニムに行を挿入すると、実際に参照先のテーブルに行が挿入されます。

注意

リンク サーバー上のシノニムを参照することはできません。

OBJECT_ID 関数のパラメーターとしてシノニムを使用できます。ただし、この関数はベース オブジェクトではなく、シノニムのオブジェクト ID を返します。

DDL ステートメントでシノニムを参照することはできません。 たとえば、 dbo.MyProductという名前のシノニムを参照する次のステートメントでは、エラーが生成されます。

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

次の権限ステートメントは、シノニムのみに関連付けられ、ベース オブジェクトには影響しません。

GRANT

REVOKE

DENY

シノニムはスキーマ バインド オブジェクトではないので、次のスキーマ バインド式コンテキストからは参照できません。

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  

シノニムの作成
CREATE SYNONYM (Transact-SQL)
DROP SYNONYM (Transact-SQL)