使用安全对象控制数据访问¶
为确保共享数据库中的敏感数据不会暴露给使用者账户中的用户,Snowflake 强烈建议 共享 安全视图 和/或 安全 UDFs,而非直接共享表。
此外,为保证最佳性能,尤其是在超大表中共享数据时,我们建议在基表上为安全对象定义 <label-clustering-keys>` 群集密钥 :ref:`。
本主题介绍在基表中为共享安全对象使用群集密钥,并提供了与使用者账户共享安全视图的详细步骤说明。此外还提供了针对数据提供商和使用者的示例脚本。
备注
共享安全对象的说明与共享表的说明基本相同,只是增加了以下对象:
包含基表的“私有”架构和包含安全对象的“公共”架构。共享的只有公共架构和安全对象。
一个“映射表”(同样位于“私有”架构中),只有在您希望与多个使用者账户共享基表中的数据,以及与特定账户共享表中的特定行时,才需要此映射表。
设置和任务示例¶
在这些示例说明中,我们假设数据提供商账户中有一个名为 mydb 的数据库,并且有两个架构,分别是 private 和 public。如果数据库和架构不存在,则应先创建它们,然后再继续操作。
第 1 步:在私有架构中创建数据和映射表¶
在 mydb.private 架构中创建以下两个表,并为其填充数据。
sensitive_data – 包含要共享的数据,以及用于按账户控制数据访问权限的 access_id 列。sharing_access – 使用 access_id 列映射共享数据和可访问数据的账户。第 2 步:在公共架构中创建安全视图¶
在 mydb.public 架构中创建以下安全视图:
paid_sensitive_data – 显示基于账户的数据。请注意,视图中不必包含基表 (sensitive_data) 中的 access_id 列。
第 3 步:验证表和安全视图¶
验证表和安全视图,以确保按账户正确筛选数据。
为允许验证要与其他账户共享的安全视图,Snowflake 提供了一个会话参数,即 SIMULATED_DATA_SHARING_CONSUMER。将此会话参数设置为您想模拟其访问权限的使用者账户名称。然后可查询视图,并查看该使用者账户中的用户将看到的结果。
脚本示例¶
以下脚本说明了如何执行上一节中介绍的所有任务:
在“私有”架构中创建两个表,并在第一个表中填充三家不同公司(Apple、Microsoft 和 IBM)的股票数据。随后在第二个账户中填充将股票数据映射到个人账户的数据:
在“公共”架构中创建安全视图。此视图使用第二个表中的映射信息,按账户筛选第一个表中的股票数据:
使用 ACCOUNTADMIN 角色创建共享。
将对象添加到共享。您可以选择通过数据库角色将这些对象的权限添加到共享(选项 1),或者 将这些对象的权限直接授予共享(选项 2):
将账户添加到共享。
脚本示例(面向使用者)¶
使用者可使用以下脚本来创建数据库(从上述脚本中创建的共享),并在所获得的数据库中查询安全视图:
通过从共享创建数据库,将共享数据库引入您的账户。
向您账户中的其他角色授予数据库权限(例如 CUSTOM_ROLE1)。根据数据使用者是使用数据库角色向共享添加对象(选项 1),还是直接向共享授予对象权限(选项 2),GRANT 语句会有所不同:
使用 CUSTOM_ROLE1 角色查询您创建的数据库中的视图。请注意,会话中必须在使用有效的仓库才能执行查询。在 USE WAREHOUSE 命令中,将 <warehouse_name> 替换为账户中一个仓库的名称。CUSTOM_ROLE1 角色必须具有仓库的 USAGE 权限: