雪花 UDF 调用“显示共享”功能

Posted

技术标签:

【中文标题】雪花 UDF 调用“显示共享”功能【英文标题】:Snowflake UDF calling "Show Shares" function 【发布时间】:2020-01-09 16:16:45 【问题描述】:

是否可以在 Snowflake 的 FUNCTION 或 PROCEDURE 中发出“显示共享”函数调用?由于信息模式中没有元数据对象来查询有关共享的信息,因此我们正在寻找一种方法来创建 UDF 以获取此元数据并根据结果采取行动。

尝试执行以下代码时:

CREATE OR REPLACE PROCEDURE get_share_metadata()
RETURNS VARIANT
LANGUAGE javascript
AS
$$
    var x=snowflake.execute(  sqlText: "SHOW SHARES"  );
$$
;
call get_share_metadata();

返回以下错误: 存储过程 GET_SHARE_METADATA 中的执行错误:存储过程执行错误:不支持的语句类型“SHOW SHARE”。在 Snowflake.execute,第 2 行位置 20

【问题讨论】:

【参考方案1】:

如果存储过程设置为 EXECUTE AS CALLER,您可以在存储过程中执行SHOW .... 命令

当作为调用者执行时,执行过程的角色必须具有在过程中执行命令的权限。

示例:

SHOW SHARES 只能由 ACCOUNTADMIN 角色访问(从技术上讲,任何角色都可以成功运行命令,但结果仅限于 accountadmin)。 SHOW USERS 只能使用对该帐户具有 MANAGE GRANTS 权限的任何角色成功执行。

文档:

https://docs.snowflake.net/manuals/sql-reference/stored-procedures-usage.html#label-owners-rights-stored-procedures

【讨论】:

【参考方案2】:

我不确定函数与存储过程的区别,但根据您要执行的操作,您是否考虑过仅使用 RESULT_SCAN?

SHOW SHARES;
SELECT * FROM TABLE(RESULT_SCAN(last_query_id()));

【讨论】:

这将在雪花 GUI 中工作,但命令“SHOW SHARES”在存储过程(FUNCTION 或 UDF)的上下文中无效。 它适用于很多事情,但您的用例尚未在您的帖子中详细说明。您需要将它放在存储过程或函数中的原因是什么? 我们正在构建一个 CI/CD 管道,作为验证步骤的一部分,我们验证操作是否按预期完成。 CI/CD 管道需要有一个返回成功或失败的语句。多个语句一起运行的概念需要封装在一个过程中。 “last_query_id”的概念并不能保证顺序。 如果 SHARE 信息在信息架构元数据中可用,那就太好了。 根据您在 CI/CD 管道工具中使用的连接器类型,您可以执行 SHOW SHARES 命令,捕获该语句的 query_id,然后使用 query_id 执行 result_scan()陈述。我以前在应用程序中这样做过。我意识到如果它在信息模式中可用会更容易。

以上是关于雪花 UDF 调用“显示共享”功能的主要内容,如果未能解决你的问题,请参考以下文章

雪花 UDF 和数据加密

需要从 JAVA UDF 连接雪花表

雪花中的 UDF JavaScript 实现

雪花中的 JavaScript UDF

有没有啥方法可以在雪花中使用 UDF 而不是扁平化?

JavaScript 中的雪花 UDF 未按预期计算