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

Amazon Aurora DSQL 以預覽服務的形式提供。若要進一步了解,請參閱 AWS 服務條款中的 Beta 版和預覽版。

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

Aurora DSQL 中支援的 SQL 命令子集

Aurora DSQL 不支援支援 PostgreSQL SQL 中的所有語法。例如,CREATE TABLE在 PostgreSQL 中,Aurora DSQL 不支援大量子句和參數。本節說明 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未指定 ,則允許檢視上的 UPDATE INSERT命令建立無法透過檢視看見的資料列。支援下列檢查選項。

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

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

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

可更新的檢視

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

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

  • 檢視定義不得在頂層包含 WITHDISTINCTLIMIT、、 GROUP BY HAVINGOFFSET子句。

  • 檢視定義不得在頂層包含集合操作 (INTERSECTUNIONEXCEPT)。

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

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

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

如果自動可更新檢視包含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

備註

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

範例

將檢視重新命名foobar

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 擴充功能。