CREATE EXTERNAL SCHEMA
在当前数据库中创建一个新外部 schema。您可以使用此外部 schema 连接到 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版本数据库。您还可以创建引用外部数据目录(如 Amazon Glue、Athena)中的数据库或 Apache Hive 元存储(如 Amazon EMR)中的数据库的外部 schema。
此 schema 的所有者为 CREATE EXTERNAL SCHEMA 命令的发布者。要移交外部 schema 的所有权,请使用 ALTER SCHEMA 更改所有者。要为其他用户或用户组授予架构的访问权限,请使用 GRANT 命令。
您无法针对外部表的权限使用 GRANT 或 REVOKE 命令。相反,您可以授予或撤销对外部 schema 的权限。
注意
如果您当前在 Amazon Athena 数据目录中有 Redshift Spectrum 外部表,则可以将您的 Athena 数据目录迁移到 Amazon Glue Data Catalog。要将 Amazon Glue Data Catalog 用于 Redshift Spectrum,您可能需要更改您的 Amazon Identity and Access Management (IAM) 策略。有关更多信息,请参阅《Athena 用户指南》中的升级到 Amazon Glue Data Catalog。
要查看外部 schema 的详细信息,请查询 SVV_EXTERNAL_SCHEMAS 系统视图。
语法
以下语法描述了用于使用外部数据目录引用数据的 CREATE EXTERNAL SCHEMA 命令。有关更多信息,请参阅 Amazon Redshift Spectrum。
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name FROM [ [ DATA CATALOG ] | HIVE METASTORE | POSTGRES | MYSQL | KINESIS | MSK | REDSHIFT ] [ DATABASE 'database_name' ] [ SCHEMA 'schema_name' ] [ REGION 'aws-region' ] [ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<Amazon Web Services 账户-id>
:role/<role-name>
' ] ] [ AUTHENTICATION [ none | iam | mtls] ] [ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ] [ URI ['hive_metastore_uri' [ PORT port_number ] | 'hostname' [ PORT port_number ] | 'msk bootstrap URL'] ] [ CLUSTER_ARN 'arn:aws:kafka:<region>
:<Amazon Web Services 账户-id>
:cluster/msk/<cluster uuid>
' ] [ CATALOG_ROLE [ 'SESSION' | 'catalog-role-arn-string' ] ] [ CREATE EXTERNAL DATABASE IF NOT EXISTS ] [ CATALOG_ID 'Amazon Web Services account ID containing Glue or Lake Formation database' ]
以下语法描述了用于使用至 RDS POSTGRES 或 Aurora PostgreSQL 的联合查询引用数据的 CREATE EXTERNAL SCHEMA 命令。您还可以创建引用流式源的外部 Schema,例如 Kinesis Data Streams。有关更多信息,请参阅 在 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 [ default | 'arn:aws:iam::<Amazon Web Services 账户-id>
:role/<role-name>
' ] SECRET_ARN 'ssm-secret-arn'
以下语法描述了用于使用至 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 [ default | 'arn:aws:iam::<Amazon Web Services 账户-id>
:role/<role-name>
' ] SECRET_ARN 'ssm-secret-arn'
以下语法描述了用于引用 Kinesis 流中数据的 CREATE EXTERNAL SCHEMA 命令。有关更多信息,请参阅 流式摄取到实体化视图。
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name FROM KINESIS IAM_ROLE [ default | 'arn:aws:iam::<Amazon Web Services 账户-id>
:role/<role-name>
' ]
以下语法描述了 CREATE EXTERNAL SCHEMA 命令,该命令用于引用 Amazon Managed Streaming for Apache Kafka 集群及其要从中摄取的主题。要进行连接,您需要提供代理 URI。有关更多信息,请参阅 流式摄取到实体化视图。
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name FROM MSK [ IAM_ROLE [ default | 'arn:aws:iam::<Amazon Web Services 账户-id>
:role/<role-name>
' ] ] URI 'msk bootstrap URL' AUTHENTICATION [ none | iam | mtls ] [ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ];
以下语法描述了用于使用跨 数据库查询引用数据的 CREATE EXTERNAL SCHEMA 命令。
CREATE EXTERNAL SCHEMA local_schema_name FROM REDSHIFT DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'
参数
- IF NOT EXISTS
-
一个子句,指示如果指定 schema 已存在,则此命令不应进行任何更改,并应返回一条指示 schema 存在的消息,而不是以错误终止。此子句在编写脚本时很有用,可使脚本在 CREATE EXTERNAL SCHEMA 尝试创建已存在的 schema 时不会失败。
- local_schema_name
-
新外部 schema 的名称。有关有效名称的更多信息,请参阅名称和标识符。
- FROM [ DATA CATALOG ] | HIVE METASTORE | POSTGRES | MYSQL | KINESIS | MSK | REDSHIFT
-
指示外部数据库所在位置的关键词。
DATA CATALOG 指示外部数据库是在 Athena 数据目录或 Amazon Glue Data Catalog 中定义的。
如果外部数据库是在位于其他 Amazon 区域的外部 Data Catalog 中定义的,则 REGION 参数为必填项。DATA CATALOG 是默认值。
HIVE METASTORE 指示外部数据库是在 Apache Hive 元存储中定义的。如果指定了 HIVE METASTORE,则 URI 为必填项。
POSTGRES 指示外部数据库是在 RDS PostgreSQL 或 Aurora PostgreSQL 中定义的。
MYSQL 表示外部数据库是在 RDS MySQL 或 Aurora MySQL 中定义的。
KINESIS 指示数据来源是一个来自 Kinesis Data Streams 的流。
MSK 表示数据来源是 Amazon MSK 预置的集群或无服务器集群。
- FROM REDSHIFT
-
指示数据库位于 Amazon Redshift 中的关键词。
- DATABASE“redshift_database_name”SCHEMA“redshift_schema_name”
-
Amazon Redshift 数据库的名称。
redshift_schema_name 指示 Amazon Redshift 中的 schema。默认的 redshift_schema_name 为
public
。 - 数据库“federated_database_name”
-
在支持的 PostgreSQL or MySQL 数据库引擎中指示外部数据库名称的关键词。
- [SCHEMA 'schema_name']
-
schema_name 指示支持的 PostgreSQL 数据库引擎中的 schema。默认的 schema_name 是
public
。在设置对受支持的 MySQL 数据库引擎的联合查询时,无法指定 SCHEMA。
- REGION 'aws-region'
-
如果外部数据库是在 Athena 数据目录或 Amazon Glue Data Catalog 中定义的,则为数据库所在的 Amazon 区域。如果数据库是在外部 Data Catalog 中定义的,则此参数为必填项。
- URI [ 'hive_metastore_uri' [ PORT port_number ] | 'hostname' [ PORT port_number ] | 'msk bootstrap URL' ]
-
支持的 PostgreSQL 或 MySQL 数据库引擎的主机名 URI 和 port_number。hostname 是副本集的头节点。端点必须可以从 Amazon Redshift 集群进行访问(路由)。默认的 PostgreSQL port_number 为 5432。默认的 MySQL port_number 为 3306。
注意
支持的 PostgreSQL 或 MySQL 数据库引擎必须与 Amazon Redshift 集群位于同一个 VPC 中,而该集群的安全组将 Amazon Redshift 与 RDS url-rsPostgreSQL 或 Aurora PostgreSQL 相关联。此外,可以使用增强型 VPC 路由来配置跨 VPC 用例。有关更多信息,请参阅 Redshift 托管的 VPC 端点。
指定 Hive 元存储 URI
如果数据库位于 Hive 元存储中,请指定 URI 并选择性地指定元存储的端口号。默认端口号为 9083。
URI 不包含协议规范(“http://”)。有效 URI 示例:
uri '172.10.10.10'
。指定用于流式摄取的代理 URI
包括引导代理 URI,即可连接到 Amazon MSK 集群并接收流式传输数据。有关更多信息以及相关示例,请参阅开始使用 Amazon Managed Streaming for Apache Kafka 流式摄取。
- IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::
<Amazon Web Services 账户-id>
:role/<role-name>
' ] -
使用默认关键字让 Amazon Redshift 使用设置为默认值并在 CREATE EXTERNAL SCHEMA 命令运行时与集群关联的 IAM 角色。
如果您使用联合身份连接到 Amazon Redshift 集群并访问使用此命令创建的外部架构中的表,则使用
'SESSION'
。有关更多信息,请参阅使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限,其中说明了如何配置联合身份。请注意,此配置(使用'SESSION'
替代 ARN)仅在使用DATA CATALOG
创建架构时才能使用。使用 IAM 角色的 Amazon 资源名称(ARN),您的集群使用该角色进行身份验证和授权。IAM 角色至少必须有权在要访问的 Amazon S3 桶上执行 LIST 操作和有权在该桶包含的 Amazon S3 对象上执行 GET 操作。
下面显示了单个 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'
-
使用 Amazon Secrets Manager 创建的支持的 PostgreSQL 或 MySQL 数据库引擎密钥的 Amazon 资源名称(ARN)。有关如何为密钥创建和检索 ARN 的信息,请参阅《Amazon Secrets Manager 用户指南》中的创建基本密钥和检索密值密钥。
- CATALOG_ROLE [ 'SESSION' | catalog-role-arn-string]
-
利用
'SESSION'
,通过使用用于对数据目录进行身份验证和授权的联合身份来连接到 Amazon Redshift 集群。有关完成联合身份的步骤的更多信息,请参阅使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限。请注意,仅在 DATA CATALOG 中创建架构时才能使用'SESSION'
角色。使用 IAM 角色的 Amazon 资源名称(ARN),您的集群使用该角色对数据目录进行身份验证和授权。
如果未指定 CATALOG_ROLE,Amazon Redshift 会使用指定的 IAM_ROLE。目录角色必须有权限访问 Amazon 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 与为 Amazon Lake Formation 启用的 Data Catalog 搭配使用,需要获得对于 Data Catalog 的
CREATE_DATABASE
权限。 - CATALOG_ID 'Amazon Web Services 账户 ID,包含 Glue 或 Lake Formation 数据库'
-
用于存储数据目录数据库的账户 ID。
只有在您计划使用联合身份(用于对数据目录进行身份验证和授权)连接到 Amazon Redshift 集群或 Amazon Redshift Serverless 时,才能通过设置以下任一项来指定
CATALOG_ID
:CATALOG_ROLE
到'SESSION'
将
IAM_ROLE
设置为'SESSION'
,并将'CATALOG_ROLE'
设置为默认值
有关完成联合身份的步骤的更多信息,请参阅使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限。
- AUTHENTICATION
-
为流式摄取定义的身份验证类型。具有身份验证类型的流式摄取使用 Amazon Managed Streaming for Apache Kafka。
AUTHENTICATION
类型为:无 – 指定不需要身份验证。这相当于 MSK 上的未经身份验证访问。
iam – 指定 IAM 身份验证。选择此选项时,请确保 IAM 角色具有 IAM 身份验证的权限。有关定义外部模式的更多信息,请参阅开始使用 Amazon Managed Streaming for Apache Kafka(Amazon MSK)流式摄取。
mtls – 指定双向传输层安全通过促进客户端和服务器之间的身份验证来提供安全通信。在本例中,客户端是 Redshift,服务器是 Amazon MSK。有关使用 mTLS 配置流式摄取的更多信息,请参阅 使用 mTLS 对来自 Amazon MSK 的 Redshift 流式摄取进行身份验证。
- AUTHENTICATION_ARN
-
Amazon Redshift 用于通过 Amazon MSK 进行 mtls 身份验证的 Amazon Certificate Manager 证书的 ARN。当您选择已签发证书时,ARN 就会出现在 ACM 控制台中。
- CLUSTER_ARN
-
对于流式摄取,CLUSTER_ARN 是您从中进行流式传输的 Amazon Managed Streaming for Apache Kafka 集群的集群标识符。使用 CLUSTER_ARN 时,它需要包含
kafka:GetBootstrapBrokers
权限的 IAM 角色策略。此选项是为了向后兼容性而提供的。目前,我们建议使用引导代理 URI 选项连接到 Amazon Managed Streaming for Apache Kafka 集群。有关更多信息,请参阅流式摄取。
使用说明
有关使用 Athena 数据目录时的限制,请参阅《Amazon Web Services 一般参考》中的 Athena 限制。
有关使用 Amazon Glue Data Catalog 时的限制,请参阅《Amazon Web Services 一般参考》中的 Amazon Glue 限制。
这些限制不适用于 Hive 元存储。
每个数据库最多有 9900 个架构。有关更多信息,请参阅《Amazon Redshift 管理指南》中的配额和限制。
要取消注册架构,请使用 DROP SCHEMA 命令。
要查看外部架构的详细信息,请查询以下系统视图:
示例
以下示例使用位于美国西部(俄勒冈州)区域的名为 sampledb
的数据目录中的数据库,创建一个外部模式。将此示例与 Athena 或 Amazon Glue 数据目录结合使用。
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 数据库的外部 schema。
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'
以下示例创建一个外部架构来引用导入到使用者集群上的 sales_db。
CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
以下示例创建引用 Aurora MySQL 数据库的外部 schema。
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'