共享数据共享
仅当您在不同的 Amazon Redshift 预置集群或无服务器工作组之间共享数据时才需要使用数据共享。在同一个集群中,只要您对另一个数据库中的对象具有所需的权限,就可以使用由三部分组成的简单表示法 database.schema.table
查询另一个数据库。
在 Amazon Redshift 中管理数据共享的权限
作为创建器集群管理员,您可以保留对正在共享的数据集的控制权。您可以将新对象添加到数据共享中或将其从数据共享中删除。您还可以授予或撤消对使用者集群、AWS 账户或 AWS 区域的整体数据共享的访问权。当权限被撤消时,使用者集群立即失去对共享对象的访问权限,并且不能在 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。
有关设置数据共享以及从使用者读取数据的更多信息,请参阅共享对 AWS 账户内数据的读取访问权限。
在不使用 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 操作。这样您就可以明确控制哪些 AWS 账户 可以调用两个 API 操作。
您可以拒绝授权或取消授权任何不属于您自己账户的使用者数据共享。为此,请指定 IAM 策略中的 AWS 账户 数字。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "redshift:AuthorizeDataShare", "redshift:DeauthorizeDataShare" ], "Resource": "*", "Condition": { "StringNotEquals": { "redshift:ConsumerIdentifier": "555555555555" } } } ] }
您可以允许拥有 DataShareArn testshare2
的创建者明确与拥有 IAM 策略中 111122223333 的 AWS 账户 使用者共享。
{ "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" } } } ] }