使用共享数据

本主题描述在通过数据提供商提供的共享来创建数据库,然后使用数据库进行查询和其他操作时关联的任务。

您必须使用 ACCOUNTADMIN 角色(或获得 IMPORT SHARE 全局权限的角色)来执行这些任务。有关 IMPORT SHARE 权限的更多详细信息,请参阅 启用非 ACCOUNTADMIN 角色执行数据共享任务

备注

本主题中描述的任务不适用于阅读者账户。如果您通过阅读者账户来使用共享数据,则无需执行这些任务,因为管理员已通过提供商账户完成了这些任务。

本主题内容:

共享数据库的一般限制

共享数据库对使用者有以下限制:

  • 共享数据库是只读的。使用者账户中的用户可以查看/查询数据,但不能插入或更新数据,也不能在数据库中创建任何对象。

  • 不支持以下操作:

    • 创建共享数据库或数据库中任何架构/表的克隆。

    • 共享数据库或数据库中任何架构/表的 Time Travel。

    • 编辑共享数据库的注释。

  • 共享数据库和数据库中的所有对象不能与其他账户重新共享。

  • 无法复制共享数据库。

查看可用共享

您可以通过 Web 界面或 SQL 查看可在账户中使用的共享:

Snowsight:

选择 Data Products » Private Sharing,然后选择 Shared With You。您可以查看以下内容:

  • 已与您共享的 私人共享列表。您还可以查看您有权访问的 数据交换 列表。

  • 已与您共享的 直接共享。根据共享状态,共享分为两部分:

    • 已准备好获取的直接共享(即尚未通过共享创建数据库)。

    • 已导入数据库并可供查询的直接共享。

要查看已导入数据库并可供查询的 Snowflake Marketplace 列表,请在导航菜单中选择 Data Products » Marketplace。有关更多信息,请参阅 探索列表

Classic Console:

选择 Shares Shares 选项卡,然后选择 Inbound 切换键。

该页面显示您账户可用的所有共享。Database 列显示通过共享创建的数据库的名称。如果该列为空,则表示尚未通过共享(在您的账户中)创建数据库。

SQL:

执行 SHOW SHARESDESCRIBE SHARE 语句。

例如,使用 SQL:

SHOW SHARES;
Copy

输出显示:

  • 两个共享, sales_ssales_s2 可用。kind 列中的 INBOUND 指定数据提供商让共享可供您的账户使用。

  • name 列显示每个共享的名称,格式为 share_name (例如 SALE_S)。

  • owner_account 列显示提供每个共享的账户名称,格式为 orgname.account_name

  • 如果 database_name 列为空,则表示尚未通过账户中的共享创建数据库。

+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
| created_on                    | kind     | owner_account        | name          | database_name         | to               | owner        | comment                                | listing_global_name |                  |
|-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------|---------------------|
| 2017-07-09 19:18:09.821 -0700 | INBOUND  | SNOW.XY12345         | SALES_S2      | UPDATED_SALES_DB      |                  |              | Transformed and updated sales data     |                     |
| 2017-06-15 17:02:29.625 -0700 | OUTBOUND | SNOW.MY_TEST_ACCOUNT | SALES_S       | SALES_DB              | XY12345, YZ23456 | ACCOUNTADMIN |                                        |                     |
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+

以下示例使用 DESCRIBE SHARE 命令显示 sales_s 共享中的对象(数据库、架构和表):

DESC SHARE xy12345.sales_s;

+----------+------------------------------------+---------------------------------+
| kind     | name                               | shared_on                       |
|----------+------------------------------------+---------------------------------|
| DATABASE | <DB>                               | Thu, 15 Jun 2017 17:03:16 -0700 |
| SCHEMA   | <DB>.AGGREGATES_EULA               | Thu, 15 Jun 2017 17:03:16 -0700 |
| TABLE    | <DB>.AGGREGATES_EULA.AGGREGATE_1   | Thu, 15 Jun 2017 17:03:16 -0700 |
| VIEW     | <DB>.AGGREGATES_EULA.AGGREGATE_1_v | Thu, 15 Jun 2017 17:03:16 -0700 |
+----------+------------------------------------+---------------------------------+
Copy

共享包含一个架构 aggregates_eula 和一个表 aggregate_1。每个对象名称(包括数据库本身)都带有前缀 <DB>。这表明尚未通过共享(在您的账户中)创建数据库。

通过共享创建数据库

您可以使用 Web 界面或者 SQL 通过共享创建数据库:

Snowsight:
  1. 登录 Snowsight

  2. 选择 Data Products » Private Sharing

  3. 选择 Shared with You 选项卡。

  4. Ready to Get 部分中,选择您要为其创建数据库的共享。

  5. 设置数据库名称以及有权访问该数据库的角色。

  6. 选择 Get Data

Classic Console:
  1. 选择 Shares Shares 选项卡,然后选择 Inbound 切换键。

  2. 选择尚未通过其创建数据库的共享(即 Database 列为空)。

  3. 选择 Create Database from Share

  4. 按照对话框中提供的提示进行操作。

SQL:

执行具有以下数据共享特定语法的 CREATE DATABASE 语句:

CREATE DATABASE <name> FROM SHARE <provider_account>.<share_name>
Copy

其中,provider_account 是提供共享的账户的名称,并且 share_name 是用于创建数据库的共享的名称。

备注

  • 每个账户只能使用一个共享。

  • 要在创建数据库之前查看正在共享的对象,请使用 DESCRIBE SHARE 命令。

  • 当通过共享创建数据库时,默认情况下,只有用于创建数据库的角色才能访问数据库中的对象。有关向其他角色授予访问权限的说明,请参阅 授予共享数据库的权限 (本主题内容)。

SQL 示例

以下示例会在账户中通过 sales_s 共享来创建名为 snow_sales 的数据库:

CREATE DATABASE snow_sales FROM SHARE xy12345.sales_s;
Copy

列出新的 snow_sales 数据库:

SHOW DATABASES LIKE 'snow%';

+---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------+
| created_on                      | name                  | is_default | is_current | origin                  | owner        | comment | options | retention_time |
|---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------|
| Sun, 10 Jul 2016 23:28:50 -0700 | SNOWFLAKE_SAMPLE_DATA | N          | N          | SFC_SAMPLES.SAMPLE_DATA | ACCOUNTADMIN |         |         | 1              |
| Thu, 15 Jun 2017 18:30:08 -0700 | SNOW_SALES            | N          | Y          | xy12345.SALES_S         | ACCOUNTADMIN |         |         | 1              |
+---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------+
Copy

在此示例中, origin 列指明用于创建数据库的共享的完全限定名称。

同样, SHOW SHARES 和 DESC SHARE 的输出包括通过共享创建的数据库的名称:

SHOW SHARES;
Copy
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
| created_on                    | kind     | owner_account        | name          | database_name         | to               | owner        | comment                                | listing_global_name |
|-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------|---------------------|
| 2017-07-09 19:18:09.821 -0700 | INBOUND  | SNOW.XY12345         | SALES_S2      | UPDATED_SALES_DB      |                  |              | Transformed and updated sales data     |                     |
| 2017-06-15 17:02:29.625 -0700 | OUTBOUND | SNOW.MY_TEST_ACCOUNT | SALES_S       | SALES_DB              | XY12345, YZ23456 | ACCOUNTADMIN |                                        |                     |
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
DESC SHARE xy12345.sales_s;

+----------+------------------------------------------+---------------------------------+
| kind     | name                                     | shared_on                       |
|----------+------------------------------------------+---------------------------------|
| DATABASE | SNOW_SALES                               | Thu, 15 Jun 2017 17:03:16 -0700 |
| SCHEMA   | SNOW_SALES.AGGREGATES_EULA               | Thu, 15 Jun 2017 17:03:16 -0700 |
| TABLE    | SNOW_SALES.AGGREGATES_EULA.AGGREGATE_1   | Thu, 15 Jun 2017 17:03:16 -0700 |
| VIEW     | SNOW_SALES.AGGREGATES_EULA.AGGREGATE_1_v | Thu, 15 Jun 2017 17:03:16 -0700 |
+----------+------------------------------------------+---------------------------------+
Copy

授予共享数据库的权限

关于授予共享中对象的访问权限的说明会有所不同,具体取决于提供商是否使用数据库角色对共享中的对象进行分段。此选项将共享中的不同对象与不同的数据库角色关联。

请注意,单个共享可以包括可通过数据库角色访问的对象和不与数据库角色关联的对象。

选项 1:共享中不与数据库角色关联的对象

通过为账户中的一个或多个角色授予共享数据库的 IMPORTED PRIVILEGES 权限,允许用户访问共享中的对象。

仅当满足以下某个条件时,角色才可以授予导入数据库的 IMPORTED PRIVILEGES:

  • 拥有导入数据库(即具有 OWNERSHIP 数据库权限)。

  • 获得 MANAGE GRANTS 全局权限。

将 IMPORTED PRIVILEGES 分配给其他角色

您可以使用 Web 界面或 SQL,将此角色分配给其他角色:

Classic Console:

点击 Databases Databases 选项卡 » <shared_db_name>

在侧面板中,点击 Grant Privileges,并将权限分配给一个或多个角色。

SQL:

执行 GRANT <privileges> 语句。

要查看具有共享数据库的 USAGE 权限的角色,请使用 Web 界面或 SHOW GRANTS 命令。

SQL 示例

  1. 角色 r1 或通过共享 xy12345.sales_s 创建数据库 snow_sales

    use role r1;
    create database snow_sales from share xy12345.sales_s;
    
    Copy
  2. 角色 r1 会为角色 r2 授予数据库 snow_sales 的 IMPORTED PRIVILEGES:

    grant imported privileges on database snow_sales to role r2;
    
    Copy
  3. 既然 r2 没有数据库的 OWNERSHIP 权限,要执行以下授予或撤消操作,角色 r2 必须持有账户的 MANAGE GRANTS 权限:

    use role r2;
    grant imported privileges on database snow_sales to role r3;
    revoke imported privileges on database snow_sales from role r3;
    
    Copy

选项 2:共享中与数据库角色关联的对象

为账户中的一个或多个角色授予共享数据库中的适当数据库角色,从而允许用户访问共享中的对象。

第 1 步:通过共享创建数据库

使用以下命令通过共享创建数据库:CREATE DATABASE ...FROM SHARE

要执行此命令,角色需要具有全局 CREATE DATABASE 和 IMPORT SHARE 权限。

例如,通过提供商 provider1 和共享 share1 创建数据库 c1

CREATE DATABASE c1 FROM SHARE provider1.share1;
Copy

第 2 步:为账户级角色授予共享数据库角色

为账户中的角色授予共享数据库角色之后,具有这些角色的用户可以访问共享中的数据库对象。

使用用于通过共享创建数据库的角色。

例如,查看可用的数据库角色,然后为账户中的 analyst 角色授予数据库角色 c1.r1

SHOW DATABASE ROLES in DATABASE c1;
GRANT DATABASE ROLE c1.r1 TO ROLE analyst;
Copy

在共享视图或表上创建流

在共享对象(安全视图或表)上创建流之后,您能够跟踪这些对象中所做的数据操作语言 (DML) 更改。此功能类似于在“本地”对象上(即与流相同的账户中)创建和使用流。

用于执行本部分中 SQL 语句的角色必须具有共享表或安全视图所需的授权。有关信息,请参阅 授予共享数据库的权限 (本主题内容)。

  • 要在共享视图上创建流,请执行以下步骤:

    CREATE STREAM <name> ON VIEW <shared_db>.<schema>.<view>;
    
    Copy

    例如,在 snow_sales.aggregates_eula 数据库和架构中的共享 aggregate_1_v 视图上创建流:

    CREATE STREAM aggregate_1_v_stream ON VIEW snow_sales.aggregates_eula.aggregate_1_v;
    
    Copy
  • 要在共享表上创建流,请执行以下步骤:

    CREATE STREAM <name> ON TABLE <shared_db>.<schema>.<table>;
    
    Copy

    例如,在 snow_sales.aggregates_eula 数据库和架构中的共享 aggregate_1 表上创建表流:

    CREATE STREAM aggregate_1_stream ON TABLE snow_sales.aggregates_eula.aggregate_1;
    
    Copy

有关创建流的更多信息,请参阅 CREATE STREAM

备注

  • 数据提供商必须在视图或表上启用更改跟踪,才能在这些对象上创建流。如果您无法在所需的共享对象上创建流,请联系数据提供商,考虑在该对象上启用更改跟踪。

  • 为避免流过时,请在表的保留期内使用事务中的流记录。请联系数据提供商,确定表的数据保留期。

    要确定流是否已过时,请执行 DESCRIBE STREAM 或者 SHOW STREAMS 命令。在命令输出中,当 STALE 列值为 TRUE 时,流可能已过时。实际上,从流中读取可能会在预期 STALE_AFTER 后的一段时间内成功。但是,在此期间,流可能随时变得过时。

查询共享数据库

查询共享数据库与查询账户中的任何其他数据库相同。

例如:

USE ROLE r1;

USE DATABASE snow_sales;

SELECT * FROM aggregates_1;
Copy
语言: 中文