CREATE SYNONYM
目的
CREATE
SYNONYM
文を使用すると、シノニムを作成できます。シノニムとは、表、ビュー、順序、演算子、プロシージャ、ストアド・ファンクション、パッケージ、マテリアライズド・ビュー、Javaクラス・スキーマ・オブジェクト、ユーザー定義オブジェクト型または別のシノニムに付ける別名です。シノニムによってシノニムのターゲット・オブジェクトへの依存関係が設定され、ターゲット・オブジェクトが変更または削除されるとシノニムも無効になります。
シノニムによって、データの独立性および位置の透過性を実現できます。シノニムを使用した場合、どのユーザーが表やビューを所有しているか、どのデータベースに表やビューが格納されているかに関係なく、アプリケーションは変更なしで機能します。ただし、シノニムはデータベース・オブジェクトに対する権限にかわるものではありません。シノニムを使用するユーザーに対して、適切な権限をあらかじめ付与しておく必要があります。
シノニムを参照できるDML文は、SELECT
、INSERT
、UPDATE
、DELETE
、FLASHBACK
TABLE
、EXPLAIN
PLAN
、LOCK
TABLE
、MERGE
およびCALL
です。
シノニムを参照できるDDL文は、AUDIT
、NOAUDIT
、GRANT
、REVOKE
およびCOMMENT
です。
関連項目:
シノニムの概要については、『Oracle Database概要』を参照してください。
前提条件
自分のスキーマ内にプライベート・シノニムを作成する場合は、CREATE
SYNONYM
システム権限が必要です。
他のユーザーのスキーマ内にプライベート・シノニムを作成する場合は、CREATE
ANY
SYNONYM
システム権限が必要です。
PUBLIC
シノニムを作成する場合は、CREATE
PUBLIC
SYNONYM
システム権限が必要です。
構文
create_synonym::=
セマンティクス
OR REPLACE
OR
REPLACE
を指定すると、既存のシノニムを再作成できます。この句を使用すると、既存のシノニムの定義をはじめに削除しなくても、その定義を変更できます。
シノニムの置換の制限事項
OR
REPLACE
句は、依存表または依存する有効なユーザー定義オブジェクト型を持つ型シノニムに対して使用できません。
IF NOT EXISTS
IF NOT EXISTS
を指定すると、次の効果が得られます。
-
シノニムが存在していない場合は、文の最後に新しいシノニムが作成されます。
-
シノニムが存在している場合、これは文の最後の時点にあるシノニムになります。古いものが検出されるため、新しいものは作成されません。
単一の文には、一度に1つのOR REPLACE
またはIF NOT EXISTS
を指定できます。同じ文でOR REPLACE
とIF NOT EXISTS
の両方を使用すると、ORA-11541: REPLACE and IF NOT EXISTS cannot coexist in the same DDL statement
というエラーが発生します。
IF EXISTS
はCREATE
とともに使用すると、ORA-11543: Incorrect IF NOT EXISTS clause for CREATE statement
が発生します。
[ EDITIONABLE | NONEDITIONABLE ]
この句を使用すると、schema
のスキーマ・オブジェクト・タイプSYNONYM
のエディショニングが有効化されたときに、そのシノニムをエディション・オブジェクトにするか非エディション・オブジェクトにするかを指定できます。プライベート・シノニムの場合、デフォルトはEDITIONABLE
です。パブリック・シノニムの場合、デフォルトはNONEDITIONABLE
です。エディション・オブジェクトと非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。
PUBLIC
PUBLIC
を指定すると、パブリック・シノニムを作成できます。パブリック・シノニムには、すべてのユーザーがアクセスできます。ただし、シノニムを使用するには、基礎となるオブジェクトに対する適切な権限が必要です。
オブジェクトの先頭にスキーマ名が指定されておらず、オブジェクトの後にデータベース・リンクが指定されていない場合のみ、オブジェクトへの参照を変換するときに、パブリック・シノニムが使用されます。
この句を指定しない場合、シノニムはプライベートです。プライベート・シノニム名は、スキーマ内で一意である必要があります。プライベート・シノニムに所有者以外のユーザーがアクセスできるのは、基礎となるデータベース・オブジェクトに対する適切な権限がユーザーにあり、シノニム名とともにスキーマを指定する場合のみです。
パブリック・シノニムのノート
パブリック・シノニムには、次のノートがあります。
-
パブリック・シノニムを作成した後、依存表または依存する有効なユーザー定義オブジェクト型が存在する場合、依存オブジェクトと同じスキーマ内には、そのシノニムと同じ名前で別のデータベース・オブジェクトは作成できません。
-
既存のスキーマと同じ名前のパブリック・シノニムを作成しないでください。同じ名前のパブリック・シノニムを作成すると、その名前が使用されるすべてのPL/SQLユニットが無効になります。
schema
シノニムを含めるスキーマを指定します。schema
を省略した場合、自分のスキーマ内にシノニムが作成されます。PUBLIC
を指定した場合、スキーマは指定できません。
synonym
作成するシノニムの名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
ノート:
シノニム名の最大長には、次のルールがあります。
-
COMPATIBLE
初期化パラメータが12
.2
以上の値に設定されている場合、シノニム名の最大長は128バイトです。データベースでは、129から4000バイトの長さのシノニムを作成および削除できます。ただし、これらのより長いシノニム名がJava名を表す場合を除いて、他のSQLコマンドでは機能しません。 -
COMPATIBLE
初期化パラメータが12
.2
より小さい値に設定されている場合、シノニム名の最大長は30バイトです。データベースでは、31から128バイトの長さのシノニムを作成および削除できます。ただし、これらのより長いシノニム名がJava名を表す場合を除いて、他のSQLコマンドでは機能しません。
より長いシノニム名は、データ・ディクショナリに格納するために不確定で短い文字列に変換されます。
関連項目:
「CREATE SYNONYM: 例」および「Oracle Databaseによるシノニムの変換: 例」を参照してください。
SHARING
この句は、アプリケーション・ルートにシノニムを作成する場合にのみ適用されます。このタイプのシノニムはアプリケーション共通オブジェクトと呼ばれ、アプリケーション・ルートに属するアプリケーションPDBと共有できます。シノニムの共有方法を決定するには、次の共有属性のいずれかを指定します。
-
METADATA
- メタデータ・リンクはシノニムのメタデータを共有しますが、そのデータは各コンテナに固有です。このタイプのシノニムは、メタデータリンク・アプリケーション共通オブジェクトと呼ばれます。 -
NONE
- シノニムは共有されません。
この句を省略すると、データベースでは、DEFAULT_SHARING
初期化パラメータの値を使用して、シノニムの共有属性を決定します。DEFAULT_SHARING
初期化パラメータに値が含まれていない場合、デフォルトはMETADATA
です。
シノニムの共有属性は、作成後には変更できません。
関連項目:
-
DEFAULT_SHARING
初期化パラメータの詳細は、Oracle Databaseリファレンスを参照してください -
アプリケーション共通オブジェクトの作成の詳細は、『Oracle Database管理者ガイド』を参照してください。
FOR句
シノニムを作成するオブジェクトを指定します。シノニムを作成するスキーマ・オブジェクトには、次のものがあります。
-
表またはオブジェクト表
-
ビューまたはオブジェクト・ビュー
-
順序
-
ストアド・プロシージャ、ファンクションまたはパッケージ
-
マテリアライズド・ビュー
-
Javaクラス・スキーマ・オブジェクト
-
ユーザー定義オブジェクト型
-
シノニム
スキーマ・オブジェクトは、現在存在している必要はなく、スキーマ・オブジェクトへのアクセス権限も必要ありません。
FOR句の制限事項
スキーマ・オブジェクトは、パッケージに含めることはできません。
schema
オブジェクトが含まれているスキーマを指定します。オブジェクトにschema
を指定しなかった場合、そのスキーマ・オブジェクトは自分のスキーマ内にあるとみなされます。
リモート・データベース上のプロシージャやファンクションに対するシノニムを作成する場合、このCREATE
文でschema
を指定する必要があります。または、オブジェクトが存在するデータベースにローカル・パブリック・シノニムを作成することもできます。ただし、その後は、プロシージャやファンクションの後続のコールすべてにデータベース・リンクを組み込む必要があります。
dblink
データベース・リンクを完全に指定するか、データベース・リンクの一部を指定すると、スキーマ・オブジェクトが格納されているリモート・データベース上のオブジェクトのシノニムを作成できます。dblink
を指定して、schema
を省略した場合、シノニムは、データベース・リンクで指定されたスキーマ内のオブジェクトを参照します。リモート・データベースのオブジェクトが含まれているスキーマを指定することをお薦めします。
dblink
を省略した場合、オブジェクトがローカル・データベース上にあるものとみなされます。
データベース・リンクの制限事項
dblink
は、Javaクラス・シノニムに対して指定できません。
関連項目:
-
データベース・リンクの参照方法の詳細は、「リモート・データベース内のオブジェクトの参照」を参照してください。
-
データベース・リンクの作成方法の詳細は、「CREATE DATABASE LINK」を参照してください。
例
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
シノニム・レベルで変換する前に、スキーマ・レベルで変換しようとします。たとえば、スキーマoe
とsh
の両方に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
という名前のオブジェクトは存在しないが、hr
がoe.customers
に対するSELECT権限を持つ場合、hr
は、パブリック・シノニムcustomers
を使用して、oe
のスキーマ内のcustomers
表にアクセスできます。
SELECT COUNT(*) FROM customers;