Aurora DSQL 中支援的 SQL 命令子集 - Amazon Aurora DSQL

Aurora DSQL 中支援的 SQL 命令子集

本節 PostgreSQL 提供支援運算式的詳細資訊,並著重在含大量參數集和子命令的命令。例如,PostgreSQL 中的 CREATE TABLE 提供許多子句和參數。本節說明 Aurora DSQL 針對這些命令支援的所有 PostgreSQL 語法元素。

CREATE TABLE

CREATE TABLE 可定義新的資料表。

CREATE TABLE [ IF NOT EXISTS ] table_name ( [ { column_name data_type [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option ... ] } [, ... ] ] ) where column_constraint is: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression )| DEFAULT default_expr | GENERATED ALWAYS AS ( generation_expr ) STORED | UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters | PRIMARY KEY index_parameters | and table_constraint is: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | and like_option is: { INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | ALL } index_parameters in UNIQUE, and PRIMARY KEY constraints are: [ INCLUDE ( column_name [, ... ] ) ]

ALTER TABLE

ALTER TABLE 可變更資料表的定義。

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME [ COLUMN ] column_name TO new_column_name ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME CONSTRAINT constraint_name TO new_constraint_name ALTER TABLE [ IF EXISTS ] name RENAME TO new_name ALTER TABLE [ IF EXISTS ] name SET SCHEMA new_schema where action is one of: ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }

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 ]

描述

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

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

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

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

參數

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。例如,在檢視中直接呼叫 CURRENT_USER,一律會傳回調用使用者,而不是檢視擁有者。這不受檢視的 security_invoker 設定影響,因此將檢視的 security_invoker 設為 false 不等同於 SECURITY DEFINER 函數。

  • 建立或取代檢視的使用者,必須擁有檢視查詢中所參考任何結構描述的 USAGE 權限,才能在這些結構描述中查詢參考的物件。不過請注意,此查詢只會在建立或取代檢視時發生。因此,檢視使用者只需具備包含檢視之結構描述的 USAGE 權限,不需要檢視查詢所參考結構描述的權限,即使是安全調用端檢視也一樣。

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

可更新的檢視

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

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

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

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

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

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

若是可自動更新的檢視,系統會將檢視上的任何 INSERTUPDATEDELETE 陳述式轉換為基礎關係的對應陳述式。完全支援含 ON CONFLICT UPDATE 子句的 INSERT 陳述式。

如果可自動更新檢視包含 WHERE 條件,該條件會限制哪些基礎關係資料列可供檢視的 UPDATEDELETE 陳述式修改。不過,UPDATE 可以變更資料列,使其不再滿足 WHERE 條件,而無法透過檢視顯示。同樣地,INSERT 命令可能會插入不符合 WHERE 條件的基礎關係資料列,使其無法透過檢視顯示。ON CONFLICT UPDATE 可能也會影響無法透過檢視顯示的現有資料列。

您可以使用 CHECK OPTION 來防止 INSERTUPDATE 命令建立無法透過檢視顯示的資料列。

如果以 security_barrier 屬性標記可自動更新的檢視,則系統一律會在檢視使用者新增任何條件之前評估所有檢視的 WHERE 條件 (以及任何使用運算子標記為 LEAKPROOF 的條件)。請注意,基於此原因,最終未傳回的資料列 (因為未通過使用者的 WHERE 條件) 可能仍會遭到鎖定。您可以使用 EXPLAIN 查看關係層級套用哪些條件 (而不會鎖定資料列),以及未套用哪些條件。

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

注意

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

範例

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

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

這會建立檢視,其中包含建立檢視時 film 資料表中的資料欄。雖然您使用了 * 建立檢視,但稍後新增至資料表的資料欄不會成為檢視的一部分。

使用 LOCAL CHECK OPTION 建立檢視。

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

這會建立檢視,以同時檢查新資料列的 kindclassification

建立混合可更新和不可更新資料欄的檢視。

CREATE VIEW comedies AS SELECT f.*, country_code_to_name(f.country_code) AS country, (SELECT avg(r.rating) FROM user_ratings r WHERE r.film_id = f.id) AS avg_rating FROM films f WHERE f.kind = 'Comedy';

此檢視將支援 INSERTUPDATEDELETE。影片資料表中的所有資料欄將為可更新,而計算的資料欄 countryavg_rating 將為唯讀。

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

雖然遞迴檢視的名稱在此 CREATE 中符合結構描述資格,但其內部自我參考不符合結構描述資格。這是因為隱含建立的一般資料表表達式 (CTE) 名稱無法符合結構描述資格。

相容性

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

ALTER VIEW

ALTER VIEW 陳述式允許變更現有檢視的各種屬性,而 Aurora DSQL 支援此命令的所有 PostgreSQL 語法。

支援的語法

ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name DROP DEFAULT ALTER VIEW [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER VIEW [ IF EXISTS ] name RENAME [ COLUMN ] column_name TO new_column_name ALTER VIEW [ IF EXISTS ] name RENAME TO new_name ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] ) ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] )

描述

ALTER VIEW 會變更檢視的各種輔助屬性。(如果您想要修改檢視的定義查詢,請使用 CREATE OR REPLACE VIEW。) 您必須擁有檢視才能使用 ALTER VIEW。若要變更檢視的結構描述,您還必須具備新結構描述的 CREATE 權限。若要變更擁有者,您必須能夠對新的擁有角色使用 SET ROLE,且該角色必須具有檢視結構描述的 CREATE 權限。這些限制會強制透過捨棄並重新建立檢視,確保即使變更擁有者也不會執行您無權執行的任何動作。)

參數

ALTER VIEW 參數

name

現有檢視的名稱 (選擇性符合結構描述資格)。

column_name

現有資料欄的新名稱。

IF EXISTS

如果檢視不存在,不要擲回錯誤。在此情況下會發出通知。

SET/DROP DEFAULT

這些表單會設定或移除資料欄的預設值。系統會以目標為檢視的任何 INSERTUPDATE 命令,來替代檢視資料欄的預設值。檢視的預設值優先於基礎關係的任何預設值。

new_owner

檢視新擁有者的使用者名稱。

new_name

檢視的新名稱。

new_schema

檢視的新結構描述。

SET ( view_option_name [= view_option_value] [, ... ] )
RESET ( view_option_name [, ... ] )

設定或重設檢視選項。以下是支援的選項。

  • check_option (enum) - 變更檢視的檢查選項。值必須為 localcascaded

  • security_barrier (boolean) - 變更檢視的安全屏障屬性。值必須為布林值,例如 truefalse

  • security_invoker (boolean) - 變更檢視的安全屏障屬性。值必須為布林值,例如 truefalse

備註

基於 PostgreSQL 歷史原因,ALTER TABLE 也可以搭配使用檢視;但唯一允許搭配使用檢視的 ALTER TABLE 變數等同於先前所示的變數。

範例

將檢視 foo 重新命名為 bar

ALTER VIEW foo RENAME TO bar;

將預設資料欄值連接至可更新檢視。

CREATE TABLE base_table (id int, ts timestamptz); CREATE VIEW a_view AS SELECT * FROM base_table; ALTER VIEW a_view ALTER COLUMN ts SET DEFAULT now(); INSERT INTO base_table(id) VALUES(1); -- ts will receive a NULL INSERT INTO a_view(id) VALUES(2); -- ts will receive the current time
相容性

ALTER VIEW 是 Aurora DSQL 支援的 SQL 標準 PostgreSQL 擴充功能。

DROP VIEW

DROP VIEW 陳述式會移除現有的檢視。Aurora DSQL 支援此命令的完整 PostgreSQL 語法。

支援的語法

DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP VIEW 會捨棄現有的檢視。您必須是檢視的擁有者才能執行此命令。

參數

IF EXISTS

如果檢視不存在,不要擲回錯誤。在此情況下會發出通知。

name

要移除的檢視名稱 (選擇性符合結構描述資格)。

CASCADE

自動捨棄相依於檢視的物件 (例如其他檢視),進而捨棄所有相依於這些物件的物件。

RESTRICT

如果有任何物件相依於檢視,即拒絕捨棄該檢視。此為預設值。

範例

DROP VIEW kinds;

相容性

此命令符合 SQL 標準,但標準只允許每個命令捨棄一個檢視;IF EXISTS 選項除外,這是 Aurora DSQL 支援的 PostgreSQL 擴充功能。