無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

CREATE VIEW

名前

CREATE VIEW -- 新しいビューを定義する

概要

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW 

name

 [ ( 

column_name

 [, ...] ) ]
    [ WITH ( 

view_option_name

 [= 

view_option_value

] [, ... ] ) ]
    AS 

query

説明

CREATE VIEW は問い合わせによるビューを定義します。 ビューは物理的な実体として存在するものではありません。 その代わり、問い合わせでビューが参照される度に、指定された問い合わせが実行されます。

CREATE OR REPLACE VIEW も同様の働きをしますが、 このコマンドでは、同じ名前のビューが既に存在している場合、そのビューを置き換えます。 新しい問い合わせは、既存のビュー問い合わせが生成する列と同じ列(つまり、同じ順序の同じデータ型の同じ列名)を生成しなければなりません。 しかし、そのリストの最後に列を追加しても構いません。 出力列を生成する計算をまったく異なるものにしても構いません。

スキーマ名が付けられている場合(例えば、 CREATE VIEW myschema.myview ... )、ビューは指定されたスキーマで作成されます。 スキーマ名がなければ、そのビューは現在のスキーマで作成されます。 一時ビューは特別なスキーマで作成されます。 そのため、一時ビューを作成する時にはスキーマ名を付けることはできません。 ビュー名は、同じスキーマ内の他のビュー、テーブル、シーケンス、インデックス、外部テーブルとは異なる名前である必要があります。

パラメータ

TEMPORARY or TEMP

これが指定された場合、ビューは一時ビューとして作成されます。 現在のセッションが終わった時、一時ビューは自動的に削除されます。 一時ビューが存在する間、現在のセッションでは、これと同じ名前の永続リレーションはスキーマで修飾した名前で参照していない限り不可視です。

ビューで参照されるテーブルの一部が一時テーブルであった場合、( TEMPORARY の指定があってもなくても)ビューは一時ビューとして作成されます。

RECURSIVE

再帰的ビューを作成します。 以下の構文

CREATE RECURSIVE VIEW 

name

 (

columns

) AS SELECT 

...

;

CREATE VIEW 

name

 AS WITH RECURSIVE 

name

 (

columns

) AS (SELECT 

...

) SELECT 

columns

 FROM 

name

;

と同じです。 再帰的ビューではビューの列リストを指定する必要があります。

name

作成するビューの名前です(スキーマ修飾名も可)。

column_name

ビューの列名として使用する名前のリストです。このパラメータは省略可能です。省略された場合、問い合わせに由来する名前が使用されます。

WITH ( view_option_name [= view_option_value ] [, ... ] )

この句はビュー用の省略可能なパラメータを指定します。 現時点でサポートされるパラメータ名は security_barrier のみです。 行レベルのセキュリティを提供することを意図したビューでは、これを有効にしなければなりません。 詳細については 項38.5 を参照してください。

query

ビューの列と行を生成する SELECT または VALUES コマンドです。

注釈

ビューを削除するには、 DROP VIEW 文を使用してください。

ビューの列の名前と型は指定通りに割り当てられることに注意してください。 例えば、次のコマンドを見てください。

CREATE VIEW vista AS SELECT 'Hello World';

この例は、次の2点から好ましくありません。 まず、列の名前がデフォルトの ?column? になります。さらに、列のデータ型もデフォルトの unknown になってしまいます。 ビューの結果として文字リテラルを返したい場合は、次のように指定してください。

CREATE VIEW vista AS SELECT text 'Hello World' AS hello;

ビューが参照するテーブルにアクセスできるかどうかは、ビューの所有者の権限で決定されます。 これは、場合によっては、背後のテーブルへのアクセスが制限されますが、安全性を提供するために使用することができます。 しかしすべてのビューが不正な改変に対して安全ではありません。 項38.5 を参照してください。 ビュー内で実行される関数については、ビューを使用した問い合わせにおいて、その関数が直接呼び出された場合と同様に扱われます。 したがって、ビューを使用するユーザには、ビュー内で使用される全ての関数を呼び出す権限が必要です。

CREATE OR REPLACE VIEW が既存のビューに対して使用されると、ビューを定義するSELECTルールのみが変更されます。 所有者情報、権限、SELECT以外のルールなど他のビューの属性はそのまま変更されません。 置き換えるためにはビューの所有者(所有ロールのメンバである場合も含む)でなければなりません。

更新可能ビュー

簡単なビューは自動的に更新可能です。 システムは、ビューに対する INSERT UPDATE DELETE 文を通常のテーブルの場合と同じ方法で使用できるようにします。 以下の条件のすべてを満たす場合に、ビューは自動的に更新可能です。

  • ビューの FROM リストでは正確に1つの項目を持たなければならず、それはテーブルまたは他の更新可能ビューでなければなりません。

  • ビューの定義の最上位レベルにおいて WITH DISTINCT GROUP BY HAVING LIMIT OFFSET を含めてはなりません。

  • ビューの定義の最上位レベルにおいて集合操作( UNION INTERSECT EXCEPT )を含めてはなりません。

  • ビューの選択リスト内の列はすべて基となるリレーションの列に対する単純な参照でなければなりません。 式、リテラル、関数とすることはできません。 システム列も参照することができません。

  • ビューの選択リストにおいて元となるリレーションの列を複数回記述することができません。

  • ビューは security_barrier 属性を持ってはなりません。

ビューが自動更新可能であれば、システムはビューに対する INSERT UPDATE または DELETE 文を基となるベースリレーションへの対応する文に変換します。

自動更新可能ビューが WHERE 条件を持つ場合、 ベースリレーションのどの行をビューに対する UPDATE DELETE 文により変更可能かをその条件が制限します。 しかし UPDATE による行の変更の結果 WHERE を満たさなくなることがあり得ます。 その場合、ビューからは参照することができなくなります。 同様に INSERT WHERE 条件を満たさない行をベースリレーションに挿入する可能性があり、同様にビューを通して参照することができません。

これらの条件をすべて満たさないより複雑なビューはデフォルトで読み取り専用です。 システムはビューに対する挿入、更新、削除を許可しません。 ビューに対する INSTEAD OF トリガを作成することで、更新可能ビューの効果を得ることができます。 このトリガはビューに対する挿入試行などを他のテーブルに対する適切な操作に変換するものでなければなりません。 詳細については CREATE TRIGGER を参照してください。 他にもルールを作成する( CREATE RULE 参照)ことでも実現できますが、実際にはトリガの方が理解しやすく正しく使用することができます。

ビューに対する挿入、更新、削除を行うユーザは、ビューに対して対応する挿入、更新、削除権限を持たなければなりません。 さらにビューの所有者は基となるベースリレーションに対する適切な権限を持たなければなりません。 しかし、更新を行うユーザは基となるベースリレーションに対する権限をまったく必要としません( 項38.5 参照)。

全てのコメディ映画(Comedy films)からなるビューを作成します。

CREATE VIEW comedies AS
    SELECT *
    FROM films
    WHERE kind = 'Comedy';

これはビューを作成した時点で film テーブル内にある列を持つビューを作成します。 ビューを作成するために * が使用されていますが、その後にテーブルに追加された列はビューには含まれません。

1から100までの数からなる再帰的ビューを作成します。

CREATE RECURSIVE VIEW nums_1_100 (n) AS
    VALUES (1)
UNION ALL
    SELECT n+1 FROM nums_1_100 WHERE n < 100;

互換性

標準SQLの CREATE VIEW 文には、さらにいくつかの機能が規定されています。

CREATE VIEW 

name

 [ ( 

column_name

 [, ...] ) ]
    AS 

query


    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

このSQLコマンドの全てのオプション句について、次に説明します。

CHECK OPTION

このオプションは自動更新可能ビューの動作を制御します。 指定されると、ビューに対する INSERT および UPDATE コマンドは、新しい行がビュー定義の条件を確実に満たすか(つまり新しい行がビューを通して参照できるか)検\\ 査されます。 満たさない場合は更新は拒否されます。 CHECK OPTION がない場合、ビューに対する INSERT および UPDATE により、ビューを通して参照できない行を作成することができます。 (現時点では後者の動作は PostgreSQL によってのみ提供されています。)

LOCAL

このビューの整合性を検査します。

CASCADED

このビューと依存している全てのビューの整合性を検査します。 CASCADED または LOCAL のいずれも指定されていない場合は、 CASCADED として扱われます。

CREATE OR REPLACE VIEW PostgreSQL の言語拡張です。 つまり一時ビューという概念も言語拡張です。 同様に WITH 句も拡張です。

関連項目

ALTER VIEW , DROP VIEW , CREATE MATERIALIZED VIEW

powered by SEO.CUG.NET