使用共享数据¶
本主题描述在通过数据提供商提供的共享来创建数据库,然后使用数据库进行查询和其他操作时关联的任务。
您必须使用 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:
-
该页面显示您账户可用的所有共享。Database 列显示通过共享创建的数据库的名称。如果该列为空,则表示尚未通过共享(在您的账户中)创建数据库。
- SQL:
执行 SHOW SHARES 或 DESCRIBE SHARE 语句。
例如,使用 SQL:
SHOW SHARES;
Copy输出显示:
两个共享,
sales_s
和sales_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:
登录 Snowsight。
选择 Data Products » Private Sharing。
选择 Shared with You 选项卡。
在 Ready to Get 部分中,选择您要为其创建数据库的共享。
设置数据库名称以及有权访问该数据库的角色。
选择 Get Data。
- Classic Console:
- 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 » <shared_db_name>。
在侧面板中,点击 Grant Privileges,并将权限分配给一个或多个角色。
- SQL:
执行 GRANT <privileges> 语句。
要查看具有共享数据库的 USAGE 权限的角色,请使用 Web 界面或 SHOW GRANTS 命令。
SQL 示例¶
角色
r1
或通过共享xy12345.sales_s
创建数据库snow_sales
:use role r1; create database snow_sales from share xy12345.sales_s;
Copy角色
r1
会为角色r2
授予数据库snow_sales
的 IMPORTED PRIVILEGES:grant imported privileges on database snow_sales to role r2;
Copy既然
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;
第 2 步:为账户级角色授予共享数据库角色¶
为账户中的角色授予共享数据库角色之后,具有这些角色的用户可以访问共享中的数据库对象。
使用用于通过共享创建数据库的角色。
例如,查看可用的数据库角色,然后为账户中的 analyst
角色授予数据库角色 c1.r1
:
SHOW DATABASE ROLES in DATABASE c1;
GRANT DATABASE ROLE c1.r1 TO ROLE analyst;
在共享视图或表上创建流¶
在共享对象(安全视图或表)上创建流之后,您能够跟踪这些对象中所做的数据操作语言 (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