共享来自多个数据库的数据

Snowflake 数据提供商可使用安全视图共享多个数据库中的数据。安全视图可引用一个或多个数据库中包含的对象,例如架构、表和其他视图,只要这些数据库均属于同一个账户即可。

共享引用多个数据库中对象的安全视图时,所用过程不同于共享单个数据库中包含的数据。

除执行共享数据的所有 标准步骤 之外,您还必须授予要共享的安全视图所 引用 的每个数据库的 REFERENCE_USAGE 权限。但您 需要授予包含安全视图的数据库的 REFERENCE_USAGE 权限。

备注

无法使用数据库角色共享多个数据库中的数据。无法将 REFERENCE_USAGE 权限授予 数据库角色,也无法使用数据库角色将引用多个数据库中对象的安全视图授予一个共享。

在将安全视图授予共享 之前,必须单独授予安全视图中引用的各数据库的 REFERENCE_USAGE 权限。

要共享引用多个数据库中对象的安全视图,请执行以下操作:

  1. 以具有 ACCOUNTADMIN 角色或者获授 CREATE SHARE 全局权限的角色的用户身份连接到 Snowflake 账户。有关 CREATE SHARE 权限的更多详细信息,请参阅 启用非 ACCOUNTADMIN 角色执行数据共享任务

  2. 使用 CREATE SHARE 创建共享。

  3. 使用 GRANT <privilege> ...TO SHARE 授予您要共享的数据库的 USAGE 权限。

    备注

    如果您共享的安全视图引用了多个数据库中包含的对象,只需授予在其中创建安全视图的数据库的 USAGE 权限。对于每个共享,您只能授予对一个数据库的 USAGE 权限。

    将 USAGE 权限授予数据库会将共享与数据库关联,这是将其他权限授予共享的必备要求。

  4. 使用 GRANT <privilege> ...TO SHARE,授予对要共享的数据库中每个架构的 USAGE 权限。

  5. 使用 GRANT <privilege> ...TO SHARE,授予对包含要共享的视图所引用对象的每个附加数据库的 REFERENCE_USAGE 权限。

  6. 通过使用 GRANT <privilege> ...TO SHARE 授予视图的 SELECT 权限,将视图添加到共享。

  7. 使用 ALTER SHARE,将一个或多个使用者账户添加到共享。

共享现已就绪,可供特定账户使用。

备注

要共享引用另一个数据库中 UDF 的安全视图,必须确保 UDF 安全。有关创建安全的 UDF 的更多详细信息,请参阅 创建安全的 UDF 或存储过程

示例

有关创建安全视图的信息,请参阅以下示例。

示例 1:在现有数据库中创建和共享安全视图

某提供商根据数据特征和业务需求将数据组织到不同数据库中,该提供商希望在一个数据库中共享一个安全视图,这个视图将一个数据库中的数据与其他数据库中的对象(例如架构、表、视图)连接起来。

数据库、数据库对象、共享和账户之间的关系
  1. 创建数据库 database1 和数据:

    CREATE DATABASE database1;
    CREATE SCHEMA database1.sch;
    CREATE TABLE database1.sch.table1 (id INT);
    CREATE VIEW database1.sch.view1 AS SELECT * FROM database1.sch.table1;
    
    Copy
  2. 创建数据库 database2 和数据:

    CREATE DATABASE database2;
    CREATE SCHEMA database2.sch;
    CREATE TABLE database2.sch.table2 (id INT);
    
    Copy
  3. 创建数据库 database3 和数据:

    CREATE DATABASE database3;
    CREATE SCHEMA database3.sch;
    CREATE TABLE database3.sch.table3 (id INT);
    
    Copy
  4. 使用要在 database3 中共享的数据创建安全视图:

    CREATE SECURE VIEW database3.sch.view3 AS
      SELECT view1.id AS View1Id,
             table2.id AS table2id,
             table3.id AS table3id
      FROM database1.sch.view1 view1,
           database2.sch.table2 table2,
           database3.sch.table3 table3;
    
    Copy
  5. 创建共享并授予设置共享所需的权限。

    CREATE SHARE share1;
    GRANT USAGE ON DATABASE database3 TO SHARE share1;
    GRANT USAGE ON SCHEMA database3.sch TO SHARE share1;
    
    Copy
  6. 授予将安全视图 view3 添加到共享所需的权限。

    安全视图 view3 在其他数据库中引用的数据要求向共享授予 database1database2 的 REFERENCE_USAGE 权限:

    GRANT REFERENCE_USAGE ON DATABASE database1 TO SHARE share1;
    GRANT REFERENCE_USAGE ON DATABASE database2 TO SHARE share1;
    
    GRANT SELECT ON VIEW database3.sch.view3 TO SHARE share1;
    
    Copy

使用复制组将数据复制到另一个区域的账户,即可与其他区域的使用者共享这些数据。有关说明,请参阅 示例 3:共享多个数据库中的数据

示例 2:在另一个数据库中创建和共享安全视图

某提供商将客户数据存储在单独的数据库中,并且不希望在此类数据库中创建新对象。为了共享数据,该提供商创建了一个具有安全视图的新数据库。此安全视图引用数据库中包含客户数据的对象(架构、表、视图)。

数据库、数据库对象、共享和账户之间的关系

示例代码:

  1. 创建客户数据库 customer1_db 和数据:

    CREATE DATABASE customer1_db;
    CREATE SCHEMA customer1_db.sch;
    CREATE TABLE customer1_db.sch.table1 (id INT);
    CREATE VIEW customer1_db.sch.view1 AS SELECT * FROM customer1_db.sch.table1;
    
    Copy
  2. 创建客户数据库 customer2_db 和数据:

    CREATE DATABASE customer2_db;
    CREATE SCHEMA customer2_db.sch;
    CREATE TABLE customer2_db.sch.table2 (id INT);
    
    Copy
  3. 创建新数据库 new_db 和架构 sch

    CREATE DATABASE new_db;
    CREATE SCHEMA new_db.sch;
    
    Copy
  4. new_db 中创建安全视图,该安全视图引用 customer1_dbcustomer2_db 中的对象:

    CREATE SECURE VIEW new_db.sch.view3 AS
      SELECT view1.id AS view1Id,
             table2.id AS table2ID
      FROM customer1_db.sch.view1 view1,
           customer2_db.sch.table2 table2;
    
    Copy
  5. 创建共享并授予设置共享所需的权限:

    CREATE SHARE share1;
    
    GRANT USAGE ON DATABASE new_db TO SHARE share1;
    GRANT USAGE ON SCHEMA new_db.sch TO SHARE share1;
    
    Copy
  6. 授予将安全视图 view3 添加到共享所需的权限。

    安全视图 view3 在其他数据库中引用的数据要求向共享授予 customer1_dbcustomer2_db 的 REFERENCE_USAGE 权限:

    GRANT REFERENCE_USAGE ON DATABASE customer1_db TO SHARE share1;
    GRANT REFERENCE_USAGE ON DATABASE customer2_db TO SHARE share1;
    
    GRANT SELECT ON VIEW new_db.sch.view3 TO SHARE share1;
    
    Copy

与其他区域的使用者共享来自多个数据库的数据

您可以使用复制组,与其他区域和云平台的使用者账户共享来自多个数据库的数据。将共享和共享引用的每个数据库都包含在组中,以将数据复制到另一个区域的 Snowflake 账户。然后可以将使用者账户添加到复制的共享中。有关详细说明,请参阅 跨区域和云平台安全共享数据

语言: 中文