Python UDF 限制

本主题介绍了用 Python 编写的处理程序的限制。

本主题内容:

一般限制

  • 虽然 Python 函数可以使用标准 Python 包中的模块和函数,但 Snowflake 安全约束会禁用某些功能,例如写入文件。有关详细信息,请参阅标题为 遵循良好的安全实践 的部分。

  • 通过暂存区引入的所有 UDFs 和模块必须独立于平台,并且不能包含本机扩展。

    • 避免使用假设特定 CPU 架构(例如 x86)的代码。

    • 避免使用假定特定操作系统的代码。

  • Python UDFs 不可共享。使用 Python UDFs 的数据库对象也不可共享。例如,不能执行以下操作:

    • 直接共享 Python UDF。

    • 共享调用 Python UDF 的视图。

    • 共享调用 Python UDF 的函数。

    • 共享具有掩码或行访问策略的表,该策略调用 Python UDF。

  • 授予对 Python UDF 的 USAGE 权限可能会允许收件人查看 UDF 导入的文件内容。如果将对 Python UDF 的 USAGE 权限授予某个角色,并且该角色执行调用该 Python UDF 的语句,则同一语句中的任何 Python UDF 都可以读取授予 USAGE 权限的 Python UDF 导入的任何文件的内容。

  • 支持对内联 Python UDFs 进行数据库 复制。但是,如果 Python UDF 依赖于暂存区中的文件(即使用 IMPORTS 子句创建的函数),复制将被阻止。此限制可能会在未来版本中被移除。

  • Snowflake 使用 Python zipimport 模块从暂存区导入 Python 代码。因此,任何 zipimport 限制也将存在于 UDFs 中。有关 zipimport 的更多信息,请参阅 zipimport 参考 (https://docs.python.org/3/library/zipimport.html)。

克隆的限制

克隆包含 Python UDF 的数据库或架构时,可以克隆 Python UDF。要克隆,Python UDF 必须满足以下条件:

  • 如果 Python UDF 引用了一个暂存区,则该暂存区必须在要克隆的架构(或数据库):emph:之外

    可以通过以下方式将 Python UDF 及其引用的暂存区保存在单独的架构(和/或单独的数据库)中:

    • 只要 Python UDF 引用暂存区,请使用与 Python UDF 的架构或数据库不同的限定暂存区名称(例如“my_db.my_schema.my_stage()”)。如果克隆操作克隆数据库,则暂存区引用应包括数据库和架构。如果克隆操作克隆架构,则暂存区引用应包括该架构(以及可选的数据库)。

    • 使用非限定暂存区名称(隐式使用当前会话的活动数据库和架构)创建引用的暂存区,并使用与会话的当前数据库和架构不匹配的限定名称创建 Python UDF。

    • 使用用户暂存区作为引用暂存区(用户暂存区与任何数据库暂存区或架构暂存区是分开的)。

如果架构或数据库中的一个或多个 Python UDFs 不满足所需条件,仍可以克隆架构或数据库,但不符合要求的 Python UDFs 将从克隆中忽略,并且不会显示任何错误或警告消息。

每个克隆的 Python UDF 都具有与原始版本相同的定义。该定义包括对暂存区的任何引用。Python UDF 中的暂存区引用必须是完全限定的,因此是绝对的,而不是相对于要克隆的架构或数据库。因为原始版本和克隆版本都指向相同的暂存区和文件:

  • 弃用该暂存区或从暂存区中移除所需文件会禁用原始和克隆的 UDF。

  • 更改暂存区或暂存区中的文件会影响原始和克隆的 UDF。

语言: 中文