Datashares for Amazon Redshift 详情
借助 Amazon Redshift,您可以在 Amazon Redshift 集群之间安全地共享实时数据,而无需复制或传输数据。Datashares for Amazon Redshift 使您能够与相同或不同 Amazon 账户和 Amazon 区域中的任何 Amazon Redshift 集群共享实时查询结果,包括源数据的更新。
主题
Amazon Redshift 中的数据共享状态值
本主题介绍数据共享在 Amazon Redshift 中可能具有的状态。
使用跨账户数据共享,需要您执行操作的数据共享具有不同状态。数据共享的状态可以是活动、需要操作或非活动状态。
下面介绍了每个数据共享状态及其需要的操作:
创建器集群管理员创建数据共享时,生产者集群上的数据共享状态为待处理授权。创建器集群管理员可以授权数据使用者访问数据共享。使用者集群管理员没有任何操作。
当创建器集群管理员为数据共享授权时,创建器集群上的数据共享状态为已授权。创建器集群管理员没有任何操作。当数据共享的数据使用者至少存在一个关联时,数据共享状态会从已授权变为活动状态。
使用者集群上的数据共享状态随后变为可用(需要在 Amazon Redshift 控制台上执行操作)。使用者集群管理员可以将数据共享与数据使用者相关联,或拒绝数据共享。使用者集群管理员还可以使用 Amazon CLI 命令
describeDatashareforConsumer
查看数据共享的状态。或者,管理员可以使用 CLI 命令describeDatashare
并提供数据共享 Amazon 资源名称(ARN)以查看数据共享的状态。当使用者集群管理员将数据共享与数据使用者相关联时,创建器集群上的数据共享状态将变为活动状态。当数据共享的数据使用者至少存在一个关联时,数据共享状态会从已授权变为活动状态。创建器集群管理员无需执行任何操作。
使用者集群上的数据共享状态变为活动状态。使用者集群管理员不需要执行任何操作。
当使用者集群管理员从数据共享中删除使用者关联时,数据共享状态将变为活动状态或已授权。当数据共享至少与另一个数据使用者存在一个关联时,状态变为活动状态。当任何使用者与创建器集群上的数据共享没有任何关联时,状态变为已授权。创建器集群管理员没有任何操作。
如果所有关联均被删除,使用者集群上的数据共享状态变为需要操作。当数据共享可供使用者使用时,使用者集群管理员可以将数据共享与数据使用者重新关联。
当使用者集群管理员拒绝数据共享时,创建器集群上的数据共享状态变为需要操作,使用者集群上的数据共享状态变为已拒绝。创建器集群管理员可以重新授权数据共享。使用者集群管理员没有任何操作。
当创建器集群管理员从数据共享中删除授权时,创建器集群上的数据共享的状态将变为需要操作。如果需要,创建器集群管理员可以选择重新授权数据共享。使用者集群管理员不需要执行任何操作。
集群内部和集群之间的数据共享
仅当您在不同的 Amazon Redshift 预置集群或无服务器工作组之间共享数据时才需要使用数据共享。在同一个集群中,只要您对另一个数据库中的对象具有所需的权限,就可以使用由三部分组成的简单表示法 database.schema.table
查询另一个数据库。
在 Amazon Redshift 中管理数据共享的权限
作为创建器集群管理员,您可以保留对正在共享的数据集的控制权。您可以将新对象添加到数据共享中或将其从数据共享中删除。您还可以授予或撤消对使用者集群、Amazon 账户或 Amazon 区域的整体数据共享的访问权。当权限被撤消时,使用者集群立即失去对共享对象的访问权限,并且不能在 SVV_DATASHARES 中的 INBOUND 数据共享列表中看到它们。
以下示例创建数据共享 salesshare
,添加架构 public
,然后将表 public.tickit_sales_redshift
添加到 salesshare
。它还授予指定的集群命名空间对 salesshare
的使用权限。
CREATE DATASHARE salesshare; ALTER DATASHARE salesshare ADD SCHEMA public; ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift; GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
对于 CREATE DATASHARE,超级用户和数据库拥有者可以创建数据共享。有关更多信息,请参阅 CREATE DATASHARE。对于 ALTER DATASHARE,对要添加或删除的数据共享具有所需权限的数据共享拥有者可以更改数据共享。有关更多信息,请参阅 ALTER DATASHARE。
作为创建器管理员,当您删除数据共享时,它将停止在使用者集群上列出。在使用者集群上通过删除的数据共享中创建的数据库和 schema 引用继续存在,其中没有对象。使用者集群管理员必须手动删除这些数据库。
在使用者方面,使用者集群管理员可以通过从数据共享创建数据库来确定哪些用户和角色应该访问共享数据。根据您在创建数据库时选择的选项,您可以按如下方式控制对数据库的访问。有关从数据共享创建数据库的更多信息,请参阅CREATE DATABASE。
有关设置数据共享以及从使用者读取数据的更多信息,请参阅共享对 Amazon 账户内数据的读取访问权限。
在不使用 WITH PERMISSIONS 子句的情况下创建数据库
管理员可以在数据库或 schema 级别控制访问权限。要控制 Schema 级别的访问权限,管理员必须通过从数据共享创建的 Amazon Redshift 数据库创建外部 Schema。
以下示例授予在数据库级别和 schema 级别访问共享表的权限。
GRANT USAGE ON DATABASE sales_db TO Bob; CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE sales_db SCHEMA 'public'; GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
要进一步限制访问,您可以基于共享对象创建视图,以仅显示必要的数据。然后,您可以使用这些视图向用户和角色授予访问权限。
授予用户访问数据库或 Schema 的权限后,他们将有权访问该数据库或 Schema 中的所有共享对象。
使用 WITH PERMISSIONS 子句创建数据库
在授予对数据库或架构的使用权限后,管理员可以使用与本地数据库或架构相同的权限授予过程来进一步控制访问权限。如果没有单个对象的权限,用户即使获得了 USAGE 权限,也无法访问数据共享数据库或架构中的任何对象。
以下示例授予在数据库级别访问共享表的权限。
GRANT USAGE ON DATABASE sales_db TO Bob; GRANT USAGE FOR SCHEMAS IN DATABASE sales_db TO Bob; GRANT SELECT ON sales_db.public.tickit_sales_redshift TO Bob;
在授予用户访问数据库或架构的权限后,还需要授予他们访问数据库或架构中任何对象的相关权限。
使用 WITH PERMISSIONS 进行精细共享
允许集群或 Serverless 工作组查询数据共享
此步骤假设数据共享来自另一个集群或您账户中的 Amazon Redshift Serverless 命名空间,或者来自另一个账户并已与您正在使用的命名空间相关联。
使用者数据库管理员可以从数据共享中创建数据库。
CREATE DATABASE my_ds_db [WITH PERMISSIONS] FROM DATASHARE my_datashare OF NAMESPACE 'abc123def';
如果您使用 WITH PERMISSIONS 创建数据库,则可以向不同的用户和角色授予对数据共享对象的精细权限。否则,所有获得对数据共享数据库的 USAGE 权限的用户和角色都将获得对数据共享数据库中所有对象的所有权限。
以下内容显示如何向 Redshift 数据库用户或角色授予权限。您必须连接到本地数据库才能运行这些语句。如果在运行 grant 语句之前在数据共享数据库上执行 USE 命令,则无法运行这些语句。
GRANT USAGE ON DATABASE my_ds_db TO ROLE data_eng; GRANT CREATE, USAGE ON SCHEMA my_ds_db.my_shared_schema TO ROLE data_eng; GRANT ALL ON ALL TABLES IN SCHEMA my_ds_db.my_shared_schema TO ROLE data_eng; GRANT USAGE ON DATABASE my_ds_db TO bi_user; GRANT USAGE ON SCHEMA my_ds_db.my_shared_schema TO bi_user; GRANT SELECT ON my_ds_db.my_shared_schema.table1 TO bi_user;
在 Amazon Redshift 数据共享中使用视图
创建器集群可以共享常规视图、后期绑定视图和实体化视图。共享常规或后期绑定视图时,不必共享基表。下表介绍了数据共享如何支持视图。
视图名称 | 可以将此视图添加到数据共享中吗? | 使用者是否可以在跨集群的数据共享对象上创建此视图? |
---|---|---|
常规视图 | 是 | 否 |
后期绑定视图 | 是 | 是 |
实体化视图 | 是 | 是,但仅限于完整刷新 |
以下查询显示了数据共享支持的常规视图的输出。有关常规视图定义的信息,请参阅CREATE VIEW。
SELECT * FROM tickit_db.public.myevent_regular_vw ORDER BY eventid LIMIT 5; eventid | eventname ----------+------------- 3835 | LeAnn Rimes 3967 | LeAnn Rimes 4856 | LeAnn Rimes 4948 | LeAnn Rimes 5131 | LeAnn Rimes
以下查询显示了数据共享支持的后期绑定视图的输出。有关后期绑定视图定义的信息,请参阅CREATE VIEW。
SELECT * FROM tickit_db.public.event_lbv ORDER BY eventid LIMIT 5; eventid | venueid | catid | dateid | eventname | starttime --------+---------+-------+--------+------------------------------+--------------------- 1 | 305 | 8 | 1851 | Gotterdammerung | 2008-01-25 14:30:00 2 | 306 | 8 | 2114 | Boris Godunov | 2008-10-15 20:00:00 3 | 302 | 8 | 1935 | Salome | 2008-04-19 14:30:00 4 | 309 | 8 | 2090 | La Cenerentola (Cinderella) | 2008-09-21 14:30:00 5 | 302 | 8 | 1982 | Il Trovatore | 2008-06-05 19:00:00
以下查询显示了数据共享支持的实体化视图的输出。有关实体化视图定义的信息,请参阅CREATE MATERIALIZED VIEW。
SELECT * FROM tickit_db.public.tickets_mv; catgroup | qtysold ----------+--------- Concerts | 195444 Shows | 149905
您可以在创建器集群中的所有租户之间维护公用表。您还可以将按维度列筛选的数据子集,例如 tenant_id
(account_id
或 namespace_id
),共享到使用者集群中。为此,您可以在这些 ID 列上使用筛选器,例如 current_aws_account = tenant_id
,以在基表上定义一个视图。在使用者方面,当您查询视图时,只能看到符合您账户条件的行。为此,您可以使用 Amazon Redshift 上下文函数 current_aws_account
和 current_namespace
。
以下查询返回当前 Amazon Redshift 集群所在的账户 ID。如果您已连接到 Amazon Redshift,则可以运行此查询。
select current_user, current_aws_account; current_user | current_aws_account -------------+-------------------- dwuser | 111111111111 (1row)
以下查询返回当前 Amazon Redshift 集群的命名空间。如果已连接到数据库,则可以运行此查询。
select current_user, current_namespace; current_user | current_namespace -------------+-------------------------------------- dwuser | 86b5169f-01dc-4a6f-9fbb-e2e24359e9a8 (1 row)
对数据共享中的实体化视图进行增量刷新
共享基表时,Amazon Redshift 支持对使用者数据共享中的实体化视图进行增量刷新。增量刷新是一项操作,其中 Amazon Redshift 可识别上次刷新后发生的一个或多个基表中的更改,并仅更新实体化视图中的相应记录。有关此行为的更多信息,请参阅 CREATE MATERIALIZED VIEW。
使用 IAM 策略管理对数据共享 API 操作的访问
要控制对数据共享 API 操作的访问,请使用基于 IAM 操作的策略。有关如何管理 IAM 策略的信息,请参阅《IAM 用户指南》中的管理 IAM 策略。
有关使用数据共享 API 操作所需的权限信息,请参阅《Amazon Redshift 管理指南》中的使用数据共享 API 操作所需的权限。
为了提高跨账户数据共享的安全性,您可以将条件密钥 ConsumerIdentifier
用于 AuthorizeDataShare
和 DeauthorizeDataShare
API 操作。这样您就可以明确控制哪些 Amazon Web Services 账户 可以调用两个 API 操作。
您可以拒绝授权或取消授权任何不属于您自己账户的使用者数据共享。为此,请指定 IAM 策略中的 Amazon Web Services 账户 数字。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "redshift:AuthorizeDataShare", "redshift:DeauthorizeDataShare" ], "Resource": "*", "Condition": { "StringNotEquals": { "redshift:ConsumerIdentifier": "555555555555" } } } ] }
您可以允许拥有 DataShareArn testshare2
的创建者明确与拥有 IAM 策略中 111122223333 的 Amazon Web Services 账户 使用者共享。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "redshift:AuthorizeDataShare", "redshift:DeauthorizeDataShare" ], "Resource": "arn:aws:redshift:us-east-1:666666666666:datashare:af06285e-8a45-4ee9-b598-648c218c8ff1/testshare2", "Condition": { "StringEquals": { "redshift:ConsumerIdentifier": "111122223333" } } } ] }
查询数据共享
在 Amazon Redshift 中访问共享数据
您可以使用标准 SQL 接口、JDBC 或 ODBC 驱动程序以及数据 API 来发现共享数据。您还可以通过熟悉的业务情报 (BI) 和分析工具查询具有高性能的数据。您可以通过引用其他 Amazon Redshift 数据库中的对象来执行查询,这些数据库既是您有权访问的集群的本地对象,也可以从您的集群中远程访问。
您可以简单地通过与集群中的本地数据库保持连接来完成此操作。然后您可以从数据共享创建使用者数据库以使用共享数据。
这样做之后,您可以连接到使用者数据库并使用部分表示法查询共享的对象。或者,也可以连接到本地集群数据库,并使用三部分表示法(
)查询使用者数据库中的对象。您还可以使用指向使用者数据库中架构的外部架构链接进行查询。您可以在同一查询中查询本地数据以及从其它集群共享的数据。此类查询可以引用来自当前已连接数据库和其它未连接数据库中的对象,包括从数据共享创建的使用者数据库。consumer_database_name
.schema_name
.table_name
在 Amazon Redshift 中访问数据共享元数据
为了帮助集群管理员发现数据共享,Amazon Redshift 提供了一组元数据视图来列出数据共享。这些视图列出了在您的集群中创建的数据共享,以及从同一账户内的其他集群和其他账户,或其他 Amazon 区域(预览版)接收的数据共享。这些视图将显示以下信息:
由集群共享和接收的数据共享
数据共享中数据库对象的内容,包括基本共享元数据、对象和使用者
使用 SHOW SCHEMAS 查看与所连接数据库相关联的数据共享中的共享架构列表。有关更多信息,请参阅 SHOW SCHEMAS。
使用 SHOW TABLES 查看与所连接数据库相关联的数据共享中共享架构的表列表。有关更多信息,请参阅 SHOW TABLES。
使用 SHOW COLUMNS 查看与所连接数据库相关联的数据共享中共享表的列列表。有关更多信息,请参阅 SHOW COLUMNS。
使用 SVV_DATASHARES 查看在集群中创建(出站)并与其他人共享(入站)的所有数据共享的列表。有关更多信息,请参阅 SVV_DATASHARES。
使用 SVV_DATASHARE_CONSUMERS 查看数据使用者的列表。有关更多信息,请参阅 SVV_DATASHARE_CONSUMERS。
使用 SVV_DATASHARE_OBJECTS 查看在集群中创建(出站)并与其他人共享(入站)的所有数据共享中的对象的列表。有关更多信息,请参阅 SVV_DATASHARE_OBJECTS。
将 Amazon Redshift 数据共享与业务情报工具集成
要将数据共享与业务情报 (BI) 工具集成,我们建议您使用 Amazon Redshift JDBC 或 ODBC 驱动程序。
Amazon Redshift JDBC 和 ODBC 驱动程序支持驱动程序中的 GetCatalogs
API 操作,以返回所有数据库的列表,包括从数据共享创建的数据库。驱动程序还支持下游操作,例如 GetSchemas
、GetTables
等,这些操作从 GetCatalogs
返回的所有数据库中返回数据。即使在调用中没有明确指定目录时,驱动程序也会提供此支持。有关 JDBC 或 ODBC 驱动程序的更多信息,请参阅《Amazon Redshift 管理指南》中的配置 Amazon Redshift 中的连接。
您可以像连接任何其它数据库一样,直接连接从数据共享创建的使用者数据库。如果工具中有连接切换用户界面,数据库列表应包括从数据共享创建的数据库。您可以使用 SVV_REDSHIFT_DATABASES 发现这些使用者数据库。