Secure Data Sharing 入门¶
Secure Data Sharing 是一项非常强大且易于使用的功能。只需执行几个步骤,您即可开始成为数据提供商。
本主题介绍一些必须完成的任务,以通过创建共享与一个或多个账户共享数据库及其对象。您可以使用 Direct Share 或列表向使用者提供共享服务。
您可以将共享内容附加到列表,或将与活跃使用者的 Direct Share 转换为列表。有关说明,请参阅 将 Direct Share 转换为列表。
本主题内容:
选择如何共享数据库对象¶
在继续操作之前,请确定以下哪种添加对象的选择能满足您的需求:
** 选项 1. 为共享授予数据库角色:**
通过在数据库中创建多个数据库角色,将共享中的安全对象进行分段。将数据库中对象子集的权限授予每个数据库角色。然后向共享授予每个数据库角色。
从包含数据库角色的共享中创建数据库后,数据使用者将每个共享数据库角色授予其自己账户中的一个或多个 账户角色。
如果没有数据库角色,数据使用者账户中的账户管理员向角色授予 IMPORTED PRIVILEGES 这项权限,以允许其用户访问共享中的 所有 数据库和数据库对象(表、安全视图等)。没有选项可让数据使用者账户中的不同用户组访问共享对象的子集。这种“全有或全无”式方法要求您创建多个共享,以授予对同一数据库中不同对象的访问权限。
备注
如果您计划在单个共享中包含多个数据库的数据,则不能使用此选项,因为 REFERENCE_USAGE 权限不能授予数据库角色。有关共享多个数据库数据的指南,请参阅 共享来自多个数据库的数据。
或者,可以创建一个共享,将数据库角色授予共享(选项 1),也可将对象权限直接授予同一共享,而不将这些对象权限授予数据库角色(选项 2)。使用共享创建数据库的数据使用者可以通过向本地角色授予数据库的 IMPORTED PRIVILEGES 权限,直接访问授予共享的对象。
小技巧
共享的数据库角色不支持将来向对象授予权限。有关详细信息,请参阅 GRANT DATABASE ROLE ...TO SHARE。
** 选项 2. 将对象的权限直接授予共享:**
将数据库中特定对象的权限直接授予共享。该选项允许您在共享中包含多个数据库的数据,前提是这些数据库属于同一账户。有关共享多个数据库数据的指南,请参阅 共享来自多个数据库的数据。
数据使用者账户中的账户管理员向一个或多个角色授予共享数据库的 IMPORTED PRIVILEGES 权限,以允许其用户访问共享中的数据库和数据库对象(表、安全视图等)。
请注意,此选择不支持基于角色对共享中的数据库对象进行分段。有关此级别的控制,请参阅“选项 1”。
选项 1:向共享授予数据库角色¶
本部分向数据提供商说明如何使用数据库角色限制对共享中的数据库和数据库对象的访问。
备注
要执行本主题中描述的任务,您的角色必须具有全局 CREATE DATABASE 和 CREATE SHARE 权限。
在本部分的扩展示例中,数据提供商与数据使用者共享以下对象:
数据库 |
|
|
---|---|---|
架构 |
|
|
安全视图 |
此视图的结果集包含来自表 |
此视图的结果集包含来自表 |
数据提供商在数据库 d1
中创建两个数据库角色,以控制对 d1.r1
和 d1.r2
对象的访问。
下图显示了这些对象之间的关系,并指出了授予数据库角色的权限:
有关权限的更多信息,请参阅 访问控制权限。
第 1 步:创建数据库角色¶
使用 CREATE DATABASE ROLE 创建新的数据库角色,或替换现有数据库角色。
例如,使用完全限定的标识符创建数据库角色 d1.r1
和 d1.r2
:
CREATE DATABASE ROLE d1.r1;
CREATE DATABASE ROLE d1.r2;
或者,将所需的数据库设置为会话中的当前数据库,然后创建数据库角色:
USE DATABASE d1;
CREATE DATABASE ROLE r1;
CREATE DATABASE ROLE r2;
第 2 步:向数据库角色授予对象权限¶
使用 GRANT <privileges>,将单个数据库和数据库中对象子集的权限授予每个数据库角色。仅授予应允许数据库角色访问的对象的权限。
指定数据库角色的完全限定名称,或将数据库设置为会话中的活动数据库,然后指定相对名称。
备注
要执行本主题中描述的任务,您必须使用 ACCOUNTADMIN 角色或者 获授予相关权限的角色。有关更多信息(包括其他数据共享方案),请参阅 使用共享。
授予数据库角色的权限被限制为对包含数据库角色的数据库和架构的 USAGE,以及同一数据库中其他对象的权限。特别地,请注意不能出于在共享中包含来自多个数据库的对象的目的,向数据库角色授予 REFERENCE_USAGE 权限。
继续使用这些说明中的扩展示例,向数据库角色授予以下权限:
数据库角色 |
权限 |
对象 |
---|---|---|
|
USAGE |
数据库 |
USAGE |
架构 |
|
SELECT |
安全视图 |
|
|
USAGE |
数据库 |
USAGE |
架构 |
|
SELECT |
安全视图 |
以下 SQL 语句向数据库角色 d1.r1
授予权限:
GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r1;
GRANT SELECT ON VIEW d1.s1.v1 TO DATABASE ROLE d1.r1;
以下 SQL 语句向数据库角色 d1.r2
授予权限:
GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r2;
GRANT SELECT ON VIEW d1.s1.v2 TO DATABASE ROLE d1.r2;
请注意,无需授予父数据库的 USAGE 权限。此权限是在创建数据库角色时隐式授予的。
若要查看授予数据库角色的所有权限,请使用完全限定的标识符执行 SHOW GRANTS TO DATABASE ROLE:
SHOW GRANTS TO DATABASE ROLE d1.r1;
SHOW GRANTS TO DATABASE ROLE d1.r2;
或者,将所需的数据库设置为会话中的当前数据库,然后执行以下命令:
USE DATABASE d1;
SHOW GRANTS TO DATABASE ROLE r1;
SHOW GRANTS TO DATABASE ROLE r2;
第 3 步:创建共享¶
使用 CREATE SHARE 创建共享。在过程的这个暂存区,共享是一个空容器。
例如,创建一个名为 share1
的新共享:
CREATE SHARE share1;
第 4 步:通过向共享授予 USAGE 权限来添加数据库¶
目前,必须授予数据库的 USAGE 权限才能将其包含在共享中。
例如,授予 d1
数据库的 USAGE 权限,以共享 share1
:
GRANT USAGE ON DATABASE d1 TO SHARE share1;
第 5 步:通过向共享授予数据库角色来添加对象¶
通过使用 GRANT DATABASE ROLE ...TO SHARE 向共享授予数据库角色,将数据库和数据库对象添加到共享中。
例如,向共享 share1
授予数据库角色 d1.r1
和 d1.r2
:
GRANT DATABASE ROLE d1.r1 TO SHARE share1;
GRANT DATABASE ROLE d1.r2 TO SHARE share1;
第 6 步:与一个或多个数据使用者账户共享数据库对象¶
修改共享 ALTER SHARE ...ADD ACCOUNTS,并添加要与之共享数据库对象的数据库使用者账户。
以下示例添加组织 org1
中的账户 consumer1
和 consumer2
,以共享 share1
:
ALTER SHARE share1 ADD ACCOUNTS = org1.consumer1,org1.consumer2;
管理数据库角色¶
本部分说明如何管理授予共享的数据库角色。
数据提供商:重命名共享的数据库角色¶
使用 ALTER DATABASE ROLE ...RENAME TO 语句重命名数据库角色。
例如,将数据库角色 d1.r1
重命名为 d1.r3
:
ALTER DATABASE ROLE d1.r1 RENAME TO d1.r3;
重命名数据库角色后,所有授予 d1.r1
的权限都将保留。
将数据库角色的名称已更改告知共享的所有数据使用者。
请注意,禁止使用 RENAME TO 子句将数据库角色移动到其他数据库。例如:
ALTER DATABASE ROLE d1.r1 RENAME TO d2.r1;
数据提供商:删除共享的数据库角色¶
使用 DROP DATABASE ROLE 删除数据库角色。
例如,删除数据库角色 d1.r2
:
DROP DATABASE ROLE d1.r2;
通知包含该数据库角色的共享的所有数据使用者。对授予该数据库角色的任何对象的访问权限会被撤销。
数据提供商:创建新的共享数据库角色¶
使用 CREATE DATABASE ROLE 创建新的数据库角色。有关信息,请参阅 第 1 步:创建数据库角色 (本主题内容)。将数据库对象的权限授予数据库角色,然后将数据库角色授予共享。
通知包含新数据库角色的共享的所有数据使用者。他们必须将新的数据库角色授予自己的账户角色,以允许这些角色访问与数据库角色关联的对象。
选项 2:直接向共享授予权限¶
本部分向数据提供商说明如何通过授予共享数据库的单项权限,来允许使用者访问共享中的所有数据库和数据库对象。
第 1 步:创建共享¶
使用 CREATE SHARE 创建共享。在此步骤中,共享只是一个等待添加对象和账户的容器。
第 2 步:通过授予权限将对象添加到共享中¶
使用 GRANT <privilege> ...TO SHARE 向共享授予以下对象权限:
要共享的数据库的 USAGE 权限。
包含要共享的对象的每个数据库架构的 USAGE 权限。
用于在每个共享架构中共享特定对象的 SELECT 权限:
表
外部表
安全视图
安全的物化视图
安全的 UDFs
备注
建议不要这样做:在流上创建安全视图,然后与使用者共享这些视图。应改为允许使用者在您共享的表和安全视图上创建自己的流。有关更多信息,请参阅 共享对象上的流。
(可选)使用 SHOW GRANTS 查看授予共享的对象权限。
小技巧
此时对共享执行这项最低限度的验证,因为在完成下一步后,添加到共享的所有账户都可以看到该共享。
若要对共享执行更深入的验证,可以在您的账户中模拟使用者账户。有关更多详细信息,请参阅 使用安全对象控制数据访问。
第 3 步:向共享添加一个或多个账户¶
使用 ALTER SHARE 向共享添加一个或多个账户。若要查看添加到共享的账户,可以使用 SHOW GRANTS。
共享现已就绪,可供特定账户使用。有关执行这些任务和其他数据提供商任务的更详细说明,请参阅 使用共享。
示例¶
下面的示例演示了如上所述的整个提供商过程。
请注意,此示例假定:
存在一个名为
sales_db
的数据库,其包含名为aggregates_eula
的架构和名为aggregate_1
的表。该数据库、架构和表将与两个名为
xy12345
和yz23456
的账户共享。USE ROLE accountadmin; CREATE SHARE sales_s; GRANT USAGE ON DATABASE sales_db TO SHARE sales_s; GRANT USAGE ON SCHEMA sales_db.aggregates_eula TO SHARE sales_s; GRANT SELECT ON TABLE sales_db.aggregates_eula.aggregate_1 TO SHARE sales_s; SHOW GRANTS TO SHARE sales_s; ALTER SHARE sales_s ADD ACCOUNTS=xy12345, yz23456; SHOW GRANTS OF SHARE sales_s;Copy