在 账户中共享数据 - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 账户中共享数据

您可以跨 Amazon Redshift 账户中的不同AWS集群共享数据以进行读取。

以创建者集群管理员或数据库拥有者身份共享数据以进行读取

  1. 在集群中创建数据共享。有关更多信息,请参阅创建数据共享

    CREATE DATASHARE SalesShare;

    集群超级用户和数据库所有者可以创建数据共享。每个数据共享在创建期间与数据库关联。只有该数据库中的对象才能在该数据共享中共享。可以在同一数据库上创建多个数据共享,这些数据共享具有相同或不同的对象粒度。集群可以创建的数据共享的数量没有限制。

  2. 委派权限以对数据共享执行操作。有关更多信息,请参阅 GRANTREVOKE

    集群超级用户和数据共享的所有者可以向其他用户授予或撤消对数据共享的修改权限。

  3. 在数据共享中添加或删除对象。要将对象添加到数据共享,请在添加对象之前添加架构。有关更多信息,请参阅更改数据共享

    ALTER DATASHARE SalesShare ADD SCHEMA PUBLIC; ALTER DATASHARE SalesShare ADD TABLE public.tickit_sales_redshift; ALTER DATASHARE SalesShare ADD ALL TABLES IN SCHEMA PUBLIC;

    您还可以向数据共享添加视图。

    ALTER DATASHARE SalesShare ADD TABLE public.sales_data_summary_view;

    使用 ALTER DATASHARE 共享给定架构中的架构、表、视图和函数。对数据共享具有 ALTER 或 ALL 权限的超级用户、数据共享所有者或用户可以更改数据共享以向数据共享添加或删除对象。用户应具有在数据共享中添加或删除对象的权限。用户还应是对象的所有者或对这些对象具有 SELECT、USAGE 或 ALL 权限。

  4. 在数据共享中添加或删除使用者。以下示例将使用者集群命名空间添加到 SalesShare。命名空间是账户中使用者集群的命名空间 GUID。有关更多信息,请参阅 GRANTREVOKE

    GRANT USAGE ON DATASHARE SalesShare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';

    集群超级用户和数据共享对象的拥有者或对数据共享具有权限的用户可以在数据共享中添加或删除使用者。为此,它们使用 GRANT USAGE 或 REVOKE USAGE。

    要查找您当前看到的集群的命名空间,您可以使用 SELECT CURRENT_NAMESPACE 命令。要查找同一AWS账户中不同集群的命名空间,请转到 Amazon Redshift 控制台集群详细信息页面。在该页面上,找到新添加的命名空间字段。

  5. (可选)向数据共享添加安全限制。以下示例显示允许具有公有 IP 访问权限的使用者集群读取数据共享。有关更多信息,请参阅更改数据共享

    ALTER DATASHARE Salesshare SET PUBLICACCESSIBLE = TRUE;

    您可以在创建数据共享后修改有关使用者类型的属性。例如,您可以定义希望使用给定数据共享中的数据的集群不可公开访问。来自不满足数据共享中指定的安全限制的使用者集群的查询将在查询执行时被拒绝。

  6. 列出在集群中创建的数据共享,并查看数据共享的内容。

    以下示例显示名为 SalesShare 的数据共享的信息。有关更多信息,请参阅 DESC DATASHARE (描述数据共享)显示数据共享

    DESC DATASHARE SalesShare; producer_account | producer_namespace | share_type | share_name | object_type | object_name -------------------+--------------------------------------+------------+------------+-------------+--------------------------------- 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 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 (描述数据共享)显示数据共享

    您还可以使用 SVV_DATASHARESSVV_DATASHARE_CONSUMERSSVV_DATASHARE_OBJECTS 查看数据共享、数据共享中的对象和数据共享使用者。

  7. 删除数据共享。有关更多信息,请参阅删除数据共享

    您可以使用 随时删除数据共享对象删除数据共享。集群超级用户和数据共享的所有者可能会删除数据共享。

    以下示例删除名为 SalesShare 的数据共享。

    DROP DATASHARE SalesShare;
  8. 使用 ALTER DATASHARE 随时从数据共享中删除数据共享中的对象,使用 REVOKE USAGE ON 撤销对数据共享的权限。撤消对数据共享中对象的 USAGE 权限并立即禁用对所有使用者集群的访问。在撤销访问权限后,列出数据共享和元数据查询(例如列出数据库和表)不会返回共享对象。

    ALTER DATASHARE SalesShare REMOVE TABLE public.tickit_sales_redshift;
  9. 如果您不想再与使用者共享数据,请从命名空间撤销对数据共享的访问权限。

    REVOKE USAGE ON DATASHARE SalesShare FROM NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';

以使用者集群管理员身份共享数据以进行读取

  1. 列出可供您使用的数据共享并查看数据共享的内容。有关更多信息,请参阅 DESC DATASHARE (描述数据共享)显示数据共享

    以下示例显示指定创建者命名空间的入站数据共享的信息。作为使用者集群管理员运行 DESC DATAHSARE 时,必须指定 NAMESPACE 选项才能查看入站数据共享。

    DESC DATASHARE SalesShare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d'; producer_account | producer_namespace | share_type | share_name | object_type | object_name -------------------+--------------------------------------+------------+------------+-------------+--------------------------------- 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
  2. 创建引用数据共享的本地数据库。有关更多信息,请参阅CREATE DATABASE

    CREATE DATABASE Sales_db FROM DATASHARE SalesShare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';

    您可以通过查询 SVV_REDSHIFT_DATABASES 视图来查看您从数据共享中创建的数据库。您无法连接到通过数据共享创建的这些数据库,并且它们是只读的。但是,您可以连接到您的使用者集群上的本地数据库,并执行跨数据库查询以从通过数据共享创建的数据库中查询数据。您无法在从现有数据共享创建的数据库对象之上创建数据共享。但是,您可以将数据复制到使用者集群上的单独表中,执行所需的任何处理,然后共享创建的新对象。

  3. (可选)创建外部 schemas 以引用在使用者集群上导入的使用者数据库中的特定 schemas 并为其分配精细权限。有关更多信息,请参阅CREATE EXTERNAL SCHEMA

    CREATE EXTERNAL SCHEMA Sales_schema FROM REDSHIFT DATABASE 'Sales_db' SCHEMA 'public';
  4. 根据需要向使用者集群中的用户组授予从数据共享创建的数据库和架构引用的权限。有关更多信息,请参阅 GRANTREVOKE

    GRANT USAGE ON DATABASE Sales_db TO Bob;
    GRANT USAGE ON SCHEMA Sales_schema TO GROUP Analyst_group;

    作为使用者集群管理员,您只能将从数据共享创建的整个数据库的权限分配给您的用户和组。在某些情况下,您需要对从数据共享创建的数据库对象的子集进行精细控制。如果是这样,您可以创建一个指向数据共享中特定架构的外部架构引用,如上一步中所述,并在架构级别提供精细权限。您还可以在共享对象上创建后期绑定视图,然后使用这些视图分配精细权限。您还可以考虑让创建者集群以所需的粒度为您创建其他数据共享。您可以创建对从数据共享创建的数据库的尽可能多的架构引用。

  5. 在数据共享的共享对象中查询数据。

    对使用者集群上的使用者数据库和架构具有权限的用户和组可以浏览和导航任何共享对象的元数据。他们还可以探索和导航使用者集群中的本地对象。为此,它们使用 JDBC 或 ODBC 驱动程序或 SVV_ALL 和 SVV_REDSHIFT 视图。

    创建者集群在每个架构中的数据库、表和视图中可能具有许多架构。使用者端的用户只能看到通过数据共享提供的对象子集。这些用户无法查看创建者集群中的整个元数据。此方法帮助通过数据共享提供精细的元数据安全控制。

    您继续连接到本地集群数据库。但现在,您也可以从使用三部分 database.schema.table 表示法从数据共享创建的数据库和架构中读取数据。您可以执行跨您可见的任何和所有数据库的查询。它们可以是集群上的本地数据库或从数据共享创建的数据库。使用者集群无法连接到从数据共享创建的数据库。

    您可以使用完全资格认证访问数据。有关更多信息,请参阅使用跨数据库查询的示例

    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;