CREATE EXTERNAL SCHEMA - Amazon Redshift

CREATE EXTERNAL SCHEMA

在当前数据库中创建一个新外部 schema。您可以使用此外部 schema 连接到 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版本数据库。您还可以创建引用外部数据目录(如 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 Data Catalog。要将 AWS Glue Data Catalog 用于 Redshift Spectrum,您可能需要更改您的 AWS Identity and Access Management (IAM) 策略。有关更多信息,请参阅《Athena 用户指南》中的升级到 AWS 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' ]
[ URI 'hive_metastore_uri' [ PORT port_number ] ]
IAM_ROLE { default | 'SESSION' | 'arn:aws:iam::<AWS 账户-id>:role/<role-name>' }
[ SECRET_ARN 'ssm-secret-arn' ]
[ AUTHENTICATION { none | iam } ]
[ CLUSTER_ARN 'arn:aws:kafka:<region>:<AWS 账户-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::<AWS 账户-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::<AWS 账户-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::<AWS 账户-id>:role/<role-name>' }

以下语法描述了 CREATE EXTERNAL SCHEMA 命令,该命令用于引用 Amazon Managed Streaming for Apache Kafka 集群及其要从中摄取的主题。CLUSTER_ARN 指定了您正在从中读取数据的 Amazon MSK 集群。有关更多信息,请参阅 串流摄取

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM MSK
IAM_ROLE { default | 'arn:aws:iam::<AWS 账户-id>:role/<role-name>' }
AUTHENTICATION { none | iam }
CLUSTER_ARN 'msk-cluster-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 数据目录或 AWS Glue Data Catalog 中定义的。

如果外部数据库是在位于其他 AWS 区域的外部 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_namepublic

数据库“federated_database_name

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

[SCHEMA 'schema_name']

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

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

REGION 'aws-region'

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

URI 'hive_metastore_uri' [ PORT port_number ]

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

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

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

注意

支持的 PostgreSQL 或 MySQL 数据库引擎必须位于与 Amazon Redshift 集群相同的 VPC 中。创建一个安全组,链接 Amazon Redshift 和 RDS PostgreSQL 或 Aurora PostgreSQL。

IAM_ROLE { default | 'SESSION' | 'arn:aws:iam::<AWS 账户-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'

使用 AWS Secrets Manager 创建的支持的 PostgreSQL 或 MySQL 数据库引擎密钥的 Amazon 资源名称(ARN)。有关如何为密钥创建和检索 ARN 的信息,请参阅《AWS 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。目录角色必须有权限访问 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 权限。

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 类型为:

CLUSTER_ARN

对于串流摄取,指您从中进行流式传输的 Amazon Managed Streaming for Apache Kafka 集群的集群标识符。有关更多信息,请参阅串流摄取

使用说明

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

有关使用 AWS Glue Data Catalog 时的限制,请参阅《AWS 一般参考》中的 AWS Glue 限制

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

每个数据库最多有 9900 个架构。有关更多信息,请参阅《Amazon Redshift 管理指南》中的配额和限制

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

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

示例

以下示例使用位于美国西部(俄勒冈州)区域的名为 sampledb 的数据目录中的数据库,创建一个外部模式。将此示例与 Athena 或 AWS 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'