

 从补丁 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/)。

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