Stored procedures 无法在雪花存储过程中创建临时阶段对象

Stored procedures 无法在雪花存储过程中创建临时阶段对象,stored-procedures,snowflake-cloud-data-platform,Stored Procedures,Snowflake Cloud Data Platform,下面的存储过程执行返回错误消息“存储过程执行错误:不支持的语句类型“temporary STAGE”。从存储过程定义中删除关键字“temporary”可以解决此问题,并且可以无误地执行 怎么可能呢?根据其文档,Snowflake支持创建临时阶段。 除此之外,一旦在存储过程外部执行相同的SQL语句,它就可以正常工作 CREATE OR REPLACE PROCEDURE "TEST_TEMP_STAGE"() RETURNS FLOAT LANGUAGE JAVASCRIPT

下面的存储过程执行返回错误消息“存储过程执行错误:不支持的语句类型“temporary STAGE”。从存储过程定义中删除关键字“temporary”可以解决此问题,并且可以无误地执行

怎么可能呢?根据其文档,Snowflake支持创建临时阶段。 除此之外,一旦在存储过程外部执行相同的SQL语句,它就可以正常工作

CREATE OR REPLACE PROCEDURE "TEST_TEMP_STAGE"()
RETURNS FLOAT
LANGUAGE JAVASCRIPT
STRICT
EXECUTE AS OWNER
AS $$
    var req='create  temporary stage my_temp_stage;'
    snowflake.createStatement( { sqlText: req } ).execute();
    return 0;
$$
CREATE OR REPLACE PROCEDURE "TEST_TEMP_STAGE"()
RETURNS FLOAT
LANGUAGE JAVASCRIPT
STRICT
EXECUTE AS CALLER
AS $$
    var req='create temporary stage my_temp_stage;'
    snowflake.createStatement( { sqlText: req } ).execute();
    return 0;
$$
;

call TEST_TEMP_STAGE();

您应该将过程定义为“作为调用方执行”,以便能够在存储过程中创建临时阶段

CREATE OR REPLACE PROCEDURE "TEST_TEMP_STAGE"()
RETURNS FLOAT
LANGUAGE JAVASCRIPT
STRICT
EXECUTE AS OWNER
AS $$
    var req='create  temporary stage my_temp_stage;'
    snowflake.createStatement( { sqlText: req } ).execute();
    return 0;
$$
CREATE OR REPLACE PROCEDURE "TEST_TEMP_STAGE"()
RETURNS FLOAT
LANGUAGE JAVASCRIPT
STRICT
EXECUTE AS CALLER
AS $$
    var req='create temporary stage my_temp_stage;'
    snowflake.createStatement( { sqlText: req } ).execute();
    return 0;
$$
;

call TEST_TEMP_STAGE();

非常感谢,现在可以用了。但是你知道为什么你应该作为调用者执行它吗?在存储过程中创建临时表不需要以调用方身份运行存储过程。那么,为什么阶段对象会出现这种情况呢?这是一个与安全相关的限制。它并没有很好的文档记录,但简而言之,作为所有者执行的雪花存储过程不应该让您处理任何与用户会话相关的事情。临时表格似乎遗漏了一点——IMO。