为什么 Snowflake LAST_QUERY_ID returns NULL?
Why does Snowflake LAST_QUERY_ID returns NULL?
给定以下程序
CREATE OR REPLACE PROCEDURE z()
RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
AS
$$
const what = snowflake.execute( {sqlText: "select as value from values (1), (2), (3);"} )
return 'Hi There';
$$
;
如果我 运行 下面的 2 个陈述
CALL z();
select * from table(result_scan(-2));
我得到一个错误 "SQL Error [709] [02000]: Statement 01912a0c-01c1-0574-0000-4de50036137e not found"
如果我 运行 下面的 2 个陈述
CALL z();
SELECT LAST_QUERY_ID(), LAST_QUERY_ID(-1), LAST_QUERY_ID(-2);
它告诉我 LAST_QUERY_ID() 和 LAST_QUERY_ID(-1) 是相同的,而且 LAST_QUERY_ID(-2) returns NULL...
知道为什么它是 returns NULL 而不是允许我检索查询结果的东西 "select as value from values (1), (2), (3);"
吗?
谢谢
It shows me that LAST_QUERY_ID() and LAST_QUERY_ID(-1) are identical but also that LAST_QUERY_ID(-2) returns NULL
LAST_QUERY_ID() 和 LAST_QUERY_ID(-1) 应该看到相同的查询 ID,因为它们相同(LAST_QUERY_ID 的默认值为“-1” ").
另一方面,LAST_QUERY_ID(-2) 不应 returns NULL,"select * from table(result_scan(-2))" 查询不应失败。
如果您定义具有 CALLER 权限的函数,您可以看到 LAST_QUERY_ID(-2) returns 查询 ID 和 "select * from table(result_scan(-2))" 查询有效:
CREATE OR REPLACE PROCEDURE z()
RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
const what = snowflake.execute( {sqlText: "select as value from values (1), (2), (3);"} )
return 'Hi There';
$$
;
作为解决方法,您可以使用历史记录 window 检查最新的查询。您应该能够在历史选项卡中看到您的查询 (01912a0c-01c1-0574-0000-4de50036137e)。您会注意到这些查询是由同一用户在同一会话中执行的。因此,不应限制列出这些查询。
我能够在我的测试环境中重现该问题,我会将该问题报告给开发团队。如果您可以访问 Snowflake 支持,最好提交有关此问题的支持案例,这样您就可以轻松地遵循该过程。
郑重声明,这是我从 Snowflake Support 得到的答案
这是预期的行为,因为有意设置了安全限制(来自 SP 内部的查询无法访问外部查询,反之亦然)。
我们设置了一个全面的限制,即此类 SP 的内部和外部世界应该分开。无法从一个访问另一个查询的 "result"。
是的,如果我们声明具有调用者权限的过程,那么在这种情况下一切(LAST_QUERY_ID 和 RESULT_SCAN)都可以正常工作。
当 "owner's right" SP 的所有者和调用者相同时,正在讨论实现此用例,所有这些限制都应取消。但我们无法确定时间线,我可以 link 这个案例与那个讨论,以便我们有这个记录。
我觉得不错 :-)
给定以下程序
CREATE OR REPLACE PROCEDURE z()
RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
AS
$$
const what = snowflake.execute( {sqlText: "select as value from values (1), (2), (3);"} )
return 'Hi There';
$$
;
如果我 运行 下面的 2 个陈述
CALL z();
select * from table(result_scan(-2));
我得到一个错误 "SQL Error [709] [02000]: Statement 01912a0c-01c1-0574-0000-4de50036137e not found"
如果我 运行 下面的 2 个陈述
CALL z();
SELECT LAST_QUERY_ID(), LAST_QUERY_ID(-1), LAST_QUERY_ID(-2);
它告诉我 LAST_QUERY_ID() 和 LAST_QUERY_ID(-1) 是相同的,而且 LAST_QUERY_ID(-2) returns NULL...
知道为什么它是 returns NULL 而不是允许我检索查询结果的东西 "select as value from values (1), (2), (3);"
吗?
谢谢
It shows me that LAST_QUERY_ID() and LAST_QUERY_ID(-1) are identical but also that LAST_QUERY_ID(-2) returns NULL
LAST_QUERY_ID() 和 LAST_QUERY_ID(-1) 应该看到相同的查询 ID,因为它们相同(LAST_QUERY_ID 的默认值为“-1” ").
另一方面,LAST_QUERY_ID(-2) 不应 returns NULL,"select * from table(result_scan(-2))" 查询不应失败。
如果您定义具有 CALLER 权限的函数,您可以看到 LAST_QUERY_ID(-2) returns 查询 ID 和 "select * from table(result_scan(-2))" 查询有效:
CREATE OR REPLACE PROCEDURE z()
RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
const what = snowflake.execute( {sqlText: "select as value from values (1), (2), (3);"} )
return 'Hi There';
$$
;
作为解决方法,您可以使用历史记录 window 检查最新的查询。您应该能够在历史选项卡中看到您的查询 (01912a0c-01c1-0574-0000-4de50036137e)。您会注意到这些查询是由同一用户在同一会话中执行的。因此,不应限制列出这些查询。
我能够在我的测试环境中重现该问题,我会将该问题报告给开发团队。如果您可以访问 Snowflake 支持,最好提交有关此问题的支持案例,这样您就可以轻松地遵循该过程。
郑重声明,这是我从 Snowflake Support 得到的答案
这是预期的行为,因为有意设置了安全限制(来自 SP 内部的查询无法访问外部查询,反之亦然)。 我们设置了一个全面的限制,即此类 SP 的内部和外部世界应该分开。无法从一个访问另一个查询的 "result"。 是的,如果我们声明具有调用者权限的过程,那么在这种情况下一切(LAST_QUERY_ID 和 RESULT_SCAN)都可以正常工作。 当 "owner's right" SP 的所有者和调用者相同时,正在讨论实现此用例,所有这些限制都应取消。但我们无法确定时间线,我可以 link 这个案例与那个讨论,以便我们有这个记录。
我觉得不错 :-)