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。