

# `CREATE VIEW`
<a name="create-view"></a>

`CREATE VIEW` は、新しい永続ビューを定義します。Aurora DSQL では、一時ビューはサポートされていません。永続ビューのみがサポートされています。

## サポートされている構文
<a name="create-view-supported-syntax"></a>

```
CREATE [ OR REPLACE ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
    [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
    AS query
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
```

## 説明
<a name="create-view-description"></a>

`CREATE VIEW` は、クエリのビューを定義します。ビューは物理的にマテリアライズされていません。代わりに、クエリでビューが参照されるたびにクエリが実行されます。

`CREATE or REPLACE VIEW` は似ていますが、同じ名前のビューが既に存在する場合は置き換えられます。新しいクエリは、既存のビュークエリによって生成されたのと同じ列 (つまり、同じ順序で同じデータ型を持つ同じ列名) を生成する必要がありますが、リストの最後に列を追加する場合があります。出力列を生成する計算は異なる場合があります。

スキーマ名を指定すると (`CREATE VIEW myschema.myview ...` など)、指定したスキーマでビューが作成されます。指定しない場合、現在のスキーマに作成されます。

ビューの名前は、同じスキーマ内の他のリレーション (テーブル、インデックス、ビュー) の名前とは異なる必要があります。

## パラメータ
<a name="create-view-parameters"></a>

`CREATE VIEW` は、自動更新可能なビューの動作を制御するさまざまなパラメータをサポートしています。

**`RECURSIVE`**  
再帰的ビューを作成します。構文: `CREATE RECURSIVE VIEW [ schema . ] view_name (column_names) AS SELECT ...;` は `CREATE VIEW [ schema . ] view_name AS WITH RECURSIVE view_name (column_names) AS (SELECT ...) SELECT column_names FROM view_name;` と同等です。  
再帰的ビューには、ビューの列名リストを指定する必要があります。

**`name`**  
作成するビューの名前。オプションでスキーマ修飾されている場合があります。再帰的ビューには列名リストを指定する必要があります。

**`column_name`**  
ビューの列に使用されるオプションの名前リスト。列名を指定しない場合、列名はクエリから推定されます。

**`WITH ( view_option_name [= view_option_value] [, ... ] )`**  
この句は、ビューのオプションパラメータを指定します。次のパラメータがサポートされています。  
+ `check_option (enum)` – このパラメータは `local` または `cascaded` のいずれかであり、`WITH [ CASCADED | LOCAL ] CHECK OPTION` を指定した場合と同等です。
+ `security_barrier (boolean)` – これは、ビューで行レベルのセキュリティを提供することを目的とする場合に使用します。現在、Aurora DSQL は行レベルセキュリティをサポートしていませんが、このオプションでは、ビューの `WHERE` 条件 (および `LEAKPROOF` としてマークされている演算子を使用する条件) を最初に強制的に評価します。
+ `security_invoker (boolean)` – このオプションでは、基盤となるベースリレーションが、ビュー所有者ではなくビューのユーザーの権限と照合されます。詳細については、以下のメモを参照してください。
上記のオプションはすべて、`ALTER VIEW` を使用して既存のビューで変更できます。

**`query`**  
ビューの列と行を提供する `SELECT` または `VALUES` コマンド。

**`WITH [ CASCADED | LOCAL ] CHECK OPTION`**  
このオプションは、自動更新可能なビューの動作を制御します。このオプションを指定すると、ビューの `INSERT` および `UPDATE` コマンドがチェックされ、新しい行がビュー定義条件を満たしていることが確認されます (つまり、新しい行がチェックされ、ビューを通じて表示されていることを確認します)。そうでない場合、更新は拒否されます。`CHECK OPTION` が指定されていない場合、ビューの `INSERT` および `UPDATE` コマンドは、ビューでは表示されない行を作成できます。  
`LOCAL` – 新しい行は、ビュー自体で直接定義された条件に対してのみチェックされます。基盤となるベースビューで定義された条件はチェックされません (`CHECK OPTION` も指定しない限り)。  
`CASCADED` – 新しい行は、ビューおよび基盤となるすべてのベースビューの条件と照合されます。`CHECK OPTION` が指定されていて、`LOCAL` も `CASCADED` も指定されていない場合は、`CASCADED` が指定されたと見なされます。  
`CHECK OPTION` は `RECURSIVE` ビューでは使用できません。`CHECK OPTION` は、自動更新可能なビューでのみサポートされます。

## 注意事項
<a name="create-view-notes"></a>

ビューを削除するには、`DROP VIEW` ステートメントを使用します。

ビューの列の名前とデータ型は慎重に検討する必要があります。例えば、CREATE VIEW vista AS SELECT 'Hello World'; は、列名のデフォルトが `?column?;` であるため、お勧めしません。また、列のデータ型はデフォルトで `text` になりますが、これは必要ではない可能性があります。

より良い方法は、`CREATE VIEW vista AS SELECT text 'Hello World' AS hello;` のように列名とデータ型を明示的に指定することです。

デフォルトでは、ビューで参照される基盤となるベースリレーションへのアクセスは、ビュー所有者のアクセス許可によって決まります。場合によっては、これは基盤となるテーブルへの安全で制限されたアクセスを提供するために使用できます。ただし、すべてのビューが改ざんから保護されているわけではありません。
+ ビューの `security_invoker` プロパティが true に設定されている場合、基盤となるベースリレーションへのアクセスは、ビューの所有者ではなく、クエリを実行するユーザーのアクセス許可によって決定されます。したがって、セキュリティ実行者ビューのユーザーは、ビューおよび基盤となるベースリレーションに対する適切なアクセス許可を持っている必要があります。
+ 基盤となるベースリレーションのいずれかがセキュリティ実行者ビューである場合、元のクエリから直接アクセスされたものとして処理されます。したがって、セキュリティ実行者ビューは、`security_invoker` プロパティなしのビューからアクセスされた場合でも、常に現在のユーザーのアクセス許可を使用して、基盤となるベースリレーションをチェックします。
+ ビューで呼び出された関数は、ビューを使用するクエリから直接呼び出された場合と同様に処理されます。したがって、ビューのユーザーは、ビューで使用されるすべての関数を呼び出すアクセス許可を持っている必要があります。ビュー内の関数は、関数が `SECURITY INVOKER` または `SECURITY DEFINER` として定義されているかに応じて、クエリを実行するユーザーの権限または関数の所有者の権限で実行されます。
+ ビューを作成または置換するユーザーは、スキーマ内の参照オブジェクトを検索するために、ビュークエリで参照されるスキーマに対する `USAGE` 権限を持っている必要があります。
+ `CREATE OR REPLACE VIEW` が既存のビューで使用さると、ビューを定義する `SELECT` ルールに加えて、`WITH ( ... )` パラメータとその `CHECK OPTION` のみが変更されます。所有権、アクセス許可、SELECT 以外のルールなど、他のビュープロパティは変更されません。ビューを置き換えるには、ビューの所有者でなければなりません (所有ロールのメンバーである場合も含まれます)。

## 更新可能ビュー
<a name="create-view-updatable-view"></a>

簡単なビューは自動更新可能です。システムは、ビューに対する `INSERT`、`UPDATE`、`DELETE` ステートメントを通常のテーブルの場合と同じ方法で使用できるようにします。ビューは、以下の条件をすべて満たすと、自動更新可能になります。
+ ビューの `FROM` リストに、テーブルまたは更新可能な別のビューの項目が 1 つだけ含まれている必要があります。
+ ビューの定義の最上位レベルには、`WITH`、`DISTINCT`、`GROUP BY`、`HAVING`、`LIMIT` または `OFFSET` 句を含めることはできません。
+ ビューの定義の最上位レベルには、セットオペレーション (`UNION`、`INTERSECT` または `EXCEPT`) を含めることはできません。
+ ビューの選択リストに、集約関数、ウィンドウ関数、集合を返す関数を含めることはできません。

自動更新可能ビューでは、更新可能な列と更新不可能な列を混在させることができます。基盤となるベースリレーションの更新可能な列を単純に参照する列は更新可能です。そうでなければ、列は読み取り専用で、`INSERT` または `UPDATE` ステートメントでその列に値を割り当てようとしたらエラーが発生します。

これらの条件をすべて満たさないより複雑なビューは、デフォルトで読み取り専用です。システムは、ビューに対する挿入、更新、削除を許可しません。

**注記**  
ビューに対する挿入、更新、削除を実行するユーザーには、ビューに対する対応する挿入、更新、または削除の権限が必要です。デフォルトでは、ビューの所有者は基盤となるベースリレーションに対する適切な権限を持っている必要がありますが、更新を行うユーザーは基盤となるベースリレーションに対するアクセス許可を必要としません。ただし、ビューの security\$1invoker が true に設定されている場合、ビューの所有者ではなく更新を行うユーザーが基盤となるベースリレーションに対する適切な権限を持っている必要があります。

## 例
<a name="create-view-examples"></a>

すべてのコメディ映画からなるビューを作成します。

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

`LOCAL CHECK OPTION` でビューを作成します。

```
CREATE VIEW pg_comedies AS
    SELECT *
    FROM comedies
    WHERE classification = 'PG'
    WITH CASCADED CHECK OPTION;
```

再帰的ビューを作成します。

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

## 互換性
<a name="create-view-compatibility"></a>

`CREATE OR REPLACE VIEW` は PostgreSQL の言語拡張です。`WITH ( ... )` 句も拡張であり、セキュリティバリアビューとセキュリティ実行者ビューも同様です。Aurora DSQL は、これらの言語拡張をサポートしています。