CREATE VIEW - Amazon Aurora DSQL

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

CREATE VIEW

CREATE VIEW 可定義新的持久性檢視。Aurora DSQL 不支援暫時檢視;僅支援持久性檢視。

支援的語法

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

Description

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

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

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

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

Parameters

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) — 此參數可以是 localcascaded,且等同於指定 WITH [ CASCADED | LOCAL ] CHECK OPTION

  • security_barrier (boolean) — 如果檢視是為了提供資料列層級安全性,則應使用此項目。Aurora DSQL 目前不支援資料列層級安全性,但此選項仍會強制先評估檢視WHERE的條件 (以及任何使用標記為 之運算子的條件LEAKPROOF)。

  • security_invoker (boolean) — 此選項會根據檢視使用者的權限檢查基礎關係,而不是檢視擁有者。如需完整詳細資訊,請參閱以下備註。

您可以使用 ALTER VIEW,變更現有檢視上的上述所有選項。

query

提供檢視資料欄和資料列的 SELECTVALUES命令。

WITH [ CASCADED | LOCAL ] CHECK OPTION

此選項可控制自動更新檢視的行為。指定此選項時,系統會檢查檢視上的 INSERTUPDATE 命令,以確保新資料列符合檢視定義條件 (亦即會檢查新的資料列,確保它們可透過檢視顯示)。若不符合,則會拒絕更新。如果未指定 CHECK OPTION,則系統會允許檢視上的 INSERTUPDATE 命令建立無法透過檢視顯示的資料列。

LOCAL — 僅依據檢視本身直接定義的條件,檢查新資料列。不依據在基礎檢視上定義的任何條件進行檢查 (除非它們也指定 CHECK OPTION)。

CASCADED — 依據檢視和所有基礎檢視的條件,檢查新資料列。如果指定 CHECK OPTION,而未指定 LOCALCASCADED,則會假設 CASCADED

注意

CHECK OPTION 可能無法與 RECURSIVE 檢視搭配使用。CHECK OPTION 僅支援可自動更新的檢視。

備註

使用 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 INVOKERSECURITY DEFINER

  • 建立或取代檢視的使用者,必須擁有檢視查詢中所參考任何結構描述的 USAGE 權限,才能在這些結構描述中查詢參考的物件。

  • 在現有檢視上使用 CREATE OR REPLACE VIEW 時,只會變更檢視的定義 SELECT 規則,以及任何 WITH ( ... ) 參數和其 CHECK OPTION。其他檢視屬性,包括擁有權、許可和非 SELECT 規則,保持不變。您必須擁有檢視才能將其取代 (包括成為擁有角色的成員)。

可更新的檢視

簡單檢視可自動更新:系統允許檢視使用 INSERTUPDATEDELETE 陳述式;方法與一般資料表相同。如果檢視符合下列所有條件,則可自動更新檢視:

  • 檢視的 FROM 清單中必須只有一個項目,且該項目必須是資料表或其他可更新的檢視。

  • 檢視定義最上層不得包含 WITHDISTINCTGROUP BYHAVINGLIMITOFFSET 子句。

  • 檢視定義最上層不得包含集合操作 (UNIONINTERSECTEXCEPT)。

  • 檢視的選取清單不得包含任何彙總、視窗函數或集合傳回函數。

可自動更新的檢視可能混合可更新和不可更新資料欄。如果資料欄是基礎關係可更新資料欄的簡單參考,則可更新資料欄。否則,資料欄為唯讀,一旦 INSERTUPDATE 陳述式嘗試為其指派值,則會發生錯誤。

根據預設,不符合上述所有條件的更複雜檢視為唯讀:系統不允許在這類檢視上插入、更新或刪除。

注意

在檢視上執行插入、更新或刪除的使用者,必須具有該檢視的插入、更新或刪除相應權限。根據預設,檢視的擁有者必須具有基礎關係的相關權限,而執行更新的使用者不需要基礎關係的任何許可。不過,如果檢視的 security_invoker 設為 true,則執行更新的使用者 (而不是檢視擁有者) 必須具有基礎關係的相關權限。

範例

建立包含所有喜劇影片的檢視。

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;

相容性

CREATE OR REPLACE VIEW 是 PostgreSQL 語言擴充功能。WITH ( ... ) 子句、安全屏障檢視和安全調用端檢視也是擴充功能。Aurora DSQL 支援這些語言擴充功能。