CREATE ALIAS ステートメント

CREATE ALIAS ステートメントは、モジュール、ニックネーム、シーケンス、表、ビュー、または他の別名に対する別名を定義します。 別名は同義語とも言います。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • データベースに対する IMPLICIT_SCHEMA 権限 (別名の暗黙または明示のスキーマ名が存在しない場合)
  • スキーマに対する SCHEMAADM 権限 (別名のスキーマ名が既存のスキーマを指している場合)
  • スキーマに対する CREATEIN 特権 (別名のスキーマ名が既存のスキーマを指している場合)、または SYSPUBLIC に対する CREATEIN 特権 (パブリック別名が作成されている場合)。
  • DBADM 権限

別名によって参照されるオブジェクトを使用するために必要な特権は、直接そのオブジェクトを使用するために必要な特権と同一です。

既存の別名を置き換えるには、ステートメントの許可 ID が、既存の別名の所有者でなければなりません (SQLSTATE 42501)。

構文

構文図を読む構文図をスキップするCREATE OR REPLACE PUBLIC ALIAStable-aliasmodule-aliassequence-alias
table-alias
構文図を読む構文図をスキップするalias-nameFORTABLEtable-nameview-namenicknamealias-name2
module-alias
構文図を読む構文図をスキップするalias-nameFORMODULE module-namealias-name2
sequence-alias
構文図を読む構文図をスキップするalias-nameFORSEQUENCE sequence-namealias-name2

説明

OR REPLACE
プロシージャーの定義が現行のサーバー上に存在している場合に、その別名の定義を置換するために指定します。 既存の定義が実際にドロップされてから、カタログ内で新しい定義が置き換えられます。 このオプションは、別名の定義が現行のサーバー上に存在しない場合は無視されます。 このオプションは、オブジェクトの所有者しか指定できません。
PUBLIC
別名がシステム・スキーマ SYSPUBLIC 中のオブジェクトであることを指定します。
alias-name
別名を指定します。 表の別名の場合、この名前が、現行サーバーに存在するニックネーム、表、ビュー、または表の別名を指定していてはなりません。モジュール別名の場合、この名前が、現行サーバーに存在するモジュールまたはモジュール別名を指定していてはなりません。シーケンス別名の場合、この名前が、現行サーバーに存在するシーケンスまたはシーケンス別名を指定していてはなりません。

2 つの部分からなる名前を指定する場合、SYS で始まるスキーマ名は使用できません (SQLSTATE 42939)。ただし PUBLIC が指定されている場合は例外で、そのときはスキーマ名が SYSPUBLIC でなければなりません (SQLSTATE 428EK)。

FOR TABLE table-name、view-name、nickname、または alias-name2
alias-name を定義する対象の表名、ビュー名、ニックネーム、または表別名を指定します。他の別名 (alias-name2) を指定する場合、その別名は、 定義される新しい alias-name (完全修飾形式の) と同じであってはなりません。 table-name を宣言済み一時表にすることはできません (SQLSTATE 42995)。
FOR MODULE module-nameまたは alias-name2
alias-name が定義されているモジュールまたはモジュール別名を識別します。他の別名 (alias-name2) を指定する場合、その別名は、 定義される新しい alias-name (完全修飾形式の) と同じであってはなりません。
FOR SEQUENCE sequence-nameまたは alias-name2
alias-name が定義されているシーケンスまたはシーケンス別名を識別します。他の別名 (alias-name2) を指定する場合、その別名は、 定義される新しい alias-name (完全修飾形式の) と同じであってはなりません。 sequence-name には、 システムが ID 列に対して生成したシーケンスを指定することはできません (SQLSTATE 428FB)。

  • パブリック別名 (パブリック同義語とも呼ばれる) を作成するには、PUBLIC というキーワードが使用されます。キーワード PUBLIC が使用されない場合、別名のタイプはプライベート別名 (プライベート同義語とも呼ばれる) です。
  • パブリック別名は、SQL ステートメント内および LOAD ユーティリティーでのみ使用できます。
  • 新しく作成した表別名の定義は、SYSCAT.TABLES に保管されます。新しく作成したモジュール別名の定義は、SYSCAT.MODULES に保管されます。新しく作成したシーケンス別名の定義は、SYSCAT.SEQUENCES に保管されます。
  • 別名は、定義時に存在していないオブジェクトに対しても定義できます。 オブジェクトが存在しない場合、警告が出されます (SQLSTATE 01522)。 ただし、参照されるオブジェクトは、 その別名を含む SQL ステートメントのコンパイル時には存在していなければなりません。 そうでない場合、エラーになります (SQLSTATE 52004)。
  • 他の別名を参照する別名を別名チェーンの一部として定義することは可能ですが、 SQL ステートメントで使用する場合には、単一の別名と同じ制約がそのチェーンにも適用されます。 別名チェーンは、単一の別名と同じ方法で解決されます。 パッケージ内のステートメント、SQL ルーチン、トリガー、グローバル変数に対するデフォルト式、または別名チェーンを指すビュー定義点で別名が使用された場合、そのパッケージ、SQL ルーチン、トリガー、グローバル変数、またはチェーン内の各別名のビューについて、従属関係が記録されます。別名は、別名チェーン中で自分自身を参照することはできず、このようなサイクルは別名定義の際に検出されます (SQLSTATE 42916)。
  • 非修飾別名の解決: 非修飾名を解決する際には、パブリック別名より前にプライベート別名が考慮されます。
  • パブリック別名に対する従来のバインディング: パッケージ内のステートメント、SQL ルーチン、トリガー、グローバル変数に対するデフォルト式、またはビュー定義でパブリック別名が使用された場合、その後同じ名前を持つ他のオブジェクトが作成されるかどうかにかかわりなく、そのパブリック別名はこれらのオブジェクトによって使用され続けます。
  • まだ存在していないスキーマ名を用いて別名を作成すると、 ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、 そのスキーマが暗黙的に作成されます。 スキーマの所有者は SYSIBM になります。スキーマに対する CREATEIN 特権が PUBLIC に付与されます。
  • 代替構文: 以下の構文は、製品間の互換性のためにのみサポートされています。
    • ALIAS の代わりに SYNONYM を指定できます。

  • 例 1: HEDGES は表 T1 に対して別名を作成します (どちらも修飾なし)。
      
       CREATE ALIAS A1 FOR T1
    HEDGES.T1 に対して別名 HEDGES.A1 が作成されます。
  • 例 2 HEDGES は表に対して別名を作成します (どちらも修飾付き)。
       CREATE ALIAS HEDGES.A1 FOR MCKNIGHT.T1
    MCKNIGHT.A1 に対して別名 HEDGES.T1 が作成されます。
  • 例 3: HEDGES は表に対して別名を作成します (異なるスキーマ内の別名。HEDGES は DBADM ではなく、HEDGES はスキーマ MCKNIGHT に対して CREATEIN を持っていない)。
       CREATE ALIAS  MCKNIGHT.A1 FOR MCKNIGHT.T1
    この例はエラーになります (SQLSTATE 42501)。
  • 例 4: HEDGES は未定義の表に対して別名を作成します (どちらも修飾付き。 FUZZY.WUZZY は存在しない)。
       CREATE ALIAS HEDGES.A1 FOR FUZZY.WUZZY
    このステートメントは成功しますが、警告 (SQLSTATE 01522) が出されます。
  • 例 5: HEDGES は別名に対して別名を作成します (どちらも修飾付き)。
       CREATE ALIAS HEDGES.A1 FOR MCKNIGHT.T1
       CREATE ALIAS HEDGES.A2 FOR HEDGES.A1

    最初のステートメントは成功します (例 2 と同じ)。

    2 番目のステートメントも成功して、別名チェーンが作成されます。 つまり、HEDGES.A2 が HEDGES.A1 を参照し、 その HEDGES.A1 が MCKNIGHT.T1 を参照することになります。 HEDGES に MCKNIGHT.T1 に対する特権があるかどうかは関係ありません。 別名は、表の特権に関係なく作成されます。

  • 例 6: ニックネーム FUZZYBEAR の別名として、A1 を指定します。
       CREATE ALIAS A1 FOR FUZZYBEAR 
  • 例 7: ある大規模な組織に、 D108 という会計部門と D577 という人事部門があります。 D108 は、IBM® RDBMS に存在する表に、特定の情報を保持しています。 D577 は、Oracle RDBMS に存在する表に、いくつかのレコードを保持しています。 DBA は、この 2 つの RDBMS をフェデレーテッド・システム内のデータ・ソースとして定義し、 それぞれの表に DEPTD108 および DEPTD577 というニックネームを付けます。 フェデレーテッド・システムのユーザーはこれらの表の結合を作成する必要がありますが、 英数字のニックネームではなく、もっと意味のある名前で参照できるようにしたいことがあります。 それで、DEPTD108 の別名として FINANCE を定義し、 DEPTD577 の別名として PERSONNEL を定義します。
       CREATE ALIAS FINANCE FOR DEPTD108
       CREATE ALIAS PERSONNEL FOR DEPTD577
  • 例 8: カタログ・ビュー SYSCAT.TABLES に対して、TABS と呼ばれるパブリック別名を作成します。
    
       CREATE PUBLIC ALIAS TABS FOR SYSCAT.TABLES