プライマリ・コンテンツに移動
Oracle® Database SQL言語リファレンス
12cリリース1 (12.1)
B71278-13
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

CREATE SYNONYM

用途

CREATE SYNONYM文を使用すると、シノニムを作成できます。シノニムとは、表、ビュー、順序、演算子、プロシージャ、ストアド・ファンクション、パッケージ、マテリアライズド・ビュー、Javaクラス・スキーマ・オブジェクト、ユーザー定義オブジェクト型または別のシノニムに付ける別名です。シノニムによってシノニムのターゲット・オブジェクトへの依存関係が設定され、ターゲット・オブジェクトが変更または削除されるとシノニムも無効になります。

シノニムによって、データの独立性および位置の透過性を実現できます。シノニムを使用した場合、どのユーザーが表やビューを所有しているか、どのデータベースに表やビューが格納されているかに関係なく、アプリケーションは変更なしで機能します。ただし、シノニムはデータベース・オブジェクトに対する権限にかわるものではありません。シノニムを使用するユーザーに対して、適切な権限をあらかじめ付与しておく必要があります。

シノニムを参照できるDML文は、SELECTINSERTUPDATEDELETEFLASHBACK TABLEEXPLAIN PLANおよびLOCK TABLEです。

シノニムを参照できるDDL文は、AUDITNOAUDITGRANTREVOKEおよびCOMMENTです。


関連項目:

シノニムの概要については、『Oracle Database概要』を参照してください。

前提条件

自分のスキーマ内にプライベート・シノニムを作成する場合は、CREATE SYNONYMシステム権限が必要です。

他のユーザーのスキーマ内にプライベート・シノニムを作成する場合は、CREATE ANY SYNONYMシステム権限が必要です。

PUBLICシノニムを作成する場合は、CREATE PUBLIC SYNONYMシステム権限が必要です。

構文

create_synonym::=

create_synonym.gifの説明が続きます。
図create_synonym.gifの説明

セマンティクス

OR REPLACE

OR REPLACEを指定すると、既存のシノニムを再作成できます。この句を使用すると、既存のシノニムの定義をはじめに削除しなくても、その定義を変更できます。

シノニムの置換の制限事項: OR REPLACE句は、依存表または依存する有効なユーザー定義オブジェクト型を持つ型シノニムに対して使用できません。

[ EDITIONABLE | NONEDITIONABLE ]

この句を使用すると、schemaのスキーマ・オブジェクト・タイプSYNONYMのエディショニングが有効化されたときに、そのシノニムをエディション・オブジェクトにするか非エディション・オブジェクトにするかを指定できます。プライベート・シノニムの場合、デフォルトはEDITIONABLEです。パブリック・シノニムの場合、デフォルトはNONEDITIONABLEです。エディション・オブジェクトと非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。

PUBLIC

PUBLICを指定すると、パブリック・シノニムを作成できます。パブリック・シノニムには、すべてのユーザーがアクセスできます。ただし、シノニムを使用するには、基礎となるオブジェクトに対する適切な権限が必要です。

オブジェクトの先頭にスキーマ名が指定されておらず、オブジェクトの後にデータベース・リンクが指定されていない場合のみ、オブジェクトへの参照を変換するときに、パブリック・シノニムが使用されます。

この句を指定しない場合、シノニムはプライベートです。プライベート・シノニム名は、スキーマ内で一意である必要があります。プライベート・シノニムに所有者以外のユーザーがアクセスできるのは、基礎となるデータベース・オブジェクトに対する適切な権限がユーザーにあり、シノニム名とともにスキーマを指定する場合のみです。

パブリック・シノニムの注意事項: パブリック・シノニムには、次の注意事項があります。

  • パブリック・シノニムを作成した後、依存表または依存する有効なユーザー定義オブジェクト型が存在する場合、依存オブジェクトと同じスキーマ内には、そのシノニムと同じ名前で別のデータベース・オブジェクトは作成できません。

  • 既存のスキーマと同じ名前のパブリック・シノニムを作成しないでください。同じ名前のパブリック・シノニムを作成すると、その名前が使用されるすべてのPL/SQLユニットが無効になります。

schema

シノニムを含めるスキーマを指定します。schemaを省略した場合、自分のスキーマ内にシノニムが作成されます。PUBLICを指定した場合、スキーマは指定できません。

synonym

作成するシノニムの名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。


注意:

シノニム名は、30バイトを超える場合も作成および削除できます。ただし、Java名でない場合は他のSQLコマンドで機能しません。30バイトを超える名前は、データ・ディクショナリに格納するために不確定で短い文字列に変換されます。


関連項目:

「CREATE SYNONYMの例:」および「Oracle Databaseによるシノニムの変換例:」を参照してください。

FOR句

シノニムを作成するオブジェクトを指定します。シノニムを作成するスキーマ・オブジェクトには、次のものがあります。

  • 表またはオブジェクト表

  • ビューまたはオブジェクト・ビュー

  • 順序

  • ストアド・プロシージャ、ファンクションまたはパッケージ

  • マテリアライズド・ビュー

  • Javaクラス・スキーマ・オブジェクト

  • ユーザー定義オブジェクト型

  • シノニム

スキーマ・オブジェクトは、現在存在している必要はなく、スキーマ・オブジェクトへのアクセス権限も必要ありません。

FOR句の制限事項: スキーマ・オブジェクトは、パッケージに含めることはできません。

schema オブジェクトが含まれているスキーマを指定します。オブジェクトにschemaを指定しなかった場合、そのスキーマ・オブジェクトは自分のスキーマ内にあるとみなされます。

リモート・データベース上のプロシージャやファンクションに対するシノニムを作成する場合、このCREATE文でschemaを指定する必要があります。または、オブジェクトが存在するデータベースにローカル・パブリック・シノニムを作成することもできます。ただし、その後は、プロシージャやファンクションの後続のコールすべてにデータベース・リンクを組み込む必要があります。

dblink  データベース・リンクを完全に指定するか、またはデータベース・リンクの一部を指定すると、スキーマ・オブジェクトが格納されているリモート・データベース上のオブジェクトのシノニムを作成できます。dblinkを指定して、schemaを省略した場合、シノニムは、データベース・リンクで指定されたスキーマ内のオブジェクトを参照します。リモート・データベースのオブジェクトが含まれているスキーマを指定することをお薦めします。

dblinkを省略した場合、オブジェクトがローカル・データベース上にあるものとみなされます。

データベース・リンクの制限事項: dblinkは、Javaクラス・シノニムに対して指定できません。


関連項目:


CREATE SYNONYMの例: 次の文は、スキーマhr内の表locationsに対してシノニムofficesを定義します。

CREATE SYNONYM offices 
   FOR hr.locations;

remoteデータベース上のスキーマhr内のemployees表に対してPUBLICシノニムを作成するには、次の文を発行します。

CREATE PUBLIC SYNONYM emp_table 
   FOR hr.employees@remote.us.example.com;

別のスキーマ内に基礎となるオブジェクトが含まれている場合は、基礎となるオブジェクトと同じ名前をシノニムに指定することもできます。

Oracle Databaseによるシノニムの変換例 Oracle Databaseは、オブジェクトの参照を、PUBLICシノニム・レベルで変換する前に、スキーマ・レベルで変換しようとします。たとえば、スキーマoeshの両方にcustomersという名前の表が存在するとします。次の例では、ユーザーSYSTEMが、oe.customersに対してcustomersという名前のPUBLICシノニムを作成します。

CREATE PUBLIC SYNONYM customers FOR oe.customers;

ユーザーshが次の文を発行すると、sh.customersから行数が戻されます。

SELECT COUNT(*) FROM customers;

oe.customersから行数を取得するには、ユーザーshは、customersの前にスキーマ名を指定する必要があります。(ユーザーshは、oe.customersに対するSELECT権限も持っている必要があります。)

SELECT COUNT(*) FROM oe.customers;

ユーザーhrのスキーマにcustomersという名前のオブジェクトは存在しないが、hroe.customersに対するSELECT権限を持つ場合、hrは、パブリック・シノニムcustomersを使用して、oeのスキーマ内のcustomers表にアクセスできます。

SELECT COUNT(*) FROM customers;