風変わりなSQLのオブジェクト作成
こんにちは、Ted:
SQLステートメント実行(RUNSQLSTM)コマンドを使用してソース メンバーからビューを作成しています。ソース メンバーのどのオブジェクトも修飾されていません。現行ライブラリーをどのように設定しても、システムはいつも間違ったライブラリー内にビューを作成してしまいます。どうなっているのか教えていただけないでしょうか。
-William
William氏は、SQL CREATE VIEWステートメントの風変わりに思える振る舞いに遭遇してしまったようです。これには実に面食らいました。ビューは現行ライブラリー内に作成されると私は思っていました。けれども、そうではありませんでした。William氏は、IBM Knowledge Centerで質問に対する回答を見つけたようです。「修飾されていない場合、およびデフォルトのスキーマが無い場合、ビュー名は、最初の FROM 文節 (任意の共通表式またはネストされた表式の FROM 文節を含む) 上に指定されている、最初の表と同一のスキーマ内に作成されます。」 私はもう少しそこの記事を読んでみて、非修飾オブジェクトおよびSQLについていくつかのことを学びました。読者の皆さんも、私が学んだことを知りたいのではないでしょうか。
非修飾オブジェクトが作成される場所は、まずは、システム(*SYS)またはSQL(*SQL)のどちらの命名規則を使用しているかによって異なります。SQL命名規則は、DB2 for iでは使用可能であるシステム命名規則を使用する選択肢がない、他のシステムで使用されている命名規則です。SQL命名規則を使用している場合、システムはCREATEコマンドを実行しているユーザーと名前が同じであるライブラリー内に非修飾オブジェクトを作成します。たとえば、ユーザー プロファイルがJSMITHなら、システムはJSMITH内に非修飾オブジェクトを作成しようとします。この規則に例外があるかもしれませんが、もしそうだとして、私にはその例外がどのようなものであるかは分かりません。SQL命名規則を使用しているショップで作業した経験はありませんが、私の行ったテストでは、すべてそのような動作になっています。読者の皆さんの中にSQL命名規則に詳しい方がいらっしゃるとしたら、私にメールを送っていだだいて、ご教示願いたいところです。
William氏はシステム命名規則を使用していました。たぶん皆さんもそうでしょう。システム命名規則を使用するとよい理由は、ライブラリー リストと呼ばれるあの強力なIBM iコンストラクトの使用が可能になることにあります。ライブラリー リストは表およびビューを読み取るのにとても有用ですが、このことは非修飾オブジェクトを作成するときには当てはまりません。
オブジェクトがどこに作成されるかは、オブジェクトの種類および現行ライブラリーによって異なります。
以下は、IBMのWebサイトからコピー ペーストして私がまとめた表です。
ステートメント | 規則 |
---|---|
CREATE TABLE CREATE FUNCTION CREATE TYPE(配列) CREATE TYPE(特殊) CREATE VARIABLE |
CURRENT SCHEMA特殊レジスターの値が*LIBLである場合、オブジェクトは、 現行ライブラリー(*CURLIB)内に作成されます。 そうでない場合、オブジェクトは現行スキーマ内に作成されます。 |
CREATE VIEW |
デフォルトのスキーマがない場合、ビュー名は、最初のFROM文節(任意の 共通表式またはネストされた表式のFROM文節を含む)上に指定されている、 最初の表と同一のスキーマ内に作成されます。 表が全選択で参照されない場合、ビューは最初のユーザー定義表関数と同一 のスキーマ内に作成されます。 表またはユーザー定義表関数が全選択で参照されない場合は、現行ライブラ リー(*CURLIB)が使用されます。 |
CREATE INDEX CREATE TRIGGER |
オブジェクトは対象表と同じスキーマ内に作成されます。 |
CREATE ALIAS | 別名は、その別名の作成の対象である表かビューと同じスキーマ内 に作成されます。 表が修飾されず、しかも別名の作成時に存在していなかった場合: CURRENT SCHEMA特殊レジスターの値が*LIBLである場合、別名は、 現行ライブラリー(*CURLIB)内に作成されます。 そうでない場合、別名は現行スキーマ内に作成されます。 |
CREATE MASK CREATE PERMISSION |
修飾されておらず、デフォルトのスキーマがない場合、オブジェ クトはtable-nameと同じスキーマ内に作成されます。 |
CREATE PROCEDURE |
CURRENT SCHEMA特殊レジスターの値が*LIBLである場合、プロシー ジャーは、現行ライブラリー(*CURLIB)内に作成されます。 そうでない場合、プロシージャーは現行スキーマ内に作成されます。 |
CREATE TYPE(配列) CREATE TYPE(特殊) CREATE VARIABLE |
CREATE TABLEに同じ。 CURRENT SCHEMA特殊レジスターの値が*LIBLである場合、オブジェ クトは、現行ライブラリー(*CURLIB)内に作成されます。 そうでない場合、オブジェクトは現行スキーマ内に作成されます。 |
幸いなことに、こうしたすべての混乱を避ける簡単な方法があります。SET SCHEMAステートメントを使用して、オブジェクトをどこに置くかをSQLに指示するという方法です。SQLの他の多くの機能と同様に、SET SCHEMAには、次の3つの形式があります。
これらのコマンドは現行スキーマを設定しますが、これは現行ライブラリーと同じものでありません。最初は、このことで混乱させられました。スキーマはライブラリーとして実装されるため、現行スキーマと現行ライブラリーは同じだろうと思っていたのです。けれども、間違いでした。 非修飾オブジェクトを作成するとき、システムは現行スキーマ内にそのオブジェクトを作成します。表、ビュー、インデックスなど、すべての関連するオブジェクトを同じスキーマ内に置きたいと思うのが一般的だとすると、非修飾オブジェクトを作成する際は、現行スキーマを設定するのが良い方法だと言えるでしょう。