将共享数据内容添加到应用程序包¶
本主题介绍如何将共享数据内容添加到应用程序包。
如果您计划将 Snowflake Native App 以有限试用列表形式发布到 Snowflake Marketplace,并且希望限制这些试用使用者可使用的应用程序功能,请参阅 准备提供受限试用列表。
关于在应用程序包中共享数据内容¶
Snowflake Native App Framework 允许您将共享数据内容添加到应用程序包。此数据内容与使用 Snowflake Native App 的使用者共享。您在应用程序包中共享的数据内容在 Snowflake Native App 的所有已安装实例之间共享。
共享数据内容未版本化,这意味着 Snowflake Native App 的所有版本使用相同的数据。这与版本化的应用程序逻辑不同。
使用者无法直接访问共享内容。相反,提供商在应用程序包的安装脚本中创建安全视图,并授予使用者对安全视图的访问权限。有关详细信息,请参阅 允许使用者访问共享对象。
可与应用程序包共享的数据库对象¶
Snowflake Native App Framework 允许提供商将以下数据库对象添加到应用程序包:
架构
表
视图
备注
共享数据库对象(例如表和视图)时,您还必须共享包含对象的架构。
以下限制适用于在应用程序包中共享的表和视图:
表不能有虚拟列,包括含 Java、Python 或 JavaScript 代码的策略。
视图定义或与其关联的虚拟列(如策略)不能包含对 Java、Python 或 JavaScript 的调用。
共享表不能是临时表、易变表或瞬态表。
不支持外部表。
对包含策略的共享数据内容的限制¶
提供商无法共享包含策略(包括掩码、行访问权限和其他策略类型)的表和视图。之所以需要此限制,是因为在提供商端添加或更改策略可能会立即中断正在运行的 Snowflake Native App 实例。
此外,策略通常引用的一些函数(例如 CURRENT_USER)在使用者账户中创建的应用程序对象的上下文中有着不同的行为。虽然提供商定义的策略在提供商的账户中可能正常发挥作用,但在使用者安装 Snowflake Native App 时,它有可能无法正常工作。
Snowflake 建议您在安装脚本中指定的代理视图上定义策略。在代理视图上定义策略,这样可确保在安装 Snowflake Native App 后无法更改策略的定义。在代理视图上定义策略,这样还可以确保在升级期间,运行的代码继续使用创建版本时应用的策略。
在应用程序包中共享数据内容¶
要在应用程序包中包含数据内容,您必须授予要与应用程序包共享的对象的权限。将对象添加到应用程序包时,默认情况下,该对象是应用程序包的专用对象,在安装 Snowflake Native App 时不可见。
要对从应用程序包安装的 Snowflake Native App 显示对象,请使用 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
安装 Snowflake Native App 后,可以访问 shared_schema
并查询 shared_table
。
备注
在将共享对象添加到应用程序包时,您还必须共享含该对象的架构。
您还可以使用类似的 SQL 命令与应用程序共享视图。
撤消对共享对象的权限或删除共享对象时务必谨慎¶
撤消应用程序包中共享对象的权限或删除共享对象时,务必谨慎操作。如果已安装的 Snowflake Native App 版本仍需要访问这些对象,则 Snowflake Native App 可能会变得不稳定或失败。
引用应用程序包外部存在的对象¶
要共享应用程序包外部存在的数据库对象,您必须在应用程序包内创建视图以访问该对象。您不能直接共享应用程序包外部的对象。
在共享另一个数据库中的对象之前,请向应用程序包中的共享授予该数据库的 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 VIEW IF NOT EXISTS inst_schema.shared_view
AS SELECT c1, c2, c3, c4
FROM shared_schema.shared_view;
此视图访问 shared_schema.shared_view
中与应用程序包共享的内容,如前面部分中的示例所示。
备注
如果您试图定义一个视图,直接访问共享数据内容(如应用程序包外部的数据库对象),Snowflake 将返回错误。
允许使用者访问共享对象¶
默认情况下,与应用程序包共享的数据库对象对使用者来说不可见。为允许使用者查看和访问数据内容,应用程序包必须创建安全视图并授予适当的权限。
这种方法具有以下优点:
在安装脚本中创建视图,这样可确保直接对共享对象(例如新列)所做的更改对安装脚本所安装的 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;
撤消和删除共享对象的权限¶
从应用程序包中撤消共享对象的权限或删除共享对象时,请务必谨慎。如果 Snowflake Native App 的已安装版本仍需要访问这些对象,则 Snowflake Native App 可能会变得不稳定或失败。
在代理视图上定义策略¶
Snowflake 建议在安装脚本中创建代理视图,并定义保护它们的策略。定义策略以保护代理视图可确保在安装 Snowflake Native App 之后无法更改策略定义。在代理视图上定义策略还可确保在升级期间,运行的代码继续使用创建升级版本时应用的策略。