在 Snowflake Native App 中共享数据内容¶
本主题介绍提供商如何将共享数据内容添加到 Snowflake Native App。
备注
提供商可以将 Snowflake Native App 作为受限试用列表发布到 Snowflake Marketplace。要将应用程序作为试用列表发布,请参阅 准备提供受限试用列表。
关于 Snowflake Native App 中的共享数据¶
Snowflake Native App Framework 允许提供商向应用程序添加共享数据内容。这些数据内容将在使用者安装和使用应用程序时与他们共享。要共享数据内容,提供商必须向应用程序包授予对共享数据的权限。提供商与应用程序包共享的数据内容将在该应用程序的所有已安装实例之间共享。
小心
共享数据内容未版本化,这意味着应用程序的所有版本使用相同的数据。
使用者无法直接访问共享内容。相反,提供商在应用程序包的安装脚本中创建安全视图,并授予使用者对安全视图的访问权限。有关详细信息,请参阅 允许使用者访问应用程序中的共享对象。
可以共享的数据库对象¶
Snowflake Native App Framework 允许提供商将以下数据库对象添加到应用程序包:
架构
表,包括外部表和 Apache Iceberg™ 表
视图
备注
共享数据库对象(例如表和视图)时,您还必须共享包含对象的架构。
以下限制适用于在应用程序包中共享的表和视图:
表不能有虚拟列,包括含 Java、Python 或 JavaScript 代码的策略。
视图定义或与其关联的虚拟列(如策略)不能包含对 Java、Python 或 JavaScript 的调用。
共享表不能是临时表、易变表或瞬态表。
包含外部表或 Apache Iceberg™ 表的应用程序不支持 Cross-Cloud Auto-Fulfillment。
对包含策略的共享数据内容的限制¶
策略通常引用的一些函数(例如 CURRENT_USER)在使用者账户中安装的应用程序上下文中有着不同的行为。虽然提供商定义的策略可能在提供商的账户中正确工作,但在使用者安装应用程序后,它可能无法在使用者账户中正常工作。
Snowflake 建议提供商在安装脚本中指定的代理视图上定义策略。在代理视图上定义策略,这样可确保在安装应用程序后无法更改策略的定义。在代理视图上定义策略,这样还可以确保在升级期间,运行的代码继续使用创建版本时应用的策略。
向应用程序包授予对共享内容的权限¶
要在应用程序中包含共享数据内容,提供商必须授予对要与应用程序包共享的对象的权限。当提供商将对象添加到应用程序包时,默认情况下,该对象是应用程序包的专用对象,在安装应用程序时不可见。
要对从应用程序包安装的应用程序显示对象,请使用 GRANT ...TO SHARE IN APPLICATION PACKAGE 命令,如以下示例所示:
CREATE APPLICATION PACKAGE app_package;
GRANT USAGE ON SCHEMA app_package.shared_schema
TO SHARE IN APPLICATION PACKAGE app_package;
GRANT SELECT ON TABLE app_package.shared_schema.shared_table
TO SHARE IN APPLICATION PACKAGE app_package;
在此示例中,第一个命令向应用程序包授予 shared_schema
架构的 USAGE 权限。此命令允许与使用者共享该架构。第二个命令向应用程序包授予 shared_schema
内 shared_table
表的 SELECT 权限。此命令允许使用者查询表。
使用者从应用程序包 app_package
安装应用程序后,可以访问 shared_schema
并查询 shared_table
。
备注
在将共享对象添加到应用程序包时,您还必须共享含该对象的架构。
您还可以使用类似的 SQL 命令与应用程序共享视图。
授予应用程序包外部对象的权限¶
要共享应用程序包外部存在的数据库对象,提供商必须在应用程序包中创建允许访问该对象的视图。您不能直接与安装在使用者账户中的应用程序共享应用程序包外部的对象。
例如,要共享应用程序包外部的数据库,请向应用程序包授予该数据库的 REFERENCE_USAGE 权限,如以下示例所示:
GRANT REFERENCE_USAGE ON DATABASE other_db
TO SHARE IN APPLICATION PACKAGE app_pkg;
授予外部数据库的 REFERENCE_USAGE 权限后,提供商必须在应用程序内创建一个视图,引用共享对象,如以下示例所示:
CREATE VIEW app_pkg.shared_schema.shared_view
AS SELECT c1, c2, c3, c4
FROM other_db.other_schema.other_table;
此命令在应用程序包中创建一个视图,引用应用程序包外部的数据库、表和架构。
创建视图后,您必须向应用程序授予架构和视图的权限,如以下示例所示:
GRANT USAGE ON SCHEMA app_pkg.shared_schema
TO SHARE IN APPLICATION PACKAGE app_pkg;
GRANT SELECT ON VIEW app_pkg.shared_schema.shared_view
TO SHARE IN APPLICATION PACKAGE app_pkg;
允许使用者访问应用程序中的共享对象¶
安装后,应用程序可以直接访问在安装脚本中创建的数据库对象。其中包括表、函数、过程和新的视图定义。
但是,默认情况下,与应用程序包共享的数据库对象对使用者来说不可见。为允许使用者查看和访问数据内容,应用程序包必须创建安全视图并授予适当的权限。
这种方法具有以下优点:
在安装脚本中创建视图,这样可确保直接对共享对象(例如新列)所做的更改对安装脚本所安装的 Snowflake Native App 版本不可见。要允许访问对象的更改,提供商必须为应用程序创建新版本或补丁。
在版本化架构中创建视图,这样可确保 Snowflake Native App 的每个版本仅包含该版本的视图的定义。这对于升级场景很重要。
要向使用者公开共享对象,安装脚本必须包含用于执行以下操作的命令:
在应用程序包中的版本化架构内安装视图。
使用应用程序角色向使用者授予对这些视图的访问权限。
以下示例介绍如何使用应用程序角色,授予对应用程序包的安装脚本中共享对象的访问权限:
CREATE APPLICATION ROLE app_user;
CREATE OR ALTER VERSIONED SCHEMA inst_schema;
GRANT USAGE ON SCHEMA inst_schema
TO APPLICATION ROLE app_user;
CREATE VIEW IF NOT EXISTS inst_schema.shared_view
AS SELECT c1, c2, c3, c4
FROM shared_schema.shared_table;
GRANT SELECT ON VIEW inst_schema.shared_view
TO APPLICATION ROLE app_user;
在此示例中,视图访问 shared_schema.shared_view
中的内容并将其与应用程序包共享。
备注
如果提供商试图定义一个视图,直接访问共享数据内容(如应用程序包外部的数据库对象),Snowflake 将返回错误。
在代理视图上定义策略¶
Snowflake 建议在安装脚本中创建代理视图,并定义保护它们的策略。定义策略以保护代理视图可确保在安装 Snowflake Native App 之后无法更改策略定义。在代理视图上定义策略还可确保在升级期间,运行的代码继续使用创建升级版本时应用的策略。
支持外部表和 Apache Iceberg™ 表¶
Snowflake Native App Framework 允许提供商与使用者共享 外部表 和 Apache Iceberg™ 表。共享这些类型表的方法与普通表类似,即提供商向安装脚本添加视图并将这些视图的权限授予应用程序角色。
小心
如果后备对象存储与应用程序列表不在同一区域,则外部表和 Apache Iceberg™ 表可能会给提供商或使用者带来额外的出口或入口费用。
共享外部表或 Iceberg 表时,以下限制和要求适用:
外部表和 Iceberg 表以及访问它们的视图对应用程序来说都是只读的。
共享外部表或 Iceberg 表的 应用程序不支持 Cross-Cloud Auto-Fulfillment。
用户必须允许应用程序使用提供商账户中的外部表或 Iceberg 表,然后应用程序才能使用该表。
不支持 Cross-Cloud Auto-Fulfillment¶
对于拥有启用 Cross-Cloud Auto-Fulfillment 的列表的应用程序,不支持外部表和 Iceberg 表。
备注
要将使用外部表或 Iceberg 表的应用程序发布到多个 Snowflake 区域,提供商必须将列表发布到每个区域。
如果提供商为包含外部表或 Iceberg 表的应用程序创建列表,则在 Snowight 中将禁用配置 Cross-Cloud Auto-Fulfillment 的功能。
如果提供商尝试向应用程序包添加版本或补丁,而该应用程序包是已配置 Cross-Cloud Auto-Fulfillment 的列表的数据产品,Snowflake 会返回错误。
向应用程序添加外部表或 Iceberg 表¶
除了向应用程序包添加外部表或 Iceberg 表外,提供商还必须执行以下操作:
在清单文件中添加一个条目以启用外部表和 Iceberg 表。有关更多信息,请参阅 将外部表和 Iceberg 表的条目添加到清单中。
提供商可以使用 Python Permission SDK 来允许使用者使用 Snowsight 启用应用程序访问外部表或 Iceberg 表。或者,提供商可以要求使用者手动启用外部表或 Iceberg 表。有关更多信息,请参阅 请求访问外部表和 Iceberg 表的权限 。
撤消对共享对象的权限或删除共享对象时务必谨慎¶
撤消应用程序包中共享对象的权限或删除共享对象时,务必谨慎操作。如果已安装的 Snowflake Native App 版本仍需要访问这些对象,则 Snowflake Native App 可能会变得不稳定或失败。
授予动态表的 MONITOR 或 OPERATE 权限时的注意事项¶
提供商在向应用程序角色授予动态表的 MONITOR 或 OPERATE 权限时应当小心。这些权限允许使用者查看动态表的元数据,这可能会暴露应用程序的实现细节。有关使用者可以执行哪些操作的更多信息,请参阅 查看动态表元数据的权限。
撤消和删除共享对象的权限¶
从应用程序包中撤消共享对象的权限或删除共享对象时,请务必谨慎。如果 Snowflake Native App 的已安装版本仍需要访问这些对象,则 Snowflake Native App 可能会变得不稳定或失败。