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

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

CREATE EXTERNAL SCHEMA

在当前数据库中创建一个新外部 schema。对于 Amazon RDS 或 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 | MYSQL }
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 ]

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

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM POSTGRES
DATABASE 'federated_database_name' [SCHEMA 'schema_name']
URI 'hostname' [ PORT port_number ] 
IAM_ROLE 'iam-role-arn-string'
SECRET_ARN 'ssm-secret-arn'             
以下是 Amazon Redshift 的 MySQL 联合身份查询功能的预发布文档,目前为预览版。文档和功能均可能随时更改。我们建议您只在测试集群中使用此功能,而不要在生产环境中使用。有关预览版条款和条件,请参阅 AWS 服务条款中的Beta 服务参与

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

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM MYSQL
DATABASE 'federated_database_name' 
URI 'hostname' [ PORT port_number ]
IAM_ROLE 'iam-role-arn-string'
SECRET_ARN 'ssm-secret-arn'             
这是 Amazon Redshift 的跨数据库查询功能的预发布文档,目前为预览版。文档和功能均可能随时更改。我们建议您只在测试集群中使用此功能,而不要在生产环境中使用。有关预览版条款和条件,请参阅 AWS 服务条款中的 Beta 服务参与。将有关此功能的反馈发送至 redshift-crossdb@amazon.com。

以下语法描述了用于使用跨数据库查询引用数据的 CREATE EXTERNAL SCHEMA 命令。

CREATE EXTERNAL SCHEMA local_schema_name
FROM  REDSHIFT
DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'

Parameters

IF NOT EXISTS

一个子句,指示如果指定 schema 已存在,则此命令不应进行任何更改,并应返回一条指示 schema 存在的消息,而不是以错误终止。此子句在编写脚本时很有用,可使脚本在 CREATE EXTERNAL 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 中定义的。

(预览版)MYSQL 指示外部数据库是在 RDS MySQL 或 Aurora MySQL 中定义的。

FROM REDSHIFT

一个指示数据库位于 Amazon Redshift 中的关键字。

DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'

Amazon Redshift 数据库的名称。

redshift_schema_name 指示 中的架构。Amazon Redshift默认 redshift_schema_namepublic

数据库“federated_database_name

一个关键字,指示受支持的 PostgreSQL 或 MySQL 数据库引擎中外部数据库的名称。

[SCHEMA 'schema_name']

schema_name 指示支持的 数据库引擎中的架构。PostgreSQL默认的 schema_namepublic

对支持的 MySQL 数据库引擎设置联合查询时,您无法指定 SCHEMA。

REGION 'aws-region'

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

URI 'hive_metastore_uri' [ PORT port_number ]

支持的 PostgreSQL 或 MySQL 数据库引擎的主机名 URI 和 port_number。hostname 是副本集的头节点。终端节点必须可以从 Amazon Redshift 集群进行访问(路由)。默认 port_number 为 5432。

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

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

注意

支持的 PostgreSQL 或 MySQL 数据库引擎必须与 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'

使用 PostgreSQL 创建的受支持 MySQL 或 AWS Secrets Manager 数据库引擎密钥的 Amazon 资源名称 (ARN)。有关如何创建和检索密钥的 ARN 的信息,请参阅 https://docs.amazonaws.cn/secretsmanager/latest/userguide/manage_create-basic-secret.html 中的创建基本密钥检索密钥值密钥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 数据目录时的限制,请参阅 中的 Athena 限制。AWS General Reference

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

这些限制不适用于 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'

以下示例创建一个外部 schema 来引用使用者集群上导入的 Sales_db。

CREATE EXTERNAL SCHEMA Sales_schema FROM REDSHIFT DATABASE 'Sales_db' SCHEMA 'public';

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

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