将共享数据内容添加到应用程序包

本主题介绍如何将共享数据内容添加到应用程序包。

如果您计划将 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;
Copy

在此示例中,第一个命令向应用程序包授予 shared_schema 架构的 USAGE 权限,允许与使用者共享该架构。第二个命令向应用程序包授予 shared_schemashared_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;
Copy

在授予外部数据库的 REFERENCE_USAGE 后,您必须在应用程序包内创建一个视图,引用共享对象,如以下示例所示:

CREATE VIEW app_pkg.shared_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM other_db.other_schema.other_table;
Copy

此命令在应用程序包中创建一个视图,引用应用程序包外部的数据库、表和架构。

创建视图后,您必须向应用程序授予架构和视图的权限,如以下示例所示:

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;
Copy

允许访问应用程序包中的共享对象

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;
Copy

此视图访问 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;
Copy

撤消和删除共享对象的权限

从应用程序包中撤消共享对象的权限或删除共享对象时,请务必谨慎。如果 Snowflake Native App 的已安装版本仍需要访问这些对象,则 Snowflake Native App 可能会变得不稳定或失败。

在代理视图上定义策略

Snowflake 建议在安装脚本中创建代理视图,并定义保护它们的策略。定义策略以保护代理视图可确保在安装 Snowflake Native App 之后无法更改策略定义。在代理视图上定义策略还可确保在升级期间,运行的代码继续使用创建升级版本时应用的策略。

语言: 中文