PostgreSQL 9.1.1文書
前のページ | 巻戻し |  | 早送り | 次のページ

# CREATE VIEW

## 名前

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

## 概要

    CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]
        AS query

## 説明

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

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

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

## パラメータ

`TEMPORARY` or `TEMP`

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

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

`name`

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

`column_name`

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

`query`

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

## 注釈

現在のところ、ビューは読み取り専用です。 システムは、ビューに対する挿入、更新、削除を許可しません。 しかし、ビューに対する挿入などを他のテーブルに対する処理に書き換えるルールを作成することで、更新可能なビューと同じように扱うことができます。 詳細については、CREATE RULEを参照してください。

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

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

    CREATE VIEW vista AS SELECT 'Hello World';

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

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

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

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

## 例

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

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

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

## 互換性

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

    CREATE VIEW name [ ( column_name [, ...] ) ]
        AS query
        [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

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

`CHECK OPTION`

  更新される可能性のあるビューには、このオプションを使用しなければなりません。 ビューに対する全ての`INSERT`と`UPDATE`コマンドは、ビュー定義の条件を満足しているかどうか（新しいデータがビューを通して可視であるかどうか）検査されます。 条件を満たしていない場合、その更新は拒否されます。

`LOCAL`

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

`CASCADED`

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

`CREATE OR REPLACE VIEW`はPostgreSQLの言語拡張です。 つまり一時ビューという概念も言語拡張です。

## 関連項目

ALTER VIEW, DROP VIEW

前のページ | ホーム | 次のページ
CREATE USER MAPPING | 上に戻る | DEALLOCATE