本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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)— 此參數可以是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僅支援可自動更新的檢視。
備註
使用 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 規則,保持不變。您必須擁有檢視才能將其取代 (包括成為擁有角色的成員)。
可更新的檢視
簡單檢視可自動更新:系統允許檢視使用 INSERT、UPDATE 和 DELETE 陳述式;方法與一般資料表相同。如果檢視符合下列所有條件,則可自動更新檢視:
-
檢視的
FROM清單中必須只有一個項目,且該項目必須是資料表或其他可更新的檢視。 -
檢視定義最上層不得包含
WITH、DISTINCT、GROUP BY、HAVING、LIMIT或OFFSET子句。 -
檢視定義最上層不得包含集合操作 (
UNION、INTERSECT或EXCEPT)。 -
檢視的選取清單不得包含任何彙總、視窗函數或集合傳回函數。
可自動更新的檢視可能混合可更新和不可更新資料欄。如果資料欄是基礎關係可更新資料欄的簡單參考,則可更新資料欄。否則,資料欄為唯讀,一旦 INSERT 或 UPDATE 陳述式嘗試為其指派值,則會發生錯誤。
根據預設,不符合上述所有條件的更複雜檢視為唯讀:系統不允許在這類檢視上插入、更新或刪除。
注意
在檢視上執行插入、更新或刪除的使用者,必須具有該檢視的插入、更新或刪除相應權限。根據預設,檢視的擁有者必須具有基礎關係的相關權限,而執行更新的使用者不需要基礎關係的任何許可。不過,如果檢視的 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 支援這些語言擴充功能。