CREATE VIEW ステートメントは、1 つまたは複数の表、 視点、またはニックネームに基づく視点を作成します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、 あるいは動的 SQL ステートメントの使用によって発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。 しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、 ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
および以下の少なくとも 1 つ
副視点を作成するには、このステートメントの許可 ID が次の条件に適合している必要があります。
グループ特権は、CREATE VIEW ステートメントで指定された表や視点に対しては考慮されません。
特権は、連合データベースのニックネームに視点を定義するときには考慮されません。 このニックネームで示されている表または視点のデータ・ソースの許可要件は、照会の処理時に適用されます。 ステートメントの許可 ID は、別のリモート許可 ID へマップできます。
視点の定義者が SYSADM 権限を持つために、 視点の作成しかできない場合、視点作成のため、 その定義者には明示的な DBADM 権限が付与されます。
構文
>>-CREATE--+-----------+---VIEW--view-name----------------------> '-FEDERATED-' >-----+---------------------------------------------+--AS-------> | .-,--------------. | | V | | +-(-----column-name---+---)-------------------+ '-OF--type-name--+-| root-view-definition |-+-' '-| subview-definition |---' >----+---------------------------------------+--fullselect------> | .-,--------------------------. | | V | | '-WITH-----common-table-expression---+--' >-----+--------------------------------------+----------------->< | .-CASCADED--. | '-WITH--+-----------+---CHECK OPTION---' '-LOCAL-----' root-view-definition |---MODE DB2SQL-------------------------------------------------> >----(--| oid-column |--+----------------------+---)------------| '-,--| with-options |--' subview-definition |---MODE DB2SQL--| under-clause |------------------------------> >-----+--------------------------+---+---------+----------------| '-(--| with-options |--)---' '-EXTEND--' oid-column |---REF IS--oid-column-name--USER GENERATED----+------------+---| '-UNCHECKED--' with-options .-,----------------------------------------------------------------. | .-,--------------------------------. | V V | | |--------column-name--WITH OPTIONS----+-SCOPE--+-typed-table-name-+-+--+--+---> | '-typed-view-name--' | '-READ ONLY-------------------' >---------------------------------------------------------------| under-clause |---UNDER--superview-name--INHERIT SELECT PRIVILEGES------------|
注: | common-table-expression (共通表式) と fullselect (全選択) の構文については、 照会 を参照してください。 |
説明
逆に、この FEDERATED キーワードが指定されているのに、 OLEDB 表関数やニックネームを全選択して直接または間接的に参照しないと、 CREATE VIEW ステートメントを送信する際にエラー (SQLSTATE 429BA) が発生します。 この場合、視点は作成されません。
この名前は、作動不能な視点の名前と同じであっても構いません (作動不能視点を参照)。 このような場合、作動不能な視点は、 CREATE VIEW ステートメントに指定した新しい視点によって置き換えられます。 作動不能な視点が置き換えられると、ユーザーに警告 (SQLSTATE 01595) が出されます。 バインド・オプション SQLWARN を NO に設定してアプリケーションがバインドされた場合は、 警告は戻されません。
全選択の結果表の列名が重複している場合、または無名の列がある場合には、 列名のリストを指定する必要があります (SQLSTATE 42908)。 無名列とは、定数、関数、式、またはセット演算から派生した列で、 選択リストの AS 文節によって名前が指定されていない列を指します。
表の列には、スーパー視点のオブジェクト ID 列が含まれています。 オブジェクト識別列のタイプは REF(type-name) に変更されており、 type-name の属性に基づく列が続きます (ここでいうタイプには、 上位タイプの属性も含まれていることを念頭に置いてください)。
ターゲット表またはターゲット視点が定義されるように、 後続する ALTER VIEW ステートメント (効力範囲が継承されていない場合) まで、 参照タイプ列の指定を遅らせることができます (通常は、 相互参照表および相互参照視点の場合に適用する)。 視点の参照タイプ列で効力範囲が指定されていないのに、 基礎表または視点列の効力範囲が指定された場合、 基礎列の効力範囲は参照タイプ列によって継承されます。 基礎表または視点の列に効力範囲がない場合には、この列に効力範囲は指定されません。 読み取り専用カーソルと更新可能カーソルの詳細については、 注を参照してください。
タイプ付き視点および副視点の場合 : fullselect は、以下の規則に準拠していなければなりません。 そうでない場合、エラーが戻されます (SQLSTATE 428EA 何も指定されていない場合)。
視点および副視点の階層の場合 : BR1 および BR2 が、 階層内の視点定義に現れる分岐になるようにします。 T1 を BR1 の基礎表または視点に、T2 を BR2 の基礎表または視点にします。 この場合は以下のようになります。
EXTEND AS を使って定義されたタイプ付きの視点の場合 : 副視点の本体内の各分岐について :
AS (EXTEND なし) を使って定義されたタイプ付き副視点の場合:
WITH CHECK OPTION は、視点が読み取り専用の場合には指定できません (SQLSTATE 42813)。 挿入が許されていない更新可能な視点に対して WITH CHECK OPTION を指定すると、 制約は更新にのみ適用されます。
視点が、NODENUMBER または PARTITION 関数、非 deterministic 関数、 または外部アクションを伴う関数を参照する場合、 WITH CHECK OPTION を指定することはできません (SQLSTATE 42997)。
WITH CHECK OPTION は、 視点がタイプ付き視点の場合には指定できません (SQLSTATE 42997)。
WITH CHECK OPTION は、ニックネームが視点の更新目標である場合には指定できません。
WITH CHECK OPTION を省略すると、 視点を使用するどのような挿入操作または更新操作の検査においても、 視点の定義は使用されません。 ただし、視点が WITH CHECK OPTION を含む他の視点に直接または間接的に従属する場合には、 挿入操作または更新操作の過程で、何らかの検査が行われる場合があります。 この場合、視点の定義が使用されるわけではないため、 視点の定義に従っていない視点を介して、 行が挿入または更新される可能性があります。
次の例は、CASCADED と LOCAL の差異を示しています。 次のような更新可能な視点を想定します (Y は、一覧表の見出しに示しているように、 LOCAL または CASCADED に置き換えます)。
V1 : 表 T に基づいて定義される視点 V2 : V1 に基づいて WITH Y CHECK OPTION として定義される視点 V3 : V2 に基づいて定義される視点 V4 : V3 に基づいて WITH Y CHECK OPTION として定義される視点 V5 : V4 に基づいて定義される視点
次の表は、挿入または更新された行を検査するのに使われる探索条件を示しています。
| Y が LOCAL の場合 | Y が CASCADED の場合 |
---|---|---|
V1 での検査条件: | 対象となる視点なし | 対象となる視点なし |
V2 での検査条件: | V2 | V2、V1 |
V3 での検査条件: | V2 | V2、V1 |
V4 での検査条件: | V2、V4 | V4、V3、V2、V1 |
V5 での検査条件: | V2、V4 | V4、V3、V2、V1 |
また、次のような更新可能視点についても考えてみます。 これは、デフォルトの CASCADED オプションを使用した場合の WITH CHECK OPTION の効果を示しています。
CREATE VIEW V1 AS SELECT COL1 FROM T1 WHERE COL1 > 10 CREATE VIEW V2 AS SELECT COL1 FROM V1 WITH CHECK OPTION CREATE VIEW V3 AS SELECT COL1 FROM V2 WHERE COL1 < 100
次の INSERT ステートメントは V1 を使用するものですが、 V1 に WITH CHECK OPTION が指定されておらず、 また V1 が、WITH CHECK OPTION の指定された他のどの視点にも従属していないため、 このステートメントは成功します。
INSERT INTO V1 VALUES(5)
次の INSERT ステートメントは V2 を使用するものですが、 V2 に WITH CHECK OPTION が指定されており、 挿入 (INSERT) によって V2 の定義に従っていない行が作成されるため、 このステートメントはエラーになります。
INSERT INTO V2 VALUES(5)
次の INSERT ステートメントでは V3 を使用しています。 V3 に WITH CHECK OPTION は指定されていませんが、 これは、WITH CHECK OPTION の指定された V2 の従属であるため、 エラーになります (SQLSTATE 44000)。
INSERT INTO V3 VALUES(5)
次の INSERT ステートメントも、V3 を使用しています。 これは V3 の定義に準拠していませんが、 成功します (V3 には WITH CHECK OPTION が指定されていません)。 これは、WITH CHECK OPTION の指定された V2 の定義に従ったものになっています。
INSERT INTO V3 VALUES(200)
視点のいずれかの列が更新可能なら、視点は更新可能 です。
視点のすべての列が更新可能であり、視点の全選択に UNION ALL が含まれない場合、 その視点は挿入可能 です。
視点が読み取り専用かどうかは、SYSCAT.VIEWS カタログ視点の READONLY 列に示されます。
視点は、次の場合に作動不能になります。
実際には、作動不能視点とは、視点定義が間違って除去された視点です。 たとえば、別名が除去されると、 その別名を使用して定義されている視点すべてが作動不能になります。 それに従属するすべての視点も作動不能になり、 その視点に従属するパッケージは無効になります。
作動不能視点を明示的に作成し直すか、あるいは除去する時点まで、 その作動不能視点を使用するステートメントのコンパイルはできません (SQLSTATE 51024)。 ただし、CREATE ALIAS、CREATE VIEW、DROP VIEW、 および COMMENT ON TABLE の各ステートメントは例外です。 作動不能視点が明示的に削除されるまで、 その修飾名を使って別の表や別名を作成することはできません (SQLSTATE 42710)。
作動不能視点は、作動不能視点の定義テキストを使用して、 CREATE VIEW ステートメントを発行することにより、再作成することができます。 この視点定義テキストは、SYSCAT.VIEWS カタログの TEXT 列に保管されます。 作動不能視点を再作成する場合は、 他のユーザーでその視点に対して必要となる特権すべてを明示的に付与する必要があります。 これは、視点が作動不能とみなされると、 視点のすべての許可レコードが削除されるためです。 作動不能視点を再作成するために、それを明示的に削除する必要はありません。 作動不能視点と同じ view-name を指定して CREATE VIEW ステートメントを発行すると、 作動不能視点は置き換えられ、CREATE VIEW ステートメントは警告を戻します (SQLSTATE 01595)。
作動不能視点であることは、SYSCAT.VIEWS カタログ視点の VALID 列の X、 また SYSCAT.TABLES カタログ視点の STATUS 列が X であることによって示されます。
視点の定義者は、視点に対する SELECT 特権と、視点を除去する権利を常に与えられます。 視点の定義者は、その定義者が全選択で指定されたすべての基礎表、 視点またはニックネームに対する CONTROL 特権を持っている場合、 あるいは定義者が SYSADM 権限または DBADM 権限を持っている場合にのみ、 その視点に対する CONTROL 特権が付与されます。
視点の定義者は、その視点が読み取り専用でなく、 定義者が基礎となるオブジェクトに対して対応する特権を持っている場合に、 その視点に対する INSERT、UPDATE、列レベルの UPDATE、 または DELETE の特権を与えられます。
視点の定義者にそれらの特権が与えられるのは、 それらの特権の派生元の特権が視点の作成時に存在している場合に限ります。 定義者は、これらの特権を直接持っているか、または PUBLIC の特権として持っていることが必要です。 特権は、連合データベースのニックネームに視点を定義するときには考慮されません。 ただし、ニックネームに視点を使用する場合、ユーザーの許可 ID には、 そのニックネームがデータ・ソースで参照する表または視点に対する適切な選択特権がなければなりません。 もしその特権がなければ、エラーが戻されます。 視点の定義者がメンバーであるグループを持つ特権は考慮されません。
副視点が作成されると、 すぐ上のスーパー視点に対して持っている SELECT 特権が自動的に副視点に対しても付与されます。
視点定義の全選択で参照タイプ列を選択する際には、 必要なターゲット・タイプと効力範囲について考慮してください。
CAST(CAST(Y AS VARCHAR(16) FOR BIT DATA) AS REF(VTYP1) SCOPE VIEW1)
これ以外の場合はすべて、視点の列は ID のプロパティーを取得しません。 たとえば、次のような場合があります。
挿入先の視点において、視点定義の選択リストに直接または間接的に基礎表の識別列の名前が含まれている場合は、 INSERT ステートメントが基礎表の識別列を直接参照する場合と同じ規則が適用されます。
ニックネームには DML 特権との関連が全くないため、視点を作成しても、視点定義者がニックネームや、 基礎データ・ソース表または視点にアクセスできるかどうかを判別する特権検査は行われません。 連合データベースでの表または視点に対する特権検査は、 最低でもそうしたオブジェクトに対する SELECT 特権を視点定義者に要求することにより、 通常どおり行われます。
連合視点が照会で順番に参照される場合、 その照会を発行したデータ・ソースおよび許可 ID (または、 その照会がマッピングするリモート許可 ID) に対する照会になるニックネームには、 データ・ソース表または視点にアクセスするのに必要な特権がなければなりません。 連合視点を参照する照会を発行する許可 ID には、 連合サーバーに存在する (連合でない) 表または視点に対する追加の特権は必要ありません。
例
例 1: PROJECT 表に基づく視点 MA_PROJ を作成します。この視点には、 文字 'MA' で始まるプロジェクト番号 (PROJNO) を持つ行だけを入れます。
CREATE VIEW MA_PROJ AS SELECT * FROM PROJECT WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
例 2: 例 1 と同様に視点を作成します。ただし、プロジェクト番号 (PROJNO)、 プロジェクト名 (PROJNAME)、およびプロジェクトの責任者 (RESPEMP) の列だけを選択します。
CREATE VIEW MA_PROJ AS SELECTPROJNO, PROJNAME, RESPEMP FROM PROJECT WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
例 3: 例 2 と同様の視点を作成します。 ただし、視点の中でプロジェクトの責任者の列を IN_CHARGE と呼びます。
CREATE VIEW MA_PROJ (PROJNO, PROJNAME, IN_CHARGE) AS SELECTPROJNO, PROJNAME, RESPEMP FROM PROJECT WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
注: 列名のいずれか 1 つだけを変更する場合でも、 視点の 3 つの列すべての名前を MA_PROJ の後の括弧内に指定する必要があります。
例 4: PRJ_LEADER という名前の視点を作成します。この視点には、 PROJECT 表の最初の 4 つの列 (PROJNO、 PROJNAME、 DEPTNO、 RESPEMP) と、 プロジェクトの責任者 (RESPEMP) のラストネーム (LASTNAME) を入れます。 ラストネームは、EMPLOYEE 表の EMPNO を PROJECT 表の RESPEMP と突き合わせることによって、 EMPLOYEE 表から入手します。
CREATE VIEW PRJ_LEADER AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME FROM PROJECT, EMPLOYEE WHERE RESPEMP = EMPNO
例 5: 例 4 と同様の視点を作成します。ただし、列 PROJNO、 PROJNAME、 DEPTNO、 RESPEMP、 および LASTNAME に加えて、担当者の給与総額 (SALARY + BONUS + COMM) を入れます。 また、平均スタッフ数 (PRSTAFF) が 1 より大きいプロジェクトだけを選択します。
CREATE VIEW PRJ_LEADER (PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME, TOTAL_PAY ) AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME, SALARY+BONUS+COMM FROM PROJECT, EMPLOYEE WHERE RESPEMP = EMPNO AND PRSTAFF > 1
全選択に、TOTAL_PAY として式 SALARY+BONUS+COMM を指定することによって、 次のように、列名リストの指定を省略することができます。
CREATE VIEW PRJ_LEADER AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME, SALARY+BONUS+COMM AS TOTAL_PAY FROM PROJECT, EMPLOYEE WHERE RESPEMP = EMPNO AND PRSTAFF > 1
例 6: 次の図に示す表と視点があると想定します。
ユーザー ZORPIE (DBADM または SYSADM のいずれの権限も持たない) は、 各オブジェクトの下の括弧内に示している権限を与えられています。
CREATE VIEW VA AS SELECT * FROM S1.V1
これは、ZORPIE が S1.V1 に対して CONTROL 権限を持っているからで
す。 86 基礎となる基礎表に対して、どのような特権が与えられているかは関係ありません。
CREATE VIEW VB AS SELECT * FROM S1.V2
これは、ZORPIE には、S1.V2 に対する CONTROL も SELECT も与えられていないからです。 基礎となる基礎表 (S1.T2) に対して CONTROL を与えられているかどうかは、関係ありません。
CREATE VIEW VC (COLA, COLB, COLC, COLD) AS SELECT * FROM S1.V1, S1.T2 WHERE COLA = COLC
これは、ZORPIE.VC の全選択では、視点 S1.V1 と S1.T2 を参照しており、 ZORPIE はその両方に対する CONTROL を持っているからです。 視点 VC は読み取り専用で、INSERT、UPDATE、 または DELETE のいずれの権限も ZORPIE には与えられないことに注意してください。
CREATE VIEW VD (COLA,COLB, COLE, COLF) AS SELECT * FROM S1.V1, S1.V3 WHERE COLA = COLE
これは、ZORPIE.VD の全選択で 2 つの視点 S1.V1 および S1.V3 を参照しており、 ZORPIE はその 1 つに対しては SELECT 特権を、 もう 1 つに対しては CONTROL 特権を与えられているからです。 ZORPIE.VD に対する特権として、 2 つの特権のうち低い方の特権である SELECT が ZORPIE に与えられます。
CREATE VIEW VE AS SELECT * FROM S1.V1 WHERE COLA > ANY (SELECT COLE FROM S1.V3)
ZORPIE の VE に対する特権は、主として S1.V1 に対する特権によって決定されます。 S1.V3 は副照会で参照されているだけなので、 視点 VE の作成には S1.V3 に対する SELECT 特権だけが必要です。 視点の定義者は、視点の定義で参照されているすべてのオブジェクトに対して CONTROL を持っている場合のみ、 その視点に対して CONTROL を入手します。 ZORPIE は S1.V3 に対する CONTROL を持っていないので、 VE に対する CONTROL は与えられません。