共享对 AWS 账户内数据的读取访问权限
您可以在一个 AWS 账户 内的不同 Amazon Redshift 集群间共享数据,以进行读取。
要以创建器集群管理员或数据库拥有者的身份共享数据以用于读取目的
在您的集群中创建数据共享。有关更多信息,请参阅 CREATE DATASHARE。
CREATE DATASHARE salesshare;
集群超级用户和数据库拥有者可以创建数据共享。在创建过程中,每个数据共享都与数据库相关联。只有该数据库中的对象才能在该数据共享中共享。可以在具有相同或不同粒度对象的同一数据库上创建多个数据共享。集群可以创建的数据共享数量没有限制。
您还可以使用 Amazon Redshift 控制台创建数据共享。有关更多信息,请参阅 创建数据共享。
委派权限以对数据共享进行操作。有关更多信息,请参阅 GRANT 或 REVOKE。
以下示例授予
dbuser
对于salesshare
的权限。GRANT ALTER, SHARE ON DATASHARE salesshare TO dbuser;
集群超级用户和数据共享的拥有者可以向其它用户授予或撤消对数据共享的修改权限。
将对象添加到数据共享或从数据共享中删除对象。要将对象添加到数据共享中,请在添加对象之前添加 schema。当您添加 schema 时,Amazon Redshift 不会在其下添加所有对象。确保明确添加这些内容。有关更多信息,请参阅 ALTER DATASHARE。
ALTER DATASHARE salesshare ADD SCHEMA PUBLIC; ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift; ALTER DATASHARE salesshare ADD ALL TABLES IN SCHEMA PUBLIC;
您还可以将视图添加到数据共享。
CREATE VIEW public.sales_data_summary_view AS SELECT * FROM public.tickit_sales_redshift; ALTER DATASHARE salesshare ADD TABLE public.sales_data_summary_view;
使用 ALTER DATASHARE 共享给定 schema 中的 schema 以及表、视图和函数。超级用户、数据共享拥有者或对数据共享具有 ALTER 或 ALL 权限的用户可以更改数据共享以向其中添加对象或从中删除对象。用户应具有向数据共享中添加对象或从中删除对象的权限。用户还应该是对象的拥有者,或者对这些对象具有 SELECT、USAGE 或 ALL 权限。
也可以使用 GRANT 向数据共享添加对象。此示例演示如何:
GRANT SELECT ON TABLE public.tickit_sales_redshift TO DATASHARE salesshare;
此语法在功能上等同于
ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift;
。使用 INCLUDENEW 子句将在指定 schema 中创建的任何未来表、视图或 SQL 用户定义函数 (UDF) 添加到数据共享中。只有超级用户才可以更改每个数据共享-schema 对的此属性。
ALTER DATASHARE salesshare ADD SCHEMA PUBLIC; ALTER DATASHARE salesshare SET INCLUDENEW = TRUE FOR SCHEMA PUBLIC;
您还可以使用 Amazon Redshift 控制台添加或从数据共享中删除对象。有关更多信息,请参阅将数据共享对象添加到数据共享、从数据共享中删除数据共享对象和编辑在您的账户中创建的数据共享。
将使用者添加到数据共享或从数据共享中删除使用者。以下示例将使用者集群命名空间添加到
salesshare
中。命名空间是账户中的使用者集群的命名空间全局唯一标识符(GUID)。有关更多信息,请参阅 GRANT 或 REVOKE。GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
您只能将权限授予 GRANT 语句中的一个数据共享使用者。
集群超级用户和数据共享对象的拥有者或对数据共享具有 SHARE 权限的用户可以将使用者添加到数据共享或从中删除使用者。为此,他们使用 GRANT USAGE 或 REVOKE USAGE。
要查找当前看到的集群的命名空间,您可以使用 SELECT CURRENT_NAMESPACE 命令。要查找同一个 AWS 账户中不同集群的命名空间,请转到 Amazon Redshift 控制台集群详细信息页面。在该页面上,找到新添加的命名空间字段。
您还可以使用 Amazon Redshift 控制台添加或从数据共享中删除数据使用者。有关更多信息,请参阅将数据使用者添加到数据共享和从数据共享中删除数据使用者。
(可选)向数据共享中添加安全限制。以下示例显示允许具有公有 IP 访问权限的使用者集群读取数据共享。有关更多信息,请参阅 ALTER DATASHARE。
ALTER DATASHARE salesshare SET PUBLICACCESSIBLE = TRUE;
您可以在创建数据共享后修改有关使用者类型的属性。例如,您可以定义希望使用给定数据共享中的数据的集群不能公开访问。来自不符合数据共享中指定的安全限制的使用者集群的查询将在查询运行时被拒绝。
您还可以使用 Amazon Redshift 控制台编辑数据共享。有关更多信息,请参阅 编辑在您的账户中创建的数据共享。
列出在集群中创建的数据共享,并查看数据共享的内容。
以下示例显示名为
salesshare
的数据共享的信息。有关更多信息,请参阅DESC DATASHARE和SHOW DATASHARES。DESC DATASHARE salesshare; producer_account | producer_namespace | share_type | share_name | object_type | object_name | include_new -------------------+--------------------------------------+------------+------------+-------------+--------------------------------+------------------- 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | table | public.tickit_users_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | table | public.tickit_venue_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | table | public.tickit_category_redshift| 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | table | public.tickit_date_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | table | public.tickit_event_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | table | public.tickit_listing_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | table | public.tickit_sales_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | schema | public | t 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | OUTBOUND | salesshare | view | public.sales_data_summary_view |
以下示例显示创建器集群中的出站数据共享。
SHOW DATASHARES LIKE 'sales%';
该输出值看上去类似于以下内容。
share_name | share_owner | source_database | consumer_database | share_type | createdate | is_publicaccessible | share_acl | producer_account | producer_namespace -----------+--------------+-----------------+-------------------+------------+---------------------+----------------------+-----------+------------------+--------------------------------------- salesshare | 100 | dev | | OUTBOUND | 2020-12-09 02:27:08 | True | | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d
有关更多信息,请参阅DESC DATASHARE和SHOW DATASHARES。
您还可以使用 SVV_DATASHARES、SVV_DATASHARE_CONSUMERS 和 SVV_DATASHARE_OBJECTS 来查看数据共享、数据共享内的对象以及数据共享使用者。
删除数据共享。有关更多信息,请参阅 DROP DATASHARE。
您可以随时使用 DROP DATASHARE 删除数据共享对象。集群超级用户和数据共享拥有者可以删除数据共享。
以下示例将删除名为
salesshare
的数据共享。DROP DATASHARE salesshare;
您还可以使用 Amazon Redshift 控制台删除数据共享。有关更多信息,请参阅 删除在您的账户中创建的数据共享。
使用 ALTER DATASHARE 可以在任何时间点从数据共享中删除对象。使用 REVOKE USAGE ON 可撤销某些使用者对数据共享的权限。它可以撤消对数据共享内的对象的 USAGE 权限,并立即停止对所有使用者集群的访问。列出数据共享和元数据查询(如列出数据库和表)不会在撤销访问权限后返回共享对象。
ALTER DATASHARE salesshare REMOVE TABLE public.tickit_sales_redshift;
您还可以使用 Amazon Redshift 控制台编辑数据共享。有关更多信息,请参阅 编辑在您的账户中创建的数据共享。
如果您不想再与使用者共享数据,则撤消从命名空间对数据共享的访问权限。
REVOKE USAGE ON DATASHARE salesshare FROM NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
您还可以使用 Amazon Redshift 控制台编辑数据共享。有关更多信息,请参阅 编辑在您的账户中创建的数据共享。
要以使用者集群管理员的身份共享数据以进行读取
列出可供您使用的数据共享并查看数据共享的内容。有关更多信息,请参阅DESC DATASHARE和SHOW DATASHARES。
以下示例显示指定创建器命名空间的入站数据共享的信息。当您以使用者集群管理员身份运行 DESC DATASHARE 时,您必须指定 NAMESPACE 选项以查看入站数据共享。
DESC DATASHARE salesshare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d'; producer_account | producer_namespace | share_type | share_name | object_type | object_name | include_new -------------------+--------------------------------------+------------+------------+-------------+---------------------------------+------------------ 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | table | public.tickit_users_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | table | public.tickit_venue_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | table | public.tickit_category_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | table | public.tickit_date_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | table | public.tickit_event_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | table | public.tickit_listing_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | table | public.tickit_sales_redshift | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | schema | public | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND | salesshare | view | public.sales_data_summary_view |
只有集群超级用户才可以执行此操作。您还可以使用 SVV_DATASHARES 查看数据共享,使用 SVV_DATASHARE_OBJECTS 查看数据共享内的对象。
以下示例显示使用者集群中的入站数据共享。
SHOW DATASHARES LIKE 'sales%'; share_name | share_owner | source_database | consumer_database | share_type | createdate | is_publicaccessible | share_acl | producer_account | producer_namespace ------------+-------------+-----------------+-------------------+------------+------------+---------------------+-----------+------------------+-------------------------------------- salesshare | | | | INBOUND | | t | | 123456789012 | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d
作为数据库超级用户,您可以创建引用数据共享的本地数据库。有关更多信息,请参阅 CREATE DATABASE。
CREATE DATABASE sales_db FROM DATASHARE salesshare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
如果您想更精细地控制对本地数据库中对象的访问权限,请在创建数据库时使用 WITH PERMISSIONS 子句。这允许您在步骤 4 中为数据库中的对象授予对象级权限。
CREATE DATABASE sales_db WITH PERMISSIONS FROM DATASHARE salesshare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
您可以通过查询 SVV_REDSHIFT_DATABASES 视图查看从数据共享中创建的数据库。您无法连接到从数据共享创建的这些数据库,它们是只读的。但是,您可以连接到使用者集群上的本地数据库并执行跨数据库查询,以查询从数据共享创建的数据库中的数据。您不能基于从现有数据共享创建的数据库对象创建数据共享。但是,您可以将数据复制到使用者集群上的单独表中,执行所需的任何处理,然后共享创建的新对象。
您还可以使用 Amazon Redshift 控制台从数据共享中创建数据库。有关更多信息,请参阅 通过数据共享创建数据库。
(可选)创建外部 schema,以引用导入到使用者集群上的使用者数据库中的特定 schema 并为其分配精细权限。有关更多信息,请参阅 CREATE EXTERNAL SCHEMA。
CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
根据需要,向使用者集群中的用户和角色授权对从数据共享创建的数据库和架构引用的权限。有关更多信息,请参阅GRANT或REVOKE。
GRANT USAGE ON DATABASE sales_db TO Bob;
GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
如果创建数据库时不使用 WITH PERMISSIONS,则只能将从数据共享创建的整个数据库的权限分配给用户和角色。在某些情况下,您需要对根据数据共享创建的数据库对象子集进行精细控制。如果是这样,您可以创建一个外部 schema 引用,该引用指向数据共享中的特定 schema(如上一步所述),并在 schema 级别提供精细权限。
您还可以基于共享的对象创建后期绑定视图,并使用这些视图来分配精细权限。您还可以考虑让创建器集群为您创建具有所需精细度的额外的数据共享。
如果您在步骤 2 中使用 WITH PERMISSIONS 创建了数据库,则必须为共享数据库中的对象分配对象级权限。只有 USAGE 权限的用户在获得其他对象级权限之前,无法访问使用 WITH PERMISSIONS 创建的数据库中的任何对象。
GRANT SELECT ON sales_db.public.tickit_sales_redshift to Bob;
在数据共享中查询共享对象中的数据。
对使用者集群上的使用者数据库和架构具有权限的用户和角色可以浏览和导航任何共享对象的元数据。他们还可以浏览和导航使用者集群中的本地对象。为此,他们使用 JDBC 或 ODBC 驱动程序或 SVV_ALL 和 SVV_REDSHIFT 视图。
创建器集群在数据库中可能有许多 schema、表和每个 schema 中的视图。使用者端的用户只能看到通过数据共享提供的对象的子集。这些用户无法从创建器集群中看到整个元数据。此方法有助于通过数据共享提供精细的元数据安全控制。
您将继续连接到本地集群数据库。但现在,您也可以使用三部分 database.schema.table 表示法从数据共享创建的数据库和 schema 中读取。您可以跨您可见的任何数据库和所有数据库执行查询。这些数据库可以是集群上的本地数据库,也可以是通过数据共享创建的数据库。使用者集群无法连接到从数据共享创建的数据库。
您可以使用完全资格认证来访问数据。有关更多信息,请参阅 使用跨数据库查询的示例。
SELECT * FROM sales_db.public.tickit_sales_redshift ORDER BY 1,2 LIMIT 5; salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission | saletime ---------+--------+----------+---------+---------+--------+---------+-----------+------------+--------------------- 1 | 1 | 36861 | 21191 | 7872 | 1875 | 4 | 728.00 | 109.20 | 2008-02-18 02:36:48 2 | 4 | 8117 | 11498 | 4337 | 1983 | 2 | 76.00 | 11.40 | 2008-06-06 05:00:16 3 | 5 | 1616 | 17433 | 8647 | 1983 | 2 | 350.00 | 52.50 | 2008-06-06 08:26:17 4 | 5 | 1616 | 19715 | 8647 | 1986 | 1 | 175.00 | 26.25 | 2008-06-09 08:38:52 5 | 6 | 47402 | 14115 | 8240 | 2069 | 2 | 154.00 | 23.10 | 2008-08-31 09:17:02
您只能在共享对象上使用 SELECT 语句。但是,您可以通过查询来自不同本地数据库中的共享对象的数据,在使用者集群中创建表。
除查询之外,使用者还可以对共享对象创建视图。仅支持后期绑定视图或实体化视图。Amazon Redshift 不支持共享数据的常规视图。使用者创建的视图可跨越多个本地数据库或通过数据共享创建的数据库。有关更多信息,请参阅 CREATE VIEW。
// Connect to a local cluster database // Create a view on shared objects and access it. CREATE VIEW sales_data AS SELECT * FROM sales_db.public.tickit_sales_redshift WITH NO SCHEMA BINDING; SELECT * FROM sales_data;