

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# `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 ]
```

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

`CREATE VIEW` 可定義查詢的檢視。實際上，檢視並沒有具體化。相反地，每次在查詢中參考檢視時，即會執行查詢。

`CREATE or REPLACE VIEW` 類似，但如果有同名的檢視存在，則會取代該檢視。新查詢產生的資料欄，必須與現有檢視查詢產生的資料欄相同 (亦即相同資料欄名稱、相同順序且資料類型相同)，但其可能會將其他資料欄新增至清單結尾。計算引發的輸出資料欄可能不同。

如果有提供結構描述名稱 (例如 `CREATE VIEW myschema.myview ...`)，則會使用指定的結構描述建立檢視。否則，會使用目前的結構描述建立。

檢視的名稱必須不同於相同結構描述中任何其他關係 (資料表、索引、檢視) 的名稱。

## Parameters
<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 支援這些語言擴充功能。