

# `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` 列表中必须确切只有一个条目，该条目必须是一个表或另一个可更新的视图。
+ 视图定义不得在顶层包含 `WITH`、`DISTINCT`、`GROUP BY`、`HAVING`、`LIMIT` 或 `OFFSET` 子句。
+ 视图定义不得在顶层包含集合操作（`UNION`、`INTERSECT` 或 `EXCEPT`）。
+ 视图的选择列表不得包含任何聚合、窗口函数或返回集合的函数。

可自动更新的视图可能包含可更新和不可更新的列的组合。如果列是对底层基本关系的可更新列的简单引用，则该列是可更新的。否则，该列是只读的，如果 `INSERT` 或 `UPDATE` 语句尝试为其赋值，则会发生错误。

默认情况下，未满足所有这些条件的更复杂的视图是只读的：系统不支持在视图上执行插入、更新或删除操作。

**注意**  
在视图上执行插入、更新或删除操作的用户必须对该视图具有相应的插入、更新或删除权限。默认情况下，视图的所有者必须对底层基本关系拥有相关的权限，而执行更新的用户不需要对底层基本关系拥有任何权限。但是，如果视图将 security\_invoker 设置为 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 支持这些语言扩展。