CREATE EXTERNAL SCHEMA - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

CREATE EXTERNAL SCHEMA

在当前数据库中创建一个新外部 schema。您可以使用此外部 schema 连接到 Amazon RDS for PostgreSQL 或 与 PostgreSQL 兼容的 Amazon Aurora 数据库。还可以创建引用外部数据目录(如 AWS Glue 或 Athena)中的数据库或 Apache Hive 元存储(如 Amazon EMR)中的数据库的外部 schema。

此 schema 的所有者为 CREATE EXTERNAL SCHEMA 命令的发布者。要移交外部 schema 的所有权,请使用 ALTER SCHEMA 更改所有者。要为其他用户或用户组授予架构的访问权限,请使用 GRANT 命令。

您无法针对外部表的权限使用 GRANT 或 REVOKE 命令。相反,您可以授予或撤销对外部 schema 的权限。

注意

如果您当前在 Amazon Athena 数据目录中有 Redshift Spectrum 外部表,则可以将您的 Athena 数据目录迁移到 AWS Glue 数据目录。要将 AWS Glue 数据目录用于 Redshift Spectrum,您可能需要更改您的 AWS Identity and Access Management (IAM) 策略。更多信息,请参阅 升级到 AWS Glue 数据目录Athena 用户指南.

要查看外部 schema 的详细信息,请查询 SVV_EXTERNAL_SCHEMAS 系统视图。

Syntax

以下语法描述了用于使用外部数据目录引用数据的 CREATE EXTERNAL SCHEMA 命令。有关更多信息,请参阅 使用 Amazon Redshift Spectrum 查询外部数据。)

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM { [ DATA CATALOG ] |  HIVE METASTORE |  POSTGRES }
DATABASE 'database_name'
[ REGION 'aws-region' ]
[ URI 'hive_metastore_uri' [ PORT port_number ] ]
IAM_ROLE 'iam-role-arn-string'
SECRET_ARN 'ssm-secret-arn'             
[ CATALOG_ROLE 'catalog-role-arn-string' ] 
[ CREATE EXTERNAL DATABASE IF NOT EXISTS ]

以下语法描述了用于使用联合查询引用数据的 CREATE EXTERNAL SCHEMA 命令。有关更多信息,请参阅 在 Amazon Redshift 中使用联合查询来查询数据。)

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM  POSTGRES
DATABASE 'database_name' [SCHEMA 'schema_name']
URI 'hostname' [ PORT port_number ] 
IAM_ROLE 'iam-role-arn-string'
SECRET_ARN 'ssm-secret-arn'             

Parameters

IF NOT EXISTS

一个子句,指示如果指定 schema 已存在,则此命令不应进行任何更改,并应返回一条指示 schema 存在的消息,而不是以错误终止。此子句在编写脚本时很有用,可使脚本在 CREATE EXTERNAL SCHEMA 尝试创建已存在的 schema 时不会失败。

local_schema_name

新外部 schema 的名称。有关有效名称的更多信息,请参阅名称和标识符

FROM [ DATA CATALOG ] | HIVE METASTORE

指示外部数据库所在位置的关键词。

DATA CATALOG 指示外部数据库是在 Athena 数据目录或 AWS Glue 数据目录 中定义的。

如果外部数据库是在位于其他 AWS 区域的外部 Data Catalog 中定义的,则 REGION 参数为必填项。DATA CATALOG 是默认值。

HIVE METASTORE 指示外部数据库是在 Apache Hive 元存储中定义的。如果指定了 HIVE METASTORE,则 URI 为必填项。

POSTGRES 指示外部数据库是在 RDS PostgreSQL 或 Aurora PostgreSQL 中定义的。

DATABASE 'database_name' [SCHEMA 'schema_name']

在 RDS PostgreSQL 或 Aurora PostgreSQL 中指示外部数据库名称的关键字。

schema_name 指示 RDS PostgreSQL 或 Aurora PostgreSQL 中的 schema。默认的 schema_namepublic

REGION 'aws-region'

如果外部数据库是在 Athena 数据目录或 AWS Glue 数据目录 中定义的,则为数据库所在的 AWS 区域。如果数据库是在外部 Data Catalog 中定义的,则此参数为必填项。

URI 'hive_metastore_uri' [ PORT port_number ]

RDS PostgreSQL 或 Aurora PostgreSQL 的 hostname URI 和 port_number。hostname 是副本集的头节点。终端节点必须可以从 Amazon Redshift 集群进行访问(路由)。默认 port_number 为 5432。

如果数据库位于 Hive 元存储中,请指定 URI 并选择性地指定元存储的端口号。默认端口号为 9083。

URL不包含协议规范(“http://”)。有效URI示例: uri '172.10.10.10'.

注意

RDS PostgreSQL 或 Aurora PostgreSQL 必须位于与 Amazon Redshift 集群相同的 VPC 中。创建安全组链接 Amazon Redshift 和 RDS PostgreSQL 或 Aurora PostgreSQL。

IAM_ROLE 'iam-role-arn-string'

IAM 角色的 Amazon 资源名称 (ARN),您的集群使用该角色进行身份验证和授权。IAM 角色至少必须有权在要访问的 Amazon S3 存储桶上执行 LIST 操作和有权在该存储桶包含的 Amazon S3 对象上执行 GET 操作。如果外部数据库是在 Amazon Athena 数据目录或 AWS Glue 数据目录 中定义的,则 IAM 角色必须有权访问 Athena,除非指定了 CATALOG_ROLE。有关更多信息,请参阅 适用于 Amazon Redshift Spectrum 的 IAM 策略。) 下面显示了单个 ARN 的 IAM_ROLE 参数字符串的语法。

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'

您可以将角色串联起来,以便集群可以承担另一个 IAM 角色 (可能属于其他账户)。您最多可串联 10 个角色。有关更多信息,请参阅 在 Amazon Redshift Spectrum 中串联 IAM 角色。)

对于此 IAM 角色,请附加类似于以下内容的 IAM 权限策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessSecret", "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "secretsmanager:GetRandomPassword", "secretsmanager:ListSecrets" ], "Resource": "*" } ] }

有关创建 IAM 角色以用于联合查询的步骤,请参阅创建密钥和 IAM 角色以使用联合查询

注意

请不要在链接的角色列表中包含空格。

下面显示了串联三个角色的语法。

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
SECRET_ARN 'ssm-secret-arn'

使用 AWS Secrets Manager 创建的 RDS PostgreSQL 或 Aurora PostgreSQL 密钥的 Amazon 资源名称 (ARN)。有关如何为密钥创建和检索ARN的信息,请参阅 创建基本密钥检索秘密值密钥AWS Secrets Manager 用户指南.

CATALOG_ROLE 'catalog-role-arn-string'

IAM 角色的 ARN,您的集群将该角色用于数据目录的身份验证和授权。如果未指定 CATALOG_ROLE,Amazon Redshift 会使用指定的 IAM_ROLE。目录角色必须有权访问 AWS Glue 或 Athena 中的 Data Catalog。有关更多信息,请参阅 适用于 Amazon Redshift Spectrum 的 IAM 策略。) 下面显示了单个 ARN 的 CATALOG_ROLE 参数字符串的语法。

CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role>'

您可以将角色串联起来,以便集群可以承担另一个 IAM 角色 (可能属于其他账户)。您最多可串联 10 个角色。有关更多信息,请参阅 在 Amazon Redshift Spectrum 中串联 IAM 角色。)

注意

串联角色的列表不能包含空格。

下面显示了串联三个角色的语法。

CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role-1-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-2-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-3-name>'
CREATE EXTERNAL DATABASE IF NOT EXISTS

一个子句,用于在指定的外部数据库不存在时使用由 DATABASE 参数指定的名称创建外部数据库。如果指定的外部数据库存在,该命令不会进行任何更改。在这种情况下,该命令将返回指示外部数据库存在的消息,而不是以错误终止。

注意

CREATE EXTERNAL DATABASE IF NOT EXISTS 不能与 HIVE METASTORE 一起使用。

要将 CREATE EXTERNAL DATABASE IF NOT EXISTS 与为 AWS Lake Formation 启用的Data Catalog 搭配使用,需要获得对于 Data Catalog 的CREATE_DATABASE 权限。

使用说明

有关使用 Athena 数据目录时的限制,请参阅 AWS General Reference 中的 Athena 限制

有关使用 AWS Glue 数据目录 时的限制,请参阅 AWS General Reference 中的 AWS Glue 限制

这些限制不适用于 Hive 元存储。

要取消注册架构,请使用 DROP SCHEMA 命令。

要查看外部架构的详细信息,请查询以下系统视图:

Examples

以下示例使用位于美国西部(俄勒冈)区域的名为 sampledb 的 Athena 数据目录中的数据库,创建一个外部 schema。

create external schema spectrum_schema from data catalog database 'sampledb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';

以下示例创建一个外部 schema 并新建一个名为 spectrum_db 的新外部数据库。

create external schema spectrum_schema from data catalog database 'spectrum_db' iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole' create external database if not exists;

以下示例创建一个使用名为 hive_db 的 Hive 元存储数据库的外部 schema。

create external schema hive_schema from hive metastore database 'hive_db' uri '172.10.10.10' port 99 iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';

以下示例将角色串联起来,以使用角色 myS3Role 来访问 Amazon S3,并且使用 myAthenaRole 进行数据目录访问。有关更多信息,请参阅 在 Amazon Redshift Spectrum 中串联 IAM 角色。)

create external schema spectrum_schema from data catalog database 'spectrum_db' iam_role 'arn:aws:iam::123456789012:role/myRedshiftRole,arn:aws:iam::123456789012:role/myS3Role' catalog_role 'arn:aws:iam::123456789012:role/myAthenaRole' create external database if not exists;

以下示例创建引用 Aurora PostgreSQL 数据库的外部架构。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema FROM POSTGRES DATABASE 'my_aurora_db' SCHEMA 'my_aurora_schema' URI 'endpoint to aurora hostname' PORT 5432 IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole' SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'