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

Amazon Aurora DSQL 作为预览服务提供。要了解更多信息,请参阅 AWS 服务条款中的测试版和预览版。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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— 此选项控制可自动更新的视图的行为。指定此选项后INSERT,将检查视图上的UPDATE命令以确保新行满足视图定义条件(也就是说,检查新行以确保它们在视图中可见)。如果不是,则更新将被拒绝。如果未指定INSERT,则允许视图上的UPDATE命令创建在视图中不可见的行。CHECK OPTION支持以下检查选项。

  • 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。例如,CURRENT_USER直接在视图中调用将始终返回调用用户,而不是视图所有者。这不受视图设置的影响,因此security_invoker设置为 false 的视图不等同于SECURITY DEFINER函数。security_invoker

  • 创建或替换视图的用户必须具有视图查询中提及的任何架构的USAGE权限,才能在这些架构中查找引用的对象。但是请注意,只有在创建或替换视图时才会进行这种查找。因此,即使对于安全调用者视图,视图的用户也只需要对包含视图的架构拥有USAGE权限,而不需要视图查询中引用的架构的权限。

  • 在现有视图上使用时CREATE OR REPLACE VIEW,仅更改视图的定义SELECT规则以及所有WITH ( ... )CHECK OPTION参数及其参数。其他视图属性,包括所有权、权限和非选择规则,保持不变。您必须拥有视图才能替换它(这包括成为拥有角色的成员)。

可更新的视图

简单视图可以自动更新:系统将允许INSERT以与普通表相同的方式在视图上使用UPDATE、和DELETE语句。如果视图满足以下所有条件,则该视图可以自动更新:

  • 视图的FROM列表中必须只有一个条目,该条目必须是表或其他可更新的视图。

  • 视图定义不得在顶层包含WITHDISTINCTGROUP BYHAVINGLIMIT、、、或OFFSET子句。

  • 视图定义不得包含顶层的集合操作(UNIONINTERSECT、或EXCEPT)。

  • 视图的选择列表不得包含任何聚合、窗口函数或返回集合的函数。

可自动更新的视图可能包含可更新和不可更新的列的组合。如果列是对基础基础关系中可更新列的简单引用,则该列是可更新的。否则,该列是只读的,如果INSERTUPDATE语句尝试为其赋值,则会发生错误。

对于可自动更新的视图,系统会将视图上的任何INSERTUPDATE、或DELETE语句转换为基础基础关系上的相应语句。 INSERT完全支持带有ON CONFLICT UPDATE子句的语句。

如果可自动更新的视图包含WHERE条件,则该条件会限制基本关系的哪些行可供视图上的DELETE语句UPDATE进行修改。但是,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';

此视图将支持INSERTUPDATE、和DELETE。电影表中的所有列都将是可更新的,而计算的列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

视图的新名称。

新架构

视图的新架构。

SET (view_option_name [= view_option_value] [,...])
重置(view_option_name [,...])

设置或重置视图选项。目前支持的选项如下。

  • check_option (enum)— 更改视图的复选选项。值必须为 localcascaded

  • security_barrier (boolean)— 更改视图的安全屏障属性。该值必须是布尔值,例如truefalse

  • security_invoker (boolean)— 更改视图的安全屏障属性。该值必须是布尔值,例如truefalse

备注

出于历史 PG 的原因,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 扩展)。