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

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 系统视图。

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 的联合查询功能的预发行文档,该功能处于预览版本。文档和功能都可能会更改。我们建议您只在测试集群中使用此功能,而不要在生产环境中使用。有关预览条款和条件,请参阅 Amazon 服务条款中的测试版服务参与

以下语法描述了用于使用至 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'             

以下语法描述了用于使用跨 数据库查询引用数据的 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 尝试创建已存在的 schema 时不会失败。

local_schema_name

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

FROM [ DATA CATALOG ] | HIVE METASTORE

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

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 中定义的。

FROM REDSHIFT

指示数据库位于 Amazon Redshift 中的关键词。

DATABASE“redshift_database_name”SCHEMA“redshift_schema_name

Amazon Redshift 数据库的名称。

redshift_schema_name 指示 Amazon Redshift 中的 schema。默认的 redshift_schema_namepublic

数据库“federated_database_name

在支持的 PostgreSQL or MySQL 数据库引擎中指示外部数据库名称的关键词。

[SCHEMA 'schema_name']

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

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

REGION 'aws-region'

如果外部数据库是在 Athena 数据目录或 Amazon Glue Data Catalog 中定义的,则为数据库所在的 Amazon 区域。如果数据库是在外部 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 Resource Name (ARN),您的集群使用该角色进行身份验证和授权。IAM 角色至少必须有权在要访问的 Amazon S3 存储桶上执行 LIST 操作和有权在该存储桶包含的 Amazon S3 对象上执行 GET 操作。如果外部数据库是在 Amazon Athena 数据目录或 Amazon Glue Data Catalog 中定义的,则 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'

使用 Amazon Secrets Manager 创建的支持的 PostgreSQL 或 MySQL 数据库引擎密钥的 Amazon Resource Name (ARN)。有关如何为密钥创建和检索 ARN 的信息,请参阅 Amazon Secrets Manager用户指南中的创建基本密钥检索密值密钥

CATALOG_ROLE 'catalog-role-arn-string'

IAM 角色的 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 权限。

使用说明

有关使用 Athena 数据目录时的限制,请参阅 Amazon 一般参考中的 Athena 限制

有关使用 Amazon Glue Data Catalog 时的限制,请参阅 Amazon 一般参考中的 Amazon 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 数据库的外部 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'

以下示例创建一个外部 schema 来引用导入到使用者集群上的 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'