

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 使用 SQL 界面共享只读数据入门
<a name="getting-started-datashare-sql"></a>

借助 Amazon Redshift，您可以在 Amazon Redshift 集群之间安全地共享数据，使数据使用者能够查询和访问实时数据，而无需复制数据。数据共享允许您创建和配置数据共享，数据共享是引用您想要共享的数据库对象的生产者端对象。

您可以在 AWS 账户内、跨账户或跨 AWS 区域，在不同的 Amazon Redshift 集群间共享数据以进行读取。

**Topics**
+ [共享对 AWS 账户内数据的读取访问权限](within-account.md)
+ [在 Amazon Redshift 数据共享中使用视图](datashare-views.md)
+ [将数据湖表添加到数据共享中](create-datashare-external-views.md)
+ [跨 AWS 账户共享数据](across-account.md)
+ [跨 AWS 区域共享数据](across-region.md)
+ [在 AWS Data Exchange 上共享许可的 Amazon Redshift 数据](adx-getting-started.md)
+ [AWS Lake Formation 托管式数据共享入门](lf-getting-started.md)

# 共享对 AWS 账户内数据的读取访问权限
<a name="within-account"></a>

使用 Amazon Redshift，您可以在同一 AWS 账户内的不同数据库用户或组之间共享对数据的读取访问权限。该功能可让您对数据访问权限进行细粒度控制，确保只有授权用户或组才能读取特定数据集。

## 以生产者管理员或数据库拥有者的身份共享数据以供读取
<a name="share-producer"></a>

1. 在您的集群中创建数据共享。有关更多信息，请参阅 [CREATE DATASHARE](r_CREATE_DATASHARE.md)。

   ```
   CREATE DATASHARE salesshare;
   ```

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

   您还可以使用 Amazon Redshift 控制台创建数据共享。有关更多信息，请参阅 [创建数据共享](datashare-creation.md#create-datashare-console)。

1. 委派权限以对数据共享进行操作。有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

   以下示例授予 `dbuser` 对于 `salesshare` 的权限。

   ```
   GRANT ALTER, SHARE ON DATASHARE salesshare TO dbuser;
   ```

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

1. 将对象添加到数据共享或从数据共享中删除对象。要将对象添加到数据共享中，请在添加对象之前添加 schema。当您添加 schema 时，Amazon Redshift 不会在其下添加所有对象。确保明确添加这些内容。有关更多信息，请参阅 [ALTER DATASHARE](r_ALTER_DATASHARE.md)。

   ```
   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 VIEW 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 控制台添加或从数据共享中删除对象。有关更多信息，请参阅[将数据共享对象添加到数据共享](datashare-creation.md#add-datashare-object-console)、[从数据共享中删除数据共享对象](manage-datashare-existing-console.md#remove-datashare-object-console)和[编辑在您的账户中创建的数据共享](manage-datashare-existing-console.md#edit-datashare-console)。

1. 将使用者添加到数据共享或从数据共享中删除使用者。以下示例将使用者命名空间添加到 `salesshare` 中。命名空间是账户中的使用者集群的命名空间全局唯一标识符（GUID）。有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

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

   您只能将权限授予 GRANT 语句中的一个数据共享使用者。

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

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

   您还可以使用 Amazon Redshift 控制台添加或从数据共享中删除数据使用者。有关更多信息，请参阅[将数据使用者添加到数据共享](datashare-creation.md#add-data-consumer-console)和[从数据共享中删除数据使用者](manage-datashare-existing-console.md#remove-data-consumer-console)。

1. （可选）向数据共享中添加安全限制。以下示例显示允许具有公有 IP 访问权限的使用者集群读取数据共享。有关更多信息，请参阅 [ALTER DATASHARE](r_ALTER_DATASHARE.md)。

   ```
   ALTER DATASHARE salesshare SET PUBLICACCESSIBLE = TRUE;
   ```

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

   您还可以使用 Amazon Redshift 控制台编辑数据共享。有关更多信息，请参阅 [编辑在您的账户中创建的数据共享](manage-datashare-existing-console.md#edit-datashare-console)。

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

   以下示例显示名为 `salesshare` 的数据共享的信息。

   ```
   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](r_DESC_DATASHARE.md)和[SHOW DATASHARES](r_SHOW_DATASHARES.md)。

   您还可以使用 [SVV\$1DATASHARES](r_SVV_DATASHARES.md)、[SVV\$1DATASHARE\$1CONSUMERS](r_SVV_DATASHARE_CONSUMERS.md) 和 [SVV\$1DATASHARE\$1OBJECTS](r_SVV_DATASHARE_OBJECTS.md) 来查看数据共享、数据共享内的对象以及数据共享使用者。

1. 删除数据共享。有关更多信息，请参阅 [DROP DATASHARE](r_DROP_DATASHARE.md)。

   您可以随时使用 [DROP DATASHARE](r_DROP_DATASHARE.md) 删除数据共享对象。集群超级用户和数据共享拥有者可以删除数据共享。

   以下示例将删除名为 `salesshare` 的数据共享。

   ```
   DROP DATASHARE salesshare;
   ```

   您还可以使用 Amazon Redshift 控制台删除数据共享。有关更多信息，请参阅 [删除在您的账户中创建的数据共享](manage-datashare-existing-console.md#delete-datashare-console)。

1. 使用 ALTER DATASHARE 可以在任何时间点从数据共享中删除对象。使用 REVOKE USAGE ON 可撤销某些使用者对数据共享的权限。它可以撤消对数据共享内的对象的 USAGE 权限，并立即停止对所有使用者集群的访问。列出数据共享和元数据查询（如列出数据库和表）不会在撤销访问权限后返回共享对象。

   ```
   ALTER DATASHARE salesshare REMOVE TABLE public.tickit_sales_redshift;
   ```

   您还可以使用 Amazon Redshift 控制台编辑数据共享。有关更多信息，请参阅 [编辑在您的账户中创建的数据共享](manage-datashare-existing-console.md#edit-datashare-console)。

1. 如果您不想再与使用者共享数据，则撤消从命名空间对数据共享的访问权限。

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

   您还可以使用 Amazon Redshift 控制台编辑数据共享。有关更多信息，请参阅 [编辑在您的账户中创建的数据共享](manage-datashare-existing-console.md#edit-datashare-console)。

## 以使用者管理员身份共享数据以供读取
<a name="share-consumer"></a>

1. 列出可供您使用的数据共享并查看数据共享的内容。有关更多信息，请参阅[DESC DATASHARE](r_DESC_DATASHARE.md)和[SHOW DATASHARES](r_SHOW_DATASHARES.md)。

   以下示例显示指定创建器命名空间的入站数据共享的信息。当您以使用者管理员身份运行 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\$1DATASHARES 查看数据共享，使用 SVV\$1DATASHARE\$1OBJECTS 查看数据共享内的对象。

   以下示例显示使用者集群中的入站数据共享。

   ```
   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
   ```

1. 作为数据库超级用户，您可以创建引用数据共享的本地数据库。有关更多信息，请参阅 [CREATE DATABASE](r_CREATE_DATABASE.md)。

   ```
   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\$1REDSHIFT\$1DATABASES](r_SVV_REDSHIFT_DATABASES.md) 视图查看从数据共享中创建的数据库。您可以直接连接到这些数据库，也可以连接到使用者集群上的本地数据库，然后执行跨数据库查询，从数据共享数据库中查询数据。您不能基于从现有数据共享创建的数据库对象创建数据共享。但是，您可以将数据复制到使用者集群上的单独表中，执行所需的任何处理，然后共享创建的新对象。

   您还可以使用 Amazon Redshift 控制台从数据共享中创建数据库。有关更多信息，请参阅 [通过数据共享创建数据库](query-datashare-console.md#create-database-from-datashare-console)。

1. （可选）创建外部 schema，以引用导入到使用者集群上的使用者数据库中的特定 schema 并为其分配精细权限。有关更多信息，请参阅 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。

   ```
   CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
   ```

1. 根据需要，向使用者集群中的用户和角色授权对从数据共享创建的数据库和架构引用的权限。有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

   ```
   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;
   ```

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

   对使用者集群上的使用者数据库和架构具有权限的用户和角色可以浏览和导航任何共享对象的元数据。他们还可以浏览和导航使用者集群中的本地对象。为此，他们使用 JDBC 或 ODBC 驱动程序或 SVV\$1ALL 和 SVV\$1REDSHIFT 视图。

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

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

   您可以使用完全资格认证来访问数据。有关更多信息，请参阅 [跨数据库查询示例](cross-database_example.md)。

   ```
   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](r_CREATE_VIEW.md)。

   ```
   // 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;
   ```

# 在 Amazon Redshift 数据共享中使用视图
<a name="datashare-views"></a>

创建器集群可以共享常规视图、后期绑定视图和实体化视图。共享常规、后期绑定视图或实体化视图时，不必共享基表。下表介绍了数据共享如何支持视图。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/datashare-views.html)

以下查询显示了数据共享支持的常规视图的输出。有关常规视图定义的信息，请参阅[CREATE VIEW](r_CREATE_VIEW.md)。

```
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](r_CREATE_VIEW.md)。

```
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](materialized-view-create-sql-command.md)。

```
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)
```

## 对数据共享中的实体化视图进行增量刷新
<a name="mv_incremental_datashare"></a>

 共享基表或实体化视图时，Amazon Redshift 支持对使用者数据共享中的实体化视图进行增量刷新。增量刷新是一项操作，其中 Amazon Redshift 可识别上次刷新后发生的一个或多个基表中的更改，并仅更新实体化视图中的相应记录。有关此行为的更多信息，请参阅 [CREATE MATERIALIZED VIEW](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html#mv_CREATE_MARTERIALIZED_VIEW_datashare)。

# 将数据湖表添加到数据共享中
<a name="create-datashare-external-views"></a>

通过数据共享，数据*生产者*可以与同一 AWS 账户或不同账户的*使用者*安全地共享细粒度的数据库对象，如架构和表。生产者还可以跨区域共享对象。本主题介绍如何将数据湖中的对象（特别是 AWS Glue 数据目录中的对象）添加到数据共享中。涵盖两种应用场景：
+ *向引用数据湖中表的数据共享添加后期绑定视图* – 这对使用者来说很方便，因为初步配置（如使用 Lake Formation 定义外部源数据的权限）很可能已经完成。另外一个好处是，添加到数据共享的视图可以将数据湖中的表与 Redshift 原生表联接起来。
+ *将外部架构中的表直接添加到数据共享中* – 这使得数据湖中的对象无需额外的层或逻辑即可提供给使用者。使用者可以查询表或将其与使用者上的表联接起来。

使用 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) 从 Redshift 中的 AWS 数据目录引用表后，这些情况将适用。AWS 数据目录中的任何表都可以是源表。

**注意**  
添加到数据共享的数据湖表可以包括在 Lake Formation 中注册的表和 AWS Glue 数据目录表。

## 创建外部架构和外部表
<a name="create-datashare-console-external-prelim"></a>

您需要创建外部架构和外部表，以便在接下来的各节中将它们添加到数据共享中。这些都是初步步骤。如果您已经完成此操作，则可跳过此部分。

1. 在生产者上创建外部架构，引用存储在 Amazon S3 中的数据湖数据。外部架构引用 AWS Glue Data Catalog。示例中的角色和区域就是例子：

   ```
   CREATE EXTERNAL SCHEMA external_schema_name FROM DATA CATALOG
   DATABASE 'glue_database_name'
   IAM_ROLE 'arn:aws:iam::123456789012:role/sample-role'
   REGION 'us-east-1';
   ```

1. 在外部架构中创建数据湖表。

   ```
   CREATE EXTERNAL TABLE external_schema_name.sales(
   salesid INTEGER,
   sellerid INTEGER,
   buyerid INTEGER,
   saledate DATE,
   pricepaid DECIMAL(8,2))
   ROW FORMAT delimited
   FIELDS TERMINATED BY '\t'
   STORED AS textfile
   LOCATION 's3://redshift-downloads/tickit/spectrum/sales/';
   ```

   示例包括 `LOCATION`。格式必须为 `s3://{bucket_name}/{folder}/`，其中指定了文件夹。文件夹的长度必须至少为一个字符。您可以选择包含子文件夹。要查看在数据湖中创建表的其它示例，请参阅 CREATE EXTERNAL TABLE 的[示例](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE_examples.html)。
**注意**  
只有生产者的 IAM 角色对表有 SELECT 访问权限的表才支持共享。

## 在数据共享中添加引用数据湖表的后期绑定视图
<a name="create-datashare-console-external-views-how-to"></a>

根据 AWS 数据目录中的外部架构创建表并将其添加到数据共享中时，最常见的方法是添加一个 Redshift 后期绑定视图，该视图会引用您创建的表，其中包含数据湖中的数据。以下是操作步骤：

1. 创建一个引用之前创建的外部表的后期绑定视图：

   ```
   CREATE VIEW lbv AS 
   select * from external_schema_name.sales, other_schema.t1
   WITH NO SCHEMA BINDING;
   ```

1. 将视图架构添加到数据共享中。这是包含后期绑定视图的本地架构。

   ```
   ALTER DATASHARE dsx_datashare ADD SCHEMA public;
   ```

1. 将包含后期绑定视图所引用的表的架构添加到数据共享中。对于添加到数据共享的视图中引用的任何基本表，无论架构包含本地数据库对象还是数据湖中的对象，都需要添加架构。请注意，必须在添加后期绑定视图之前添加此架构。

   ```
   ALTER DATASHARE dsx_datashare ADD SCHEMA external_schema_name;
   ALTER DATASHARE dsx_datashare ADD SCHEMA other_schema;
   ```

1. 使用 SQL 命令将视图添加到数据共享。请注意，表名包括架构前缀。

   ```
   ALTER DATASHARE my_datashare ADD TABLE public.lbv;
   ```

1. 确认视图和架构已成功添加到数据共享：

   ```
   SELECT * FROM svv_datashare_objects WHERE share_name = 'my_datashare';
   ```

1. 使用者管理员从数据共享中创建一个数据库，然后将使用权授予给使用者用户。

完成这些步骤后，可以访问数据共享视图的数据库使用者用户就可以查询数据了。

## 将数据湖表直接添加到数据共享
<a name="create-datashare-console-external-views-add-spectrum"></a>

在数据共享中添加外部架构中的表与添加视图类似。如果使用者想查询数据湖表的原始状态，或者想将其联接到使用者数据仓库中的表，这种方法就很有效。下面的步骤将向您展示如何使用 SQL 将数据湖表添加到数据共享中。

1. 如本主题第一节所述，创建外部架构和外部表。

1. 

   发现外部架构中的现有表，以确认创建的表可用：

   ```
   SELECT * FROM svv_external_tables WHERE schemaname = 'external_schema_name';
   ```

1. 将外部架构添加到数据共享中：

   ```
   ALTER DATASHARE my_datashare ADD SCHEMA external_schema_name;
   ```

1. 将外部表添加到数据共享中。请注意，表名包括架构前缀：

   ```
   ALTER DATASHARE my_datashare ADD TABLE external_schema_name.sales;
   ```

1. 确认表已成功添加到数据共享中：

   ```
   SELECT * FROM svv_datashare_objects WHERE share_name = 'my_datashare';
   ```

   有关更详细的说明，请参阅[共享 AWS 账户内数据的读取权限](https://docs.aws.amazon.com/redshift/latest/dg/within-account.html)。

1. 在使用者（即接收共享数据的数据库）上，管理员关联数据共享，使共享表可供用户查询。有关如何执行此步骤的更多信息，请参阅[以使用者身份管理来自其它账户的数据共享](manage-datashare-other-console.html)。

管理员完成这些步骤后，使用者上的数据库用户就可以编写查询，从共享表中检索数据，并将其与使用者上的其它表联接起来。

## 将数据湖对象添加到数据共享的使用说明
<a name="create-datashare-console-external-views-considerations"></a>

在数据共享中使用数据湖中的表和视图时，需要注意以下几点：
+ **使用 AWS CloudTrail 进行日志记录** - 数据生产者账户可以使用 AWS CloudTrail 日志，在访问通过数据共享共享的数据湖表时进行审计：
  + **使用日志数据控制数据访问** – CloudTrail 日志记录了谁访问共享表的详细信息，包括 Redshift 数据共享生产者和使用者。标识符可在 `AssumeRole` CloudTrail 日志下的 `ExternalId` 字段中找到。数据所有者可以通过操作在 IAM 策略中配置数据访问的附加限制。有关通过策略定义数据访问权限的更多信息，请参阅[访问第三方拥有的 AWS 账户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)。
+ **安全和使用者权限** – 对于 Lake Formation 注册的表，Amazon S3 资源由 Lake Formation 保护，并使用 Lake Formation 提供的凭证可用。

## 将数据湖对象添加到数据共享的计费注意事项
<a name="create-datashare-console-external-views-billing"></a>

下面将详细介绍在数据共享中存储和扫描数据湖对象的成本归属：
+ 当使用者查询数据湖中的共享对象时，扫描成本将由使用者承担。
  + 当使用者是预置集群时，Redshift 会使用 Redshift Spectrum 扫描 Amazon S3 数据。因此，Spectrum 费用将计入使用者账户。
  + 如果使用者是 Amazon Redshift Serverless 工作组，则无需单独支付 Spectrum 费用。
+ Amazon S3 的存储和操作（如列出存储桶）费用是向拥有每个 Amazon S3 存储桶的账户收取的。

有关 Amazon Redshift Serverless 计费的其它详细信息，请参阅 [Amazon Redshift Serverless 计费](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-billing.html)。更多计费和定价信息，请访问 [Amazon Redshift 定价](https://aws.amazon.com/redshift/pricing/)。

# 跨 AWS 账户共享数据
<a name="across-account"></a>

您可以跨 AWS 账户共享数据以进行读取。跨 AWS 账户共享数据的工作方式类似于在账户内共享数据。区别在于，需要双向握手来跨 AWS 账户共享数据。创建器账户管理员可以授权使用者账户访问数据共享，也可以选择不授权任何访问权限。要使用经授权的数据共享，使用者账户管理员可以关联该数据共享。管理员可以将数据共享与整个 AWS 账户或使用者账户中的特定集群关联，或拒绝数据共享。有关在账户中共享数据的更多信息，请参阅[共享对 AWS 账户内数据的读取访问权限](within-account.md)。

数据共享可以拥有数据使用者，它们是同一账户或不同 AWS 账户中的命名空间。您无需创建单独的数据共享以进行账户内共享和跨账户共享。

对于跨账户数据共享，必须对创建器和使用者集群进行加密。

与 AWS 账户共享数据时，生产者管理员将作为一个实体与 AWS 账户进行共享。使用者管理员可以决定使用者账户中的哪些命名空间可以访问数据共享。

**Topics**
+ [生产者管理员操作](producer-cluster-admin.md)
+ [使用者账户管理员操作](consumer-account-admin.md)
+ [使用者管理员操作](consumer-cluster-admin.md)

# 生产者管理员操作
<a name="producer-cluster-admin"></a>

使用 Amazon Redshift，您可以对生产者集群执行管理任务，以管理数据摄取和负载处理。

**如果您是生产者管理员或数据库拥有者** – 请按照以下步骤操作：

1. 在集群中创建数据共享，并将数据共享对象添加到数据共享。有关如何创建数据共享和将数据集对象添加到数据共享的更多详细步骤，请参阅[共享对 AWS 账户内数据的读取访问权限](within-account.md)。有关 CREATE DATASHARE 和 ALTER DATASHARE 的信息，请参阅[CREATE DATASHARE](r_CREATE_DATASHARE.md)和[ALTER DATASHARE](r_ALTER_DATASHARE.md)。

   以下示例将不同的数据共享对象添加到数据共享 `salesshare` 中：

   ```
   -- Add schema to datashare
   ALTER DATASHARE salesshare ADD SCHEMA PUBLIC;
   
   -- Add table under schema to datashare
   ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift;
   
   -- Add view to datashare 
   ALTER DATASHARE salesshare ADD TABLE public.sales_data_summary_view;
   
   -- Add all existing tables and views under schema to datashare (does not include future table)
   ALTER DATASHARE salesshare ADD ALL TABLES in schema public;
   ```

   您还可以使用 Amazon Redshift 控制台创建或编辑数据共享。有关更多信息，请参阅[创建数据共享](datashare-creation.md#create-datashare-console)和[编辑在您的账户中创建的数据共享](manage-datashare-existing-console.md#edit-datashare-console)。

1. 委派权限以对数据共享进行操作。有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

   以下示例授予 `dbuser` 对于 `salesshare` 的权限。

   ```
   GRANT ALTER, SHARE ON DATASHARE salesshare TO dbuser;
   ```

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

1. 将使用者添加到数据共享或从数据共享中删除使用者。以下示例将 AWS 账户 ID 添加到 `salesshare`。有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

   ```
   GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '123456789012';
   ```

   您只能将权限授予 GRANT 语句中的一个数据使用者。

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

   您还可以使用 Amazon Redshift 控制台添加或从数据共享中删除数据使用者。有关更多信息，请参阅[将数据使用者添加到数据共享](datashare-creation.md#add-data-consumer-console)和[从数据共享中删除数据使用者](manage-datashare-existing-console.md#remove-data-consumer-console)。

1. （可选）如果您不想再与使用者共享数据，请撤消 AWS 账户对数据共享的访问权限。

   ```
   REVOKE USAGE ON DATASHARE salesshare FROM ACCOUNT '123456789012';
   ```

**如果您是创建器账户管理员** – 按照以下步骤操作：

将使用权授予 AWS 账户后，数据共享状态为 `pending_authorization`。创建器账户管理员应使用 Amazon Redshift 控制台授权数据共享，并选择数据使用者。

登录 [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。然后选择要授权哪些数据使用者访问数据共享或从中删除授权。授权的数据使用者会收到通知，以便对数据共享采取操作。如果您要以数据使用者身份添加命名空间，则不必执行授权。数据使用者获得授权后，可以访问数据共享对象并创建使用者数据库以查询数据。有关更多信息，请参阅 [授权或删除数据共享中的授权](authorize-datashare-console.md)。

## 跨账户共享数据写入权限
<a name="within-account-multi-warehouse-consumer-associate"></a>

借助 Amazon Redshift，您可以跨 AWS 账户共享数据并授予写入权限，从而实现团队或组织之间的协作和数据共享。跨账户数据共享允许您建立一个数据提供者账户，用于创建和管理数据库、架构和表，然后可与数据使用者账户安全共享。以下各节将演示在 Amazon Redshift 中配置跨账户数据共享和授予写入访问权限的过程。

# 使用者账户管理员操作
<a name="consumer-account-admin"></a>

使用 Amazon Redshift，您可以管理使用者账户并控制这些账户对数据仓库资源的访问。

**如果您是使用者账户管理员** – 按照以下步骤操作：

要将从其它账户共享的一个或多个数据共享与您的整个 AWS 账户或您账户中的特定命名空间关联，请使用 Amazon Redshift 控制台。

登录 [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。然后，将从其它账户共享的一个或多个数据共享与您的整个 AWS 账户或您账户中的特定命名空间关联。有关更多信息，请参阅 [在 Amazon Redshift 中关联来自不同 AWS 账户的数据共享](writes-associating.md)。

关联 AWS 账户或特定命名空间后，数据共享将可供使用。您还可以随时更改数据共享关联。将关联从单个命名空间更改到 AWS 账户时，Amazon Redshift 会使用 AWS 账户信息覆盖命名空间。将关联从 AWS 账户更改到特定命名空间时，Amazon Redshift 会使用命名空间信息覆盖 AWS 账户信息。账户中的所有命名空间都可以访问数据。

# 使用者管理员操作
<a name="consumer-cluster-admin"></a>

使用 Amazon Redshift，您可以对使用者集群执行管理任务，以管理数据摄取和负载处理。

**如果您是使用者管理员** – 请按照以下步骤操作：

1. 列出提供给您的数据共享并查看数据共享的内容。仅当生产者管理员已向数据共享授权且使用者管理员已接受并关联数据共享时，数据共享的内容才可用。有关更多信息，请参阅[DESC DATASHARE](r_DESC_DATASHARE.md)和[SHOW DATASHARES](r_SHOW_DATASHARES.md)。

   以下示例显示指定创建器命名空间的入站数据共享的信息。当您以使用者管理员身份运行 DESC DATAHSARE 时，您必须指定 NAMESPACE 以及账户 ID 以查看入站数据共享。对于出站数据共享，请指定数据共享名称。

   ```
   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    | 'dd8772e1-d792-4fa4-996b-1870577efc0d'
   ```

   ```
   DESC DATASHARE salesshare OF ACCOUNT '123456789012' NAMESPACE 'dd8772e1-d792-4fa4-996b-1870577efc0d';
   
   
    producer_account |          producer_namespace          | share_type | share_name | object_type |           object_name
   ------------------+--------------------------------------+------------+------------+-------------+---------------------------------
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | table       | public.tickit_users_redshift
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | table       | public.tickit_venue_redshift
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | table       | public.tickit_category_redshift
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | table       | public.tickit_date_redshift
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | table       | public.tickit_event_redshift
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | table       | public.tickit_listing_redshift
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | table       | public.tickit_sales_redshift
    123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d | INBOUND    | salesshare | schema      | public
   (8 rows)
   ```

   只有集群超级用户才可以执行此操作。您还可以使用 SVV\$1DATASHARES 查看数据共享，使用 SVV\$1DATASHARE\$1OBJECTS 查看数据共享内的对象。

   以下示例显示使用者集群中的入站数据共享。

   ```
   SELECT * FROM SVV_DATASHARES WHERE share_name 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      | 'dd8772e1-d792-4fa4-996b-1870577efc0d'
   ```

   ```
   SELECT * FROM SVV_DATASHARE_OBJECTS WHERE share_name LIKE 'sales%';
    share_type | share_name | object_type |           object_name           | producer_account |          producer_namespace
   ------------+------------+-------------+---------------------------------+------------------+--------------------------------------
    INBOUND    | salesshare | table       | public.tickit_users_redshift    | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
    INBOUND    | salesshare | table       | public.tickit_venue_redshift    | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
    INBOUND    | salesshare | table       | public.tickit_category_redshift | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
    INBOUND    | salesshare | table       | public.tickit_date_redshift     | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
    INBOUND    | salesshare | table       | public.tickit_event_redshift    | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
    INBOUND    | salesshare | table       | public.tickit_listing_redshift  | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
    INBOUND    | salesshare | table       | public.tickit_sales_redshift    | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
    INBOUND    | salesshare | schema      | public                          | 123456789012     | dd8772e1-d792-4fa4-996b-1870577efc0d
   (8 rows)
   ```

1. 创建引用数据共享的本地数据库。从数据共享中创建数据库时，请指定 NAMESPACE 和账户 ID。有关更多信息，请参阅 [CREATE DATABASE](r_CREATE_DATABASE.md)。

   ```
   CREATE DATABASE sales_db FROM DATASHARE salesshare OF ACCOUNT '123456789012' NAMESPACE 'dd8772e1-d792-4fa4-996b-1870577efc0d';
   ```

   如果您想更精细地控制对本地数据库中对象的访问权限，请在创建数据库时使用 WITH PERMISSIONS 子句。这允许您在步骤 4 中为数据库中的对象授予对象级权限。

   ```
   CREATE DATABASE sales_db WITH PERMISSIONS FROM DATASHARE salesshare OF ACCOUNT '123456789012' NAMESPACE 'dd8772e1-d792-4fa4-996b-1870577efc0d';
   ```

   您可以通过查询 [SVV\$1REDSHIFT\$1DATABASES](r_SVV_REDSHIFT_DATABASES.md) 视图查看从数据共享中创建的数据库。您可以直接连接到这些数据库，也可以连接到使用者集群上的本地数据库，然后执行跨数据库查询，从数据共享数据库中查询数据。您不能基于从现有数据共享创建的数据库对象创建数据共享。但是，您可以将数据复制到使用者集群上的单独表中，执行所需的任何处理，然后共享创建的新对象。

1. （可选）创建外部 schema，以引用导入到使用者集群上的使用者数据库中的特定 schema 并为其分配精细权限。有关更多信息，请参阅 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。

   ```
   CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
   ```

1. 根据需要，向使用者集群中的用户或角色授权对从数据共享创建的数据库和架构引用的权限。有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

   ```
   GRANT USAGE ON DATABASE sales_db TO Bob;
   ```

   ```
   GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
   ```

   如果创建数据库时不使用 WITH PERMISSIONS，则只能将从数据共享创建的整个数据库的权限分配给用户或角色。在某些情况下，您需要对根据数据共享创建的数据库对象子集进行精细控制。如果是这样，您可以创建一个外部架构引用，指向数据共享中的特定架构（如上一步所述）。然后，您可以在架构级别提供精细权限。您还可以基于共享的对象创建后期绑定视图，并使用这些视图来分配精细权限。您还可以考虑让创建器集群为您创建具有所需精细度的额外的数据共享。您可以根据需要为从数据共享中创建的数据库创建尽可能多的架构引用。

   如果您在步骤 2 中使用 WITH PERMISSIONS 创建了数据库，则必须为共享数据库中的对象分配对象级权限。只有 USAGE 权限的用户在获得其他对象级权限之前，无法访问使用 WITH PERMISSIONS 创建的数据库中的任何对象。

   ```
   GRANT SELECT ON sales_db.public.tickit_sales_redshift to Bob;
   ```

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

   对使用者集群上的使用者数据库和架构具有权限的用户和角色可以浏览和导航任何共享对象的元数据。他们还可以浏览和导航使用者集群中的本地对象。为此，请使用 JDBC 或 ODBC 驱动程序或 SVV\$1ALL 和 SVV\$1REDSHIFT 视图。

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

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

   您可以使用完全资格认证来访问数据。有关更多信息，请参阅 [跨数据库查询示例](cross-database_example.md)。

   ```
   SELECT * FROM sales_db.public.tickit_sales_redshift;
   ```

   您只能在共享对象上使用 SELECT 语句。但是，您可以通过查询来自不同本地数据库中的共享对象的数据，在使用者集群中创建表。

   除执行查询之外，使用者还可以对共享对象创建视图。仅支持后期绑定视图和实体化视图。Amazon Redshift 不支持共享数据的常规视图。使用者创建的视图可跨越多个本地数据库或通过数据共享创建的数据库。有关更多信息，请参阅 [CREATE VIEW](r_CREATE_VIEW.md)。

   ```
   // 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;
   ```

# 跨 AWS 区域共享数据
<a name="across-region"></a>

您可以在 AWS 区域 内的不同 Amazon Redshift 集群间共享数据，以进行读取。通过跨区域数据共享，您可以跨 AWS 区域 共享数据，无需手动复制数据。您无需将数据卸载到 Amazon S3 中，并将数据复制到新的 Amazon Redshift 集群中或执行跨区域快照复制。

通过跨区域数据共享，您可以在同一个 AWS 账户 或不同 AWS 账户 中共享数据，即使集群位于不同区域。与位于相同 AWS 账户但不同 AWS 区域的 Amazon Redshift 集群共享数据时，请遵循与在 AWS 账户中共享数据相同的工作流。有关更多信息，请参阅 [共享对 AWS 账户内数据的读取访问权限](within-account.md)。

如果共享数据的集群位于不同的 AWS 账户 和 AWS 区域，您可以遵循与跨 AWS 账户 共享数据相同的工作流程，并在使用者集群中包括区域级别的关联。跨区域数据共享支持与整个 AWS 账户、整个 AWS 区域或者 AWS 区域中的特定命名空间进行数据共享关联。有关在 AWS 账户 账户中共享数据的更多信息，请参阅[跨 AWS 账户共享数据](across-account.md)。

当使用来自其它区域的数据时，使用者需要支付从生产者区域到使用者区域的跨区域数据传输费。

要使用数据共享，使用者账户管理员可以通过以下三种方式之一关联数据共享。
+ 与跨其所有 AWS 区域 的整个 AWS 账户 关联
+ 与 AWS 账户 中的特定 AWS 区域 关联
+ 与 AWS 区域中特定命名空间的关联

如果管理员选择整个 AWS 账户，该账户中跨不同 AWS 区域的所有现有和未来的命名空间均有权访问数据共享。使用者账户管理员还可以选择特定 AWS 区域或某个区域内的特定命名空间，以授予其对数据共享的访问权限。

**如果您是生产者管理员或数据库拥有者**，请创建数据共享、将数据库对象和数据使用者添加到数据共享中，并向数据使用者授予权限。有关更多信息，请参阅 [生产者管理员操作](producer-cluster-admin.md)。

**如果您是创建者账户管理员**，则应使用 AWS Command Line Interface（AWS CLI）或 Amazon Redshift 控制台授权数据共享，并选择数据使用者。

**如果您是使用者账户管理员** – 按照以下步骤操作：

要将从其它账户共享的一个或多个数据共享与您的整个 AWS 账户、特定 AWS 区域或 AWS 区域中的命名空间关联，请使用 Amazon Redshift 控制台。

借助跨区域数据共享，可以使用 AWS Command Line Interface（AWS CLI）或 Amazon Redshift 控制台在特定的 AWS 区域中添加集群。

要指定一个或多个 AWS 区域，您可以使用 `associate-data-share-consumer` CLI 命令以及可选的 `consumer-region` 选项。

以下示例使用 CLI 将 `Salesshare` 与整个 AWS 账户关联，并选择了 `associate-entire-account` 选项。您一次只能关联一个区域。

```
aws redshift associate-data-share-consumer
--region {PRODUCER_REGION}
--data-share-arn arn:aws:redshift:{PRODUCER_REGION}:{PRODUCER_ACCOUNT}:datashare:{PRODUCER_CLUSTER_NAMESPACE}/Salesshare
--associate-entire-account
```

以下示例将 `Salesshare` 关联到美国东部（俄亥俄州）区域 (`us-east-2`)。

```
aws redshift associate-data-share-consumer
--region {PRODUCER_REGION}
--data-share-arn arn:aws:redshift:{PRODUCER_REGION}:0123456789012:datashare:{PRODUCER_CLUSTER_NAMESPACE}/Salesshare
--consumer-region 'us-east-2'
```

以下示例将 `Salesshare` 与另一个 AWS 账户在亚太地区（悉尼）区域（`ap-southeast-2`）的一个特定使用者命名空间关联。

```
aws redshift associate-data-share-consumer
--data-share-arn arn:aws:redshift:{PRODUCER_REGION}:{PRODUCER_ACCOUNT}:datashare:{PRODUCER_CLUSTER_NAMESPACE}/Salesshare
--consumer-arn 'arn:aws:redshift:ap-southeast-2:{CONSUMER_ACCOUNT}:namespace:{ConsumerImmutableClusterId}'
```

可以使用 Amazon Redshift 控制台将数据共享与整个 AWS 账户、特定 AWS 区域或 AWS 区域中的命名空间关联。要执行此操作，请登录 [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。然后，将从其它账户共享的一个或多个数据共享与您的整个 AWS 账户、整个 AWS 区域或 AWS 区域中的特定命名空间关联。有关更多信息，请参阅 [在 Amazon Redshift 中关联来自不同 AWS 账户的数据共享](writes-associating.md)。

关联 AWS 账户或特定命名空间后，数据共享将可供使用。您还可以随时更改数据共享关联。将关联从单个命名空间更改到 AWS 账户时，Amazon Redshift 会使用 AWS 账户信息覆盖命名空间。将关联从 AWS 账户更改到特定命名空间时，Amazon Redshift 会使用命名空间信息覆盖 AWS 账户信息。将关联从整个 AWS 账户更改到特定 AWS 区域和命名空间时，Amazon Redshift 会使用特定区域和命名空间信息覆盖 AWS 账户信息。

**如果您是使用者管理员**，您可以创建引用数据共享的本地数据库，并根据需要向使用者集群中的用户或角色授予对从数据共享创建的数据库的访问权限。您还可以对共享对象创建视图，并创建外部架构，以引用导入到使用者集群上的使用者数据库中的特定架构并为其分配精细权限。有关更多信息，请参阅 [使用者管理员操作](consumer-cluster-admin.md)。

# 管理跨区域数据共享的成本控制
<a name="cross-region-billing"></a>

使用 Amazon Redshift，您可以通过配置数据共享来限制 AWS 区域间传输的数据量，从而管理跨区域数据共享的成本控制。跨区域数据共享的成本控制管理允许您设置数据传输限制、监控数据传输使用情况，并在接近或超过这些限制时接收通知。

当使用来自其它区域的数据时，使用者需要支付从生产者区域到使用者区域的跨区域数据传输费。不同区域的数据传输价格不同。收费基于每次成功运行查询时扫描的数据字节数。有关 Amazon Redshift 定价的更多信息，请参阅 [Amazon Redshift 定价](https://aws.amazon.com/redshift/pricing/)。

您需要按字节数付费，不足一兆字节按一兆字节付费，每个查询最低按 10MB 付费。您可以设置有关查询使用量的成本控制，以及查看集群上每个查询传输的数据量。

要监控和控制跨区域数据共享的使用情况和相关使用成本，您可以创建每日、每周、每月使用限制，并定义 Amazon Redshift 在达到这些限制时自动执行的操作，以帮助保持预算的可预测性。

根据您设置的使用限制，Amazon Redshift 执行的操作可能是在某个系统表记录一个事件、发送 CloudWatch 告警并通过 Amazon SNS 通知管理员，或者停止跨区域数据共享的继续使用。

要在 Amazon Redshift 控制台上定义使用限制，请在集群的**操作**下选择**配置使用限制**。您可以通过自动生成的 CloudWatch 指标监控使用情况趋势，并利用自动生成的 CloudWatch 指标，在使用量超过您定义的限制时从**集群性能**或**监控**选项卡获得提示。您还可以使用 AWS CLI 或者 Amazon Redshift API 操作以编程方式创建、修改和删除使用限制。

# 在 AWS Data Exchange 上共享许可的 Amazon Redshift 数据
<a name="adx-getting-started"></a>

创建 AWS Data Exchange 数据共享并将其添加到 AWS Data Exchange 产品，提供商可以在 Amazon Redshift 中授权数据，当用户拥有活动 AWS Data Exchange 订阅时，可以在 Amazon Redshift 中发现、订阅和查询最新数据。

将 AWS Data Exchange 数据共享添加到 AWS Data Exchange 产品后，订阅开始后，使用者即可自动访问产品的数据共享，并且只要订阅处于活跃状态，就可保持访问。

**Topics**
+ [以创建者的身份使用 AWS Data Exchange 数据共享](adx-getting-started-producer.md)
+ [以使用者的身份使用 AWS Data Exchange 数据共享](#adx-getting-started-consumer)

# 以创建者的身份使用 AWS Data Exchange 数据共享
<a name="adx-getting-started-producer"></a>

使用 Amazon Redshift，您可以创建和管理数据共享，从而以生产者的身份与 AWS Data Exchange 共享实时数据产品。

**如果您是生产者管理员，请按照以下步骤在 Amazon Redshift 控制台上管理 AWS Data Exchange 数据共享：**

1. 在集群中创建数据共享，以共享 AWS Data Exchange 上的数据，并授予 AWS Data Exchange 数据共享访问权限。

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

   您还可以使用 Amazon Redshift 控制台创建数据共享。有关更多信息，请参阅 [创建数据共享](datashare-creation.md#create-datashare-console)。

   运行 CREATE DATASHARE 语句时，使用 MANAGEDBY ADX 选项隐式授予 AWS Data Exchange 对数据共享的访问权限。这表明 AWS Data Exchange 管理此数据共享。创建新的数据共享时，您只能使用 MANAGEDBY ADX 选项。不能使用 ALTER DATASHARE 语句修改现有的数据共享，以添加 MANAGEDBY ADX 选项。使用 MANAGEDBY ADX 选项创建数据共享后，只有 AWS Data Exchange 可以访问和管理数据共享。

   ```
   CREATE DATASHARE salesshare
   [[SET] MANAGEDBY [=] {ADX} ];
   ```

1. 将对象添加到数据共享中。创建者管理员继续管理 AWS Data Exchange 数据共享中可用的数据共享对象。

   要将对象添加到数据共享中，请在添加对象之前添加 schema。当您添加 schema 时，Amazon Redshift 不会在其下添加所有对象。您必须显式添加它们。有关更多信息，请参阅 [ALTER DATASHARE](r_ALTER_DATASHARE.md)。

   ```
   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 权限。

   使用 INCLUDENEW 子句将在指定 schema 中创建的任何未来表、视图或 SQL 用户定义函数 (UDF) 添加到数据共享中。只有超级用户才可以更改每个数据共享-schema 对的此属性。

   ```
   ALTER DATASHARE salesshare ADD SCHEMA PUBLIC;
   ALTER DATASHARE salesshare SET INCLUDENEW = TRUE FOR SCHEMA PUBLIC;
   ```

   您还可以使用 Amazon Redshift 控制台添加或从数据共享中删除对象。有关更多信息，请参阅[将数据共享对象添加到数据共享](datashare-creation.md#add-datashare-object-console)、[从数据共享中删除数据共享对象](manage-datashare-existing-console.md#remove-datashare-object-console)和[编辑 AWS Data Exchange 数据共享](manage-adx-datashare-console.md#edit-adx-datashare-console)。

1. 要授权对 AWS Data Exchange 数据共享的访问权限，请执行以下操作之一：
   + 通过使用 `aws redshift authorize-data-share` API 中的 `ADX` 关键词明确授权对 AWS Data Exchange 数据共享的访问权限。这样可允许 AWS Data Exchange 识别服务账户中的数据共享，并管理与数据共享关联的使用者。

     ```
     aws redshift authorize-data-share 
     --data-share-arn arn:aws:redshift:us-east-1:{PRODUCER_ACCOUNT}:datashare:{PRODUCER_CLUSTER_NAMESPACE}/salesshare 
     --consumer-identifier ADX
     ```

     您可以将条件键 `ConsumerIdentifier` 用于 `AuthorizeDataShare` 和 `DeauthorizeDataShare`，以明确允许或拒绝 AWS Data Exchange 调用 IAM 策略中的两个 API。

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
             {
                 "Sid": "VisualEditor0",
                 "Effect": "Deny",
                 "Action": [
                     "redshift:AuthorizeDataShare",
                     "redshift:DeauthorizeDataShare"
                 ],
                 "Resource": "*",
                 "Condition": {
                     "StringEqualsIgnoreCase": {
                         "redshift:ConsumerIdentifier": "ADX"
                     }
                 }
             }
         ]
     }
     ```

------
   + 使用 Amazon Redshift 控制台授权或删除授权 AWS Data Exchange 数据共享。有关更多信息，请参阅 [授权或删除数据共享中的授权](authorize-datashare-console.md)。
   + 或者，您可以在将数据共享导入 AWS Data Exchange 数据集时隐式授予访问 AWS Data Exchange 数据共享的权限。

   要删除 AWS Data Exchange 数据共享访问授权，请使用 `aws redshift deauthorize-data-share` API 操作中的 `ADX` 关键词。这样即可允许 AWS Data Exchange 识别服务账户中的数据共享，并从数据共享中删除关联。

   ```
   aws redshift deauthorize-data-share 
   --data-share-arn arn:aws:redshift:us-east-1:{PRODUCER_ACCOUNT}:datashare:{PRODUCER_CLUSTER_NAMESPACE}/salesshare 
   --consumer-identifier ADX
   ```

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

   以下示例显示名为 SalesShare 的数据共享的信息。有关更多信息，请参阅[DESC DATASHARE](r_DESC_DATASHARE.md)和[SHOW DATASHARES](r_SHOW_DATASHARES.md)。

   ```
   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](r_DESC_DATASHARE.md)和[SHOW DATASHARES](r_SHOW_DATASHARES.md)。

   您还可以使用 [SVV\$1DATASHARES](r_SVV_DATASHARES.md)、[SVV\$1DATASHARE\$1CONSUMERS](r_SVV_DATASHARE_CONSUMERS.md) 和 [SVV\$1DATASHARE\$1OBJECTS](r_SVV_DATASHARE_OBJECTS.md) 来查看数据共享、数据共享内的对象以及数据共享使用者。

1. 删除数据共享。我们建议您不要使用 DROP DATASHARE 语句删除共享给其他 AWS 账户 的 AWS Data Exchange 数据共享。这些账户将失去对数据共享的访问权限。此操作不可逆。这可能会违反 AWS Data Exchange 中的数据产品优惠条款。如果您要删除 AWS Data Exchange 数据共享，请参阅[DROP DATASHARE 使用说明](r_DROP_DATASHARE.md#r_DROP_DATASHARE_usage)。

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

   ```
   DROP DATASHARE salesshare;
   ERROR:  Drop of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value '620c871f890c49'
   ```

   要允许删除 AWS Data Exchange 数据共享，请设置 datashare\$1break\$1glass\$1session\$1var 变量，然后再次运行 DROP DATASHARE 语句。如果您要删除 AWS Data Exchange 数据共享，请参阅[DROP DATASHARE 使用说明](r_DROP_DATASHARE.md#r_DROP_DATASHARE_usage)。

   您还可以使用 Amazon Redshift 控制台删除数据共享。有关更多信息，请参阅 [删除在您的账户中创建的 AWS Data Exchange 数据共享](manage-adx-datashare-console.md#delete-adx-datashare-console)。

1. 使用 ALTER DATASHARE 可以在任何时间点从数据共享中删除对象。使用 REVOKE USAGE ON 可撤销某些使用者对数据共享的权限。它可以撤消对数据共享内的对象的 USAGE 权限，并立即停止对所有使用者集群的访问。列出数据共享和元数据查询（如列出数据库和表）不会在撤销访问权限后返回共享对象。

   ```
   ALTER DATASHARE salesshare REMOVE TABLE public.tickit_sales_redshift;
   ```

   您还可以使用 Amazon Redshift 控制台编辑数据共享。有关更多信息，请参阅 [编辑 AWS Data Exchange 数据共享](manage-adx-datashare-console.md#edit-adx-datashare-console)。

1. 授予或撤消 AWS Data Exchange 数据共享的 GRANT USAGE。您不能授予或撤消使用 AWS Data Exchange 数据共享的 GRANT USAGE。以下示例显示了在向 AWS 账户授予对数据共享（由 AWS Data Exchange 管理）的 GRANT USAGE 权限时出现的错误。

   ```
   CREATE DATASHARE salesshare MANAGEDBY ADX;
   ```

   ```
   GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '012345678910';
   ERROR:  Permission denied to add/remove consumer to/from datashare salesshare. Datashare consumers are managed by ADX.
   ```

   有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

**如果您是生产者管理员，请按照以下步骤在 AWS Data Exchange 控制台上创建和发布数据共享产品：**
+ AWS Data Exchange 数据共享创建后，创建者应创建新的数据集、导入资产、创建修订版本，并创建和发布新产品。

  使用 Amazon Redshift 控制台创建数据集。有关更多信息，请参阅 [在 AWS Data Exchange 上创建数据集](manage-adx-datashare-console.md#create-dataset-console)。

  有关更多信息，请参阅[在 AWS Data Exchange 上提供数据产品](https://docs.aws.amazon.com/data-exchange/latest/userguide/providing-data-sets.html)。

## 以使用者的身份使用 AWS Data Exchange 数据共享
<a name="adx-getting-started-consumer"></a>

使用 Amazon Redshift，您可以访问和分析 AWS Data Exchange 中的数据集，而无需存储或管理数据副本。

**如果您是使用者，请按照以下步骤发现包含 AWS Data Exchange 数据共享的数据产品，并查询 Amazon Redshift 数据：**

1. 在 AWS Data Exchange 控制台探索和订阅包含 AWS Data Exchange 数据共享的数据产品。

   订阅开始后，您可以访问作为资产导入到数据集（包含 AWS Data Exchange 数据共享）的已许可 Amazon Redshift 数据。

   有关如何开始使用包含 AWS Data Exchange 数据共享的数据产品的更多信息，请参阅[在 AWS Data Exchange 上订阅数据产品](https://docs.aws.amazon.com/data-exchange/latest/userguide/subscribe-to-data-sets.html)。

1. 如果需要，请在 Amazon Redshift 控制台上创建一个 Amazon Redshift 集群。

   有关如何创建集群的信息，请参阅[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#create-cluster)。

1. 列出可供您使用的数据共享并查看数据共享的内容。有关更多信息，请参阅[DESC DATASHARE](r_DESC_DATASHARE.md)和[SHOW DATASHARES](r_SHOW_DATASHARES.md)。

   以下示例显示指定创建器命名空间的入站数据共享的信息。当您以使用者管理员身份运行 DESC DATASHARE 时，您必须指定 ACCOUNT 和 NAMESPACE 选项以查看入站数据共享。

   ```
   DESC DATASHARE salesshare of ACCOUNT '123456789012' 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\$1DATASHARES 查看数据共享，使用 SVV\$1DATASHARE\$1OBJECTS 查看数据共享内的对象。

   以下示例显示使用者集群中的入站数据共享。

   ```
   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
   ```

1. 创建引用数据共享的本地数据库。您必须指定 ACCOUNT 和 NAMESPACE 选项才能创建 AWS Data Exchange 数据共享D 本地数据库。有关更多信息，请参阅 [CREATE DATABASE](r_CREATE_DATABASE.md)。

   ```
   CREATE DATABASE sales_db FROM DATASHARE salesshare OF ACCOUNT '123456789012' NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
   ```

   如果您想更精细地控制对本地数据库中对象的访问权限，请在创建数据库时使用 WITH PERMISSIONS 子句。这允许您在步骤 6 中为数据库中的对象授予对象级权限。

   ```
   CREATE DATABASE sales_db WITH PERMISSIONS FROM DATASHARE salesshare OF ACCOUNT '123456789012' NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
   ```

   您可以通过查询 [SVV\$1REDSHIFT\$1DATABASES](r_SVV_REDSHIFT_DATABASES.md) 视图查看从数据共享中创建的数据库。您可以直接连接到这些数据库，也可以连接到使用者集群上的本地数据库，然后执行跨数据库查询，从数据共享数据库中查询数据。您不能基于从现有数据共享创建的数据库对象创建数据共享。但是，您可以将数据复制到使用者集群上的单独表中，执行所需的任何处理，然后共享创建的新对象。

   您还可以使用 Amazon Redshift 控制台从数据共享中创建数据库。有关更多信息，请参阅 [通过数据共享创建数据库](query-datashare-console.md#create-database-from-datashare-console)。

1. （可选）创建外部 schema，以引用导入到使用者集群上的使用者数据库中的特定 schema 并为其分配精细权限。有关更多信息，请参阅 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。

   ```
   CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
   ```

1. 根据需要，向使用者集群中的用户或角色授权对从数据共享创建的数据库和架构引用的权限。有关更多信息，请参阅 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。

   ```
   GRANT USAGE ON DATABASE sales_db TO Bob;
   ```

   ```
   GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
   ```

    如果创建数据库时不使用 WITH PERMISSIONS，则只能将从数据共享创建的整个数据库的权限分配给用户和角色。在某些情况下，您需要对根据数据共享创建的数据库对象子集进行精细控制。如果是这样，您可以创建一个外部 schema 引用，该引用指向数据共享中的特定 schema（如上一步所述），并在 schema 级别提供精细权限。

   您还可以基于共享的对象创建后期绑定视图，并使用这些视图来分配精细权限。您还可以考虑让创建器集群为您创建具有所需精细度的额外的数据共享。您可以根据需要为从数据共享中创建的数据库创建尽可能多的架构引用。

   如果您在步骤 4 中使用 WITH PERMISSIONS 创建了数据库，则必须为共享数据库中的对象分配对象级权限。只有 USAGE 权限的用户在获得其他对象级权限之前，无法访问使用 WITH PERMISSIONS 创建的数据库中的任何对象。

   ```
   GRANT SELECT ON sales_db.public.tickit_sales_redshift to Bob;
   ```

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

   对使用者集群上的使用者数据库和架构具有权限的用户和角色可以浏览和导航任何共享对象的元数据。他们还可以浏览和导航使用者集群中的本地对象。为此，可使用 JDBC 或 ODBC 驱动程序、SHOW 命令或 SVV\$1ALL 和 SVV\$1REDSHIFT 视图。

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

   您将继续连接到本地集群数据库。但现在，您也可以使用三部分 database.schema.table 表示法从数据共享创建的数据库和 schema 中读取。您可以跨您可见的任何数据库和所有数据库执行查询。这些数据库可以是集群上的本地数据库，也可以是通过数据共享创建的数据库。或者，您可以直接连接到这些使用者数据库，并使用部分表示法对共享对象运行查询。

   您可以使用完全资格认证来访问数据。有关更多信息，请参阅 [跨数据库查询示例](cross-database_example.md)。

   ```
   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](r_CREATE_VIEW.md)。

   ```
   // 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;
   ```

# AWS Lake Formation 托管式数据共享入门
<a name="lf-getting-started"></a>

使用 Amazon Redshift，您可以通过 AWS Lake Formation 托管的数据共享跨 AWS 账户和 Amazon Redshift 集群访问和共享实时数据。AWS Lake Formation 数据共享使数据提供商能够与任何使用者（包括其它 AWS 账户和 Amazon Redshift 集群）安全地共享其 Amazon S3 数据湖中的实时数据。

# 以创建者身份使用 Lake Formation 托管的数据共享
<a name="lake-formation-getting-started-producer"></a>

借助 Amazon Redshift，您可以访问和分析通过 AWS Lake Formation 数据共享共享的数据。AWS Lake Formation 数据共享可实现跨 AWS 账户和 Amazon Redshift 集群的安全数据共享，而无需复制或移动底层数据。

将数据共享到 AWS Lake Formation 让您可以集中定义 Amazon Redshift 数据共享的 AWS Lake Formation 权限，并限制用户对数据共享内对象的访问。

使用 Amazon Redshift，您可以使用 AWS Lake Formation 托管的数据共享作为生产者，跨 AWS 账户和 Amazon Redshift 集群安全地共享实时数据。Lake Formation 托管的数据共享是一个对象，可让您与其它 AWS 账户和服务共享 Amazon Redshift 集群中的实时数据。

作为生产者集群或工作组管理员，请按照以下步骤将数据共享共享到 Lake Formation：

1. 在集群中创建数据共享，并授权 AWS Lake Formation 访问数据共享。

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

   ```
   CREATE DATASHARE salesshare;
   ```

1. 将对象添加到数据共享。生产者集群或工作组管理员继续管理可用的数据共享对象。要将对象添加到数据共享中，请在添加对象之前添加 schema。当您添加 schema 时，Amazon Redshift 不会在其下添加所有对象。您必须显式添加它们。有关更多信息，请参阅[更改数据共享](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_DATASHARE.html)。

   ```
   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.tickit_sales_redshift;
   ```

   使用 ALTER DATASHARE 共享 Schema 以及给定 Schema 中的表和视图。超级用户、数据共享拥有者或对数据共享具有 ALTER 或 ALL 权限的用户可以更改数据共享以向其中添加对象或从中删除对象。数据库用户应该是对象的拥有者，或者对这些对象具有 SELECT、USAGE 或 ALL 权限。

   使用 INCLUDENEW 子句将在指定 Schema 中创建的任何新表和视图添加到数据共享。只有超级用户才可以更改每个数据共享-schema 对的此属性。

   ```
   ALTER DATASHARE salesshare ADD SCHEMA PUBLIC;
   ALTER DATASHARE salesshare SET INCLUDENEW = TRUE FOR SCHEMA PUBLIC;
   ```

1. 向 Lake Formation 管理员账户授予数据共享的访问权限。

   ```
   GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '012345678910' VIA DATA CATALOG;
   ```

   要撤销使用，请使用以下命令。

   ```
   REVOKE USAGE ON DATASHARE salesshare FROM ACCOUNT '012345678910' VIA DATA CATALOG;
   ```

1. 使用 `aws redshift authorize-data-share` API 操作授予对 Lake Formation 数据共享的访问权限。这样可让 Lake Formation 识别服务账户中的数据共享，并管理与数据共享关联的使用者。

   ```
   aws redshift authorize-data-share 
   --data-share-arn arn:aws:redshift:us-east-1:{PRODUCER_ACCOUNT}:datashare:{PRODUCER_CLUSTER_NAMESPACE}/salesshare 
   --consumer-identifier {"DataCatalog/<consumer-account-id>"}
   ```

    要从 Lake Formation 托管的数据共享中删除授权，请使用 `aws redshift deauthorize-data-share` API 操作。这样，您可以让 AWS Lake Formation 识别服务账户中的数据共享，并删除授权。

   ```
   aws redshift deauthorize-data-share 
   --data-share-arn arn:aws:redshift:us-east-1:{PRODUCER_ACCOUNT}:datashare:{PRODUCER_CLUSTER_NAMESPACE}/salesshare 
   --consumer-identifier {"DataCatalog/<consumer-account-id>"}
   ```

    在任何时候，如果生产者集群或工作组管理员决定不再需要与使用者集群或工作组共享数据，他们可以使用 DROP DATASHARE 删除数据共享、取消对数据共享的授权或者撤销数据共享权限。系统不会自动删除 Lake Formation 中的关联权限和对象。

   ```
   DROP DATASHARE salesshare;
   ```

    授权 Lake Formation 账户管理数据共享后，Lake Formation 管理员可以发现共享的数据共享，将数据共享与数据目录 ARN 关联，并在链接到数据共享的 AWS Glue Data Catalog 中创建数据库。要使用 AWS CLI 关联数据共享，请使用命令 [associate-data-share-consumer](https://docs.aws.amazon.com/cli/latest/reference/redshift/associate-data-share-consumer.html)。要跨 AWS 区域共享数据共享，请在 `associate-data-share-consumer` 命令中指定 `--region` 参数，或使用 AWS 控制台来选择您的数据使用者。以下示例演示如何跨区域共享 Lake Formation 托管式数据共享。

   ```
   aws redshift associate-data-share-consumer --region <region-1>
   --data-share-arn 'arn:aws:redshift:us-east-1:12345678912:datashare:035c45ea-61ce-86f0-8b75-19ac6102c3b7/sample_share' 
   --consumer-arn 'arn:aws:glue:<region-1>:111912345678:catalog'
   ```

   Lake Formation 管理员还必须创建本地资源，用于定义数据共享中的对象应如何映射到 Lake Formation 中的对象。有关发现数据共享以及创建本地资源的更多信息，请参阅[管理 Amazon Redshift 数据共享中数据的权限](https://docs.aws.amazon.com/lake-formation/latest/dg/data-sharing-redshift.html)。

# 以使用者身份使用 Lake Formation 托管的数据共享
<a name="lake-formation-getting-started-consumer"></a>

使用 Amazon Redshift，您可以访问和分析通过 AWS Lake Formation 数据共享与您共享的数据。数据共享是一种数据产品，包含来自不同数据来源的数据对象集合，如表或数据库。

 AWS Lake Formation 管理员发现数据共享邀请并在 AWS Glue Data Catalog 中创建链接到数据共享的数据库后，使用者集群或工作组管理员可以将集群与数据共享和 AWS Glue Data Catalog 中的数据库相关联，创建使用者集群或工作组的本地数据库，并向 Amazon Redshift 使用者集群或工作组中的用户和角色授予访问权限，以便开始查询。按照这些步骤设置查询权限。

1. 如果需要，在 Amazon Redshift 控制台上创建一个 Redshift 集群，用作使用者集群或工作组。有关如何创建集群的信息，请参阅[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#create-cluster)。

1. 要列出用户可以访问 AWS Glue Data Catalog 使用者集群或工作组中的哪些数据库，请运行 [SHOW DATABASES](https://docs.aws.amazon.com/redshift/latest/dg/r_SHOW_DATABASES.html) 命令。

   ```
   SHOW DATABASES FROM DATA CATALOG [ACCOUNT <account-id>,<account-id2>] [LIKE <expression>]
   ```

   执行此命令会列出 Data Catalog 中可用的资源，例如 AWS Glue 数据库的 ARN、数据库名称和有关数据共享的信息。

1. 使用来自 SHOW DATABASES 的 AWS Glue 数据库 ARN 在使用者集群或工作组中创建本地数据库。有关更多信息，请参阅[创建数据库](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html)。

   ```
   CREATE DATABASE lf_db FROM ARN <lake-formation-database-ARN> WITH [NO] DATA CATALOG SCHEMA [<schema>];
   ```

1. 根据需要，向使用者集群或工作组中的用户和角色授予对从数据共享创建的数据库和架构引用的权限。有关更多信息，请参阅[授权](https://docs.aws.amazon.com/redshift/latest/dg/r_GRANT.html)或[撤销](https://docs.aws.amazon.com//redshift/latest/dg/r_REVOKE.html)。请注意，通过 [CREATE USER](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_USER.html) 命令创建的用户无法访问数据共享中已共享到 Lake Formation 的对象。只有同时具有 Redshift 和 Lake Formation 访问权限的用户才可以访问已与 Lake Formation 共享的数据共享。

   ```
   GRANT USAGE ON DATABASE sales_db TO IAM:Bob;
   ```

    作为使用者集群或工作组管理员，您只能将对从数据共享创建的整个数据库的权限分配给您的用户和角色。在某些情况下，您需要对根据数据共享创建的数据库对象子集进行精细控制。

    您还可以基于共享的对象创建后期绑定视图，并使用这些视图来分配精细权限。您还可以考虑让生产者集群或工作组为您创建具有所需精细度的额外的数据共享。您可以为从数据共享中创建的数据库创建尽可能多的 schema 引用。

1. 数据库用户可以使用视图 SVV\$1EXTERNAL\$1TABLES 和 SVV\$1EXTERNAL\$1COLUMNS 来查找 AWS Glue 数据库中的所有共享表或列

   ```
   SELECT * from svv_external_tables WHERE redshift_database_name = 'lf_db';
                           
   SELECT * from svv_external_columns WHERE redshift_database_name = 'lf_db';
   ```

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

   对使用者集群或工作组上的使用者数据库和架构具有权限的用户和角色可以浏览和导航任何共享对象的元数据。他们还可以浏览和导航使用者集群或工作组中的本地对象。为此，他们可以使用 JDBC 或 ODBC 驱动程序或 SVV\$1ALL 和 SVV\$1EXTERNAL 视图。

   ```
   SELECT * FROM lf_db.schema.table;
   ```

   您只能在共享对象上使用 SELECT 语句。但是，您可以通过查询来自不同本地数据库中的共享对象的数据，在使用者集群中创建表。

   ```
   // 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;
   ```