

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

# 使用者针对 Amazon Redshift 中新数据共享的操作
使用者针对新数据共享的操作

借助 Amazon Redshift，您可以使用其它 Amazon 账户的数据共享，从而实现跨账户的数据共享和协作。数据共享是在 Amazon Redshift 集群间共享实时数据的一种安全方式，即使这些集群位于不同的 Amazon 账户中。以下各节提供了用于配置访问权限、从数据共享创建数据库、授予对象级权限和查询共享数据的详细步骤。

**Topics**
+ [

# 在 Amazon Redshift 中关联来自不同 Amazon Web Services 账户的数据共享
](writes-associating.md)
+ [

# 在 Amazon Redshift 中从数据共享创建数据库
](writes-creating-database.md)
+ [

# 在 Amazon Redshift 中向使用者用户和角色授予对象级权限
](writes-granting.md)
+ [

# 在 Amazon Redshift 中查询数据共享中的数据
](writes-querying.md)

# 在 Amazon Redshift 中关联来自不同 Amazon Web Services 账户的数据共享
关联数据共享

使用 Amazon Redshift，您可以关联其它 Amazon Web Services 账户共享的数据共享，从而实现跨组织边界的无缝、安全的数据共享。数据共享是可共享的数据库对象，封装了来自一个或多个 Amazon Redshift 数据库的数据。以下各节演示了关联数据共享的过程。

------
#### [ Console ]

作为使用者管理员，您可以将从其它账户共享的一个或多个数据共享与您的整个 Amazon 账户或您账户中的特定命名空间关联。

1. 登录到 Amazon Web Services 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.amazonaws.cn/redshiftv2/)。

1. 在导航菜单上，选择**数据共享**。此时将会显示数据共享列表页面。选择**来自其他账户**。

1. 在**来自其它账户的数据共享**部分中，选择要关联的数据共享，并选择**关联**。出现**关联数据共享**页面时，请选择以下关联类型之一：
   + 选择**整个 Amazon 账户**，以将您的 Amazon 账户中不同 Amazon 区域的所有现有和未来的命名空间与该数据共享关联。
   + 如果将数据共享发布到 Amazon Glue Data Catalog，则只能将数据共享与整个 Amazon 账户关联。

1. 您可以从这里选择**允许的权限**。可选项有：
   + **只读** - 如果您选择只读，则使用者无法使用诸如 UPDATE 或 INSERT 之类的写入权限，即使这些权限是在生产者上授予和授权的。
   + **读写** – 使用者数据共享用户将拥有生产者授予和授权的所有权限，包括读取和写入权限。

1. 或者，选择**特定的 Amazon 区域和命名空间**，以将一个或多个 Amazon 区域和集群命名空间与该数据共享关联。选择**添加区域**，来将特定 Amazon 区域和命名空间添加至数据共享。此时将显示**添加 Amazon 区域**页面。

1. 选择 **Amazon 区域**。

1. 请执行下列操作之一：
   + 选择**添加所有命名空间**，来将此区域中的所有现有和未来的命名空间添加至数据共享。
   + 选择**添加特定的命名空间**，来将该区域中的一个或多个特定命名空间添加至数据共享。
   + 选择一个或多个命名空间，然后选择**添加 Amazon 区域**。

1. 选择**关联**。

生产者可以返回并更改授权设置，这可能会影响使用者的关联设置。

 如果您要将数据共享与 Lake Formation 账户相关联，请前往 Lake Formation 控制台创建数据库，然后定义数据库权限。有关更多信息，请参阅《Amazon Lake Formation 开发人员指南》中的[为 Amazon Redshift 数据共享设置权限](https://docs.amazonaws.cn/lake-formation/latest/dg/setup-ds-perms.html)。创建 Amazon Glue 数据库或联合数据库后，您可以使用查询编辑器 v2 或任何首选 SQL 客户端与您的使用者集群一起查询数据。

关联数据共享后，数据共享将变为可用状态。

**注意**  
您还可以随时更改数据共享关联。将关联从特定 Amazon 区域和命名空间更改到整个 Amazon 账户时，Amazon Redshift 会使用 Amazon 账户信息覆盖特定区域和命名空间信息。然后，Amazon Web Services 账户中的所有 Amazon 区域和命名空间即可访问数据共享。

------
#### [ API ]

**注意**  
如果数据共享是与其它账户共享的，则本节中的步骤将在生产者管理员授予对共享数据库对象的特定操作，以及生产者安全管理员授权访问后执行。

使用者安全管理员确定以下内容：
+ 账户中的所有命名空间、账户中特定区域的命名空间或特定命名空间是否可以访问数据共享。
+ 如果命名空间可以访问数据共享，这些命名空间是否有写入权限。

使用者安全管理员可以使用以下命令关联数据共享：

```
associate-data-share-consumer
--data-share-arn <value>
--consumer-identifier <value>
[--allow-writes | --no-allow-writes]
```

有关该命令的更多信息，请参阅 [associate-data-share-consumer](https://docs.amazonaws.cn/cli/latest/reference/redshift/associate-data-share-consumer.html)。

在将数据共享与命名空间关联时，使用者安全管理员必须明确将 `allow-writes` 设置为 true，以允许使用 INSERT 和 UPDATE 命令。如果不这样做，则用户只能执行读取操作，例如 SELECT、USAGE 或 EXECUTE 权限。

您可以通过使用不同的值再次调用 `associate-data-share-consumer` 来更改数据共享的命名空间关联。旧的关联会被新的关联覆盖，因此，如果您最初关联和设置 `allow-writes`，但关联并指定 `no-allow-writes`，或者干脆不指定值，则使用者的写入权限将被撤销。

------

# 在 Amazon Redshift 中从数据共享创建数据库
从数据共享创建数据库

借助 Amazon Redshift，您可以使用数据共享来创建数据库，然后跨生产者集群中的数据共享来查询数据，从而安全地访问实时数据，而无需复制或传输数据。以下步骤详细介绍了在 Amazon Redshift 环境中设置数据库的过程。

------
#### [ Console ]

在查询数据共享中的数据之前，必须从数据共享中创建一个数据库。您只能从指定的数据共享中创建一个数据库。

1. 登录到 Amazon Web Services 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.amazonaws.cn/redshiftv2/)。

1. 在导航菜单上，选择**集群**，然后选择您的集群。此时会显示集群详细信息页面。

1. 选择**数据共享**。此时将会显示数据共享列表。

1. 在**来自其他集群的数据共享**部分中，选择**连接到数据库**。有关更多信息，请参阅 [连接到数据库](connect-database-console.md)。

1. 选择要从中创建数据库的数据共享，然后选择**从数据共享中创建数据库**。此时将显示“从数据共享创建数据库”页面。

1. 在**数据库名称**中，指定数据库名称。数据库名称必须为 1-64 个字母数字字符（仅限小写），且不能是保留字。

1. 选择**创建**。

创建数据库后，您可以查询数据库中的数据或执行写入操作，前提是这些操作已由使用者管理员授予、授权和关联。

------
#### [ API ]

要以使用者管理员的身份共享数据以供读取，请执行以下步骤。

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

------

# 在 Amazon Redshift 中向使用者用户和角色授予对象级权限
授予对象级权限

作为使用者管理员，您可以通过完成以下步骤，向使用者用户和角色授予对象级权限。

------
#### [ SQL ]

如果创建数据库时不使用 WITH PERMISSIONS，则只能将从数据共享创建的整个数据库的权限分配给用户和角色。

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

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

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

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

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

------

有关授予多仓库写入的权限的更多信息，请参阅[在 Amazon Redshift 中管理数据共享的权限](writes-managing-permissions.md)。

# 在 Amazon Redshift 中查询数据共享中的数据
查询数据共享中的数据

借助 Amazon Redshift，您可以跨生产者集群的数据共享查询数据，从而安全地访问实时数据，而无需复制或传输数据。下一节介绍在 Amazon Redshift 环境中查询数据共享。

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

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

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

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

------
#### [ SQL ]

```
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 语句。但是，您可以通过查询来自不同本地数据库中的共享对象的数据，在使用者集群中创建表。

------