DB2 Version 10.1 for Linux, UNIX, and Windows

CREATE VIEW ステートメント

CREATE VIEW ステートメントは、1 つまたは複数の表、ビュー、またはニックネームに基づくビューを定義します。

呼び出し

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

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • データベースに対する IMPLICIT_SCHEMA 権限 (ビューの暗黙または明示のスキーマ名が存在しない場合)
  • スキーマに対する CREATEIN 特権 (ビューのスキーマ名が既存のスキーマを指している場合)
  • DBADM 権限
さらに、全選択で識別された表、ビュー、またはニックネームそれぞれに対して以下の権限が少なくとも 1 つ含まれている必要があります。
  • その表、ビュー、またはニックネームに対する CONTROL 特権
  • その表、ビュー、またはニックネームに対する SELECT 特権
  • DATAACCESS 権限
サブビューを作成している場合は、以下の権限も必要です。
  • ステートメントの許可 ID が、表階層のルート表の定義者と同じであるか、または、
  • 許可 ID が持つ特権には、DBADM 権限が含まれていなければならない。
および
  • ステートメントの許可 ID が、サブビューの基礎表に対する SELECT WITH GRANT 権限を持っていなければならない。または、スーパービューの SELECT 権限がビュー定義者以外のユーザーに与えられていてはならない。あるいは
  • ACCESSCTRL 権限と次のいずれかの権限。
    • そのサブビューの基礎表に対する SELECT 特権
    • DATAACCESS 権限
WITH ROW MOVEMENT が指定されている場合は、ステートメントの許可 ID に、以下の権限が少なくとも 1 つ含まれている必要があります。
  • その表またはビューに対する UPDATE 特権
  • DATAACCESS 権限

グループ特権は、CREATE VIEW ステートメントで指定された表やビューに対しては考慮されません。

特権は、フェデレーテッド・データベースのニックネームにビューを定義するときには考慮されません。 このニックネームで示されている表またはビューのデータ・ソースの許可要件は、照会の処理時に適用されます。 ステートメントの許可 ID は、別のリモート許可 ID へマップできます。

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

構文

構文図を読む構文図をスキップする
>>-CREATE--+------------+--VIEW--view-name---------------------->
           '-OR REPLACE-'                    

>--+---------------------------------------------+--AS---------->
   |    .-,-----------.                          |       
   |    V             |                          |       
   +-(----column-name-+--)-----------------------+       
   '-OF--type-name--+-| root-view-definition |-+-'       
                    '-| subview-definition |---'         

>--+-----------------------------------+--fullselect--●--------->
   |       .-,-----------------------. |                  
   |       V                         | |                  
   '-WITH----common-table-expression-+-'                  

>--+----------------------------------+--●---------------------->
   |       .-CASCADED-.               |      
   '-WITH--+----------+--CHECK OPTION-'      
           '-LOCAL----'                      

   .-WITH NO ROW MOVEMENT-.      
>--+----------------------+--●---------------------------------><
   '-WITH ROW MOVEMENT----'      

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-------------|

説明

OR REPLACE
ビューの定義が現行のサーバー上に存在している場合に、そのビューの定義を置換するために指定します。 既存の定義は、新しい定義がカタログ内で置換される前に効率的にドロップされます。ただし、ビューに対して付与された特権は影響を受けないという例外があります。 このオプションは、ビューの定義が現行のサーバー上に存在しない場合は無視されます。 このオプションは、オブジェクトの所有者しか指定できません。
view-name
ビューの名前を指定します。 暗黙または明示の修飾子を含む名前は、 カタログに記述されている表、ビュー、ニックネーム、 または別名を指定するものであってはなりません。 修飾子は、SYSIBM、SYSCAT、SYSFUN、または SYSSTAT であってはなりません (SQLSTATE 42939)。

この名前は、作動不能なビューの名前と同じであっても構いません (『作動不能ビュー』を参照)。 このような場合、作動不能なビューは、 CREATE VIEW ステートメントに指定した新しいビューによって置き換えられます。 作動不能なビューが置き換えられると、ユーザーに警告 (SQLSTATE 01595) が出されます。 BIND オプション SQLWARN を NO に設定してアプリケーションがバインドされた場合は、 警告は戻されません。

column-name
ビューの列の名前を指定します。 列名のリストを指定する場合、リスト中の列の名前の数は、 全選択の結果表の列の数と同じ数でなければなりません。 各 column-name (列名) は、固有、しかも非修飾でなければなりません。 列名のリストの指定がない場合、ビューの列は、全選択の結果表の列名を継承します。

全選択の結果表の列名が重複している場合、または無名の列がある場合には、 列名のリストを指定する必要があります (SQLSTATE 42908)。 無名列とは、定数、関数、式、またはセット演算から派生した列で、 選択リストの AS 節によって名前が指定されていない列を指します。

OF type-name
ビューの列が type-name で指定される構造化タイプの属性に基づいていることを指定します。 type-name の指定にスキーマ名が含まれていない場合、 そのタイプ名は SQL パス上のスキーマを探索することによって決まります (このパスは、 静的 SQL の場合は FUNCPATH プリプロセス・オプションによって、 動的 SQL の場合は CURRENT PATH レジスターによって定義されます)。 ここに指定するタイプ名は、既存のユーザー定義タイプ名で (SQLSTATE 42704)、 かつインスタンス化の可能な構造化タイプでなければなりません (SQLSTATE 428DP)。
MODE DB2SQL
この節は、型付きビューのモードを指定するために使用されます。 これは、現在サポートされている唯一有効なモードです。
UNDER superview-name
このビューが superview-name のサブビューであることを指定します。 スーパービューは既存のビューでなければならず (SQLSTATE 42704)、 このビューは type-name のすぐ上位にあるスーパータイプである 構造化タイプで定義する必要があります (SQLSTATE 428DB)。 view-namesuperview-name のスキーマ名は、 同じでなければなりません (SQLSTATE 428DQ)。 superview-name で指定されるビューには、 type-name で既に定義された既存のサブビューを含めることはできません (SQLSTATE 42742)。

ビューの列には、スーパービューのオブジェクト ID 列が含まれています。 オブジェクト ID 列のタイプは REF(type-name) に変更されており、 type-name の属性に基づく列が続きます (ここでいうタイプには、 スーパータイプの属性も含まれていることを念頭に置いてください)。

INHERIT SELECT PRIVILEGES
スーパービューに対して SELECT 特権を持つユーザーやグループはすべて、 新しく作成したサブビューに対しても同様の特権を付与されます。 この特権は、サブビュー定義者によって付与されたものと見なされます。
OID-column
型付きビューのオブジェクト ID 列を定義します。
REF IS OID-column-name USER GENERATED
オブジェクト ID (OID) 列をビューの最初の列として定義することを指定します。 ビュー階層のルート・ビューには、OID が必須です (SQLSTATE 428DX)。 このビューはサブビュー以外の型付きビュー (OF 節が必須) でなければなりません (SQLSTATE 42613)。 この列の名前は OID-column-name として定義されますが、 構造化タイプ type-name のどの属性の名前とも同一にすることはできません (SQLSTATE 42711)。 fullselect で指定した最初の列は、 REF(type-name) というタイプでなければなりません (キャストして適切なタイプにする必要があるかもしれません)。 UNCHECKED を指定しない場合、索引 (主キー、ユニーク制約、ユニーク索引、 または OID 列) を使用して固有性を強制できる列 (NULL 可能ではない) に基づいている必要があります。 この列をオブジェクト ID 列 または OID 列 といいます。 USER GENERATED というキーワードは、 行を挿入する際にユーザーが OID 列の初期値を提供しなければならないことを指しています。 行を挿入した後は、OID 列を更新することはできません (SQLSTATE 42808)。
UNCHECKED
固有であることをシステムが証明できない場合でも、 型付きビュー定義のオブジェクト ID の列を固有であると見なすように定義します。 この属性は、 次のような型付きビュー階層に定義されている表またはビューでの使用を想定しています。 すなわち、そのデータが固有性規則に準拠しているものの、 システムが固有性を証明できる規則には準拠していないことをユーザーが認識しているという場合です。 UNCHECKED オプションは、 複数の階層や従来型の表またはビューにわたる範囲を持つビュー階層には必須のオプションです。UNCHECKED を指定する場合、ユーザーの責任でビューの各行にユニークな OID が確実にあるようにします。 ユーザーがこの特性を保証しなかったために、ビューに重複した OID 値が入ってしまうと、固有でない OID 値のどれかを含むパスの式または DEREF 演算子はエラーになります (SQLSTATE 21000)。
with-options
型付きビューの列に適用される追加オプションを定義します。
column-name WITH OPTIONS
追加オプションを指定する列の名前を指定します。 column-name は、 ビューの type-name に定義されている (継承されてはいない) 属性名に対応していなければなりません。 この列は参照タイプである必要があります (SQLSTATE 42842)。 また、既にスーパービューに存在する列に対応することはできません (SQLSTATE 428DJ)。 列名は、ステートメント内の 1 つの WITH OPTIONS SCOPE 節に 1 回しか指定できません (SQLSTATE 42613)。
SCOPE
参照タイプ列の有効範囲を指定します。 間接参照演算子の左オペランド、または DEREF 関数の引数として使用する列には、 すべて有効範囲を指定する必要があります。

参照タイプ列の有効範囲指定は後続の ALTER VIEW ステートメントまで遅らせることができます (有効範囲が継承されていない場合)。これにより、ターゲット表またはターゲット・ビューを定義できるようになります (通常は、相互参照表および相互参照ビューの場合)。 ビューの参照タイプ列で有効範囲が指定されておらず、 基礎表またはビュー列の有効範囲が指定されている場合、 基礎列の有効範囲が参照タイプ列によって継承されます。 基礎表またはビューの列に有効範囲がない場合には、この列に有効範囲は指定されません。 有効範囲と参照タイプ列についての詳細は、 を参照してください。

typed-table-name
型付き表の名前。 この表は既に存在しているものか、 作成する表と同じ名前のものでなければなりません (SQLSTATE 42704)。 column-name のデータ・タイプは REF(S) でなければなりません。 Styped-table-name のタイプを表します (SQLSTATE 428DM)。 値が typed-table-name の既存行を実際に参照していることを確認するための、 column-name の既存値の検査は行われません。
typed-view-name
型付きビューの名前。 このビューは既に存在しているものか、 作成するビューと同じ名前のものでなければなりません (SQLSTATE 42704)。 column-name のデータ・タイプは REF(S) でなければなりません。 Styped-view-name のタイプを表します (SQLSTATE 428DM)。 値が typed-view-name の既存行を実際に参照していることを確認するための、column-name の既存値の検査は行われません。
READ ONLY
列を読み取り専用列として指定します。 このオプションは、列を読み取り専用にすることで、サブビューの定義において、暗黙的に読み取り専用である同じ列を式に指定できるようにするために使用されます。
AS
ビュー定義を指定します。
WITH common-table-expression
後続の fullselect で使用する共通表式を定義します。 型付きビューを定義するときには、共通表式は指定できません。
fullselect
ビューを定義します。 ビューは常に、SELECT ステートメントが実行された場合の結果となる複数行で構成されます。 ビューの列のデータ・タイプは、データ・タイプ制約を持つ特殊タイプ、配列タイプ、カーソル・タイプ、または行タイプにはできません。全選択でホスト変数、パラメーター・マーカー、 または宣言済み一時表を参照することはできません。 ただし、パラメーター化されたビューを SQL 表関数として作成することは可能です。

全選択では、FROM 節に SQL データ変更ステートメントを組み込めません (SQLSTATE 428FL)。

型付きビューおよびサブビューの場合: fullselect は、以下の規則に準拠していなければなりません。 そうでない場合、エラーが戻されます (特に他の指定がなければ、SQLSTATE 428EA)。
  • 全選択に、DBPARTITIONNUM または HASHEDVALUE 関数、非 deterministic 関数、 または外部アクションを持つように定義されている関数への参照を含めることはできません。
  • ビューの本体は、単一の副選択、または複数の副選択の UNION ALL で構成する必要があります。 ビューの本体に直接加わっている各副選択を、ビューの分岐 と呼びます。 ビューには、1 つかそれ以上の分岐がある場合があります。
  • 各分岐の FROM 節は、単一の表またはビュー (その分岐の基礎 表またはビューといい、 必ずしも型付きではない) で構成される必要があります。
  • 各分岐の基礎表またはビューは、別々の階層にする必要があります (つまり、 ビューは、同じ階層内の基礎表またはビューが付いた複数の分岐を持つことはできません)。
  • 型付きビュー定義の分岐はいずれも GROUP BY または HAVING を指定できません。
  • ビューの本体に UNION ALL が含まれる場合、 階層内にあるルート・ビュー の OID 列に UNCHECKED オプションを指定する必要があります。
ビューおよびサブビューの階層の場合 : BR1 および BR2 が、 階層内のビュー定義に現れる分岐になるようにします。 T1 を BR1 の基礎表またはビューに、T2 を BR2 の基礎表またはビューにします。 この場合は以下のようになります。
  • T1 および T2 が同じ階層でない場合、 ビュー階層にあるルート・ビューの OID 列に UNCHECKED オプションを指定する必要があります。
  • T1 および T2 が同じ階層にある場合、 行セットが結合しないことを十分保証する述部または ONLY 節を、 BR1 および BR2 に含める必要があります。
EXTEND AS を使って定義された型付きサブビューの場合: サブビューの本体内の各分岐について:
  • 各分岐の基礎表は、 すぐ上のスーパービューのどこか (必ずしも厳密ではない) の基礎表の副表でなければなりません。
  • SELECT リストの式は、 サブビューの非継承列に割り当てられなければなりません (SQLSTATE 42854)。
AS (EXTEND なし) を使って定義された型付きサブビューの場合:
  • サブビューの本体内にあるそれぞれの分岐について、SELECT リストにある式は、 サブビューの継承列と非継承列の宣言済みタイプに割り当てられるようにする必要があります (SQLSTATE 42854)。
  • サブビューで指定した階層上のそれぞれの分岐の OID 式は、 ルート・ビュー内の同じ階層上の分岐の OID 式と (キャスト以外で) 同じでなければなりません。
  • スーパービュー内の READ ONLY として (暗黙的または明示的に) 指定されていない列の式は、 そのサブビュー内の同じ基礎階層上のすべての分岐と同じでなければなりません。
WITH CHECK OPTION
ビューによって挿入または更新される行すべてが、 ビューの定義に従っていなければならないという制約を指定します。 ビューの定義に従わない行とは、ビューの検索条件を満たしていない行です。
WITH CHECK OPTION は、以下のいずれかの条件が真である場合には指定できません。
  • ビューが読み取り専用である場合 (SQLSTATE 42813)。 挿入が許されていない更新可能なビューに対して WITH CHECK OPTION を指定すると、 制約は更新にのみ適用されます。
  • ビューが、DBPARTITIONNUM または HASHEDVALUE 関数、非 deterministic 関数、 または外部アクションを伴う関数を参照する場合 (SQLSTATE 42997)。
  • ニックネームがビューの更新の対象である場合。
  • INSTEAD OF トリガーが定義されているビューが、ビューの更新対象である場合 (SQLSTATE 428FQ)。
WITH CHECK OPTION を省略すると、 ビューを使用するどのような挿入操作または更新操作のチェックにおいても、ビューの定義は使用されません。 ただし、ビューが WITH CHECK OPTION が指定された他のビューに直接または間接的に従属する場合には、 挿入操作または更新操作の過程で、何らかのチェックが行われる場合があります。 ビューの定義が使用されるわけではないため、 ビューを介して、ビューの定義に従っていない行が挿入または更新される可能性があります。
CASCADED
ビュー V に対する WITH CASCADED CHECK OPTION 制約は、 V が従属するいずれかの更新可能ビューから、 制約としての検索条件を V が継承することを意味します。 さらに、V に従属するすべての更新可能ビューも、 このような制約の対象になります。 したがって、V の検索条件と、 V が従属している各ビューの検索条件との AND を取ったものが、 V あるいは V に従属するいずれかのビューの挿入または更新に対して 適用される制約となります。
LOCAL
ビュー V に対する WITH LOCAL CHECK OPTION 制約は、 V の検索条件が、 V または V に従属するいずれかのビューの挿入あるいは更新に対する 制約として適用されることを意味しています。
次の例は、CASCADED と LOCAL の差異を示しています。 次のような更新可能なビューを想定します (Y は、下記の表の列見出しに示しているように、 LOCAL または CASCADED に置き換えます)。
   V1 defined on table T
   V2 defined on V1 WITH Y CHECK OPTION
   V3 defined on V2
   V4 defined on V3 WITH Y CHECK OPTION
   V5 defined on 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)
WITH NO ROW MOVEMENT または WITH ROW MOVEMENT
基礎表のチェック制約に違反する方法で行が更新されたときに、 更新可能 UNION ALL ビューに対して行うアクションを指定します。 デフォルトは WITH NO ROW MOVEMENT です。
WITH NO ROW MOVEMENT
基礎表のチェック制約に違反する方法で行が更新されたときに、 エラー (SQLSTATE 23513) を戻すよう指定します。
WITH ROW MOVEMENT
表のチェック制約に対する違反があっても、更新された行を該当する基礎表に移動させるよう指定します。

行の移動には、チェック制約に違反する行の削除と、それらの行のビューへの再挿入が関係します。 WITH ROW MOVEMENT 節を指定できるのは、 UNION ALL ビューの列がすべて更新可能になっている場合だけです (SQLSTATE 429BJ)。 行が削除されたのと同じ基礎表に行が挿入される (おそらく、トリガー起動の後) 場合は、 エラーが戻されます (SQLSTATE 23524)。 WITH ROW MOVEMENT 節を使用して定義されたビューには、 最外部の全選択を除き、ネストされた UNION ALL 操作を含めることはできません (SQLSTATE 429BJ)。 WITH ROW MOVEMENT 節を使用して定義されたビューには、システム期間テンポラル表、アプリケーション期間テンポラル表、またはバイテンポラル表への参照を含めることはできません。