Snowflake Serverless Task执行报错:无活动仓库问题咨询
问题描述
在Snowflake中创建Serverless Task时遇到报错,使用托管仓库(USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE)的任务执行失败,报错信息如下:
Uncaught exception of type 'STATEMENT_ERROR' on line 3 at position 0 : No active warehouse selected in the current session. Select an active warehouse with the 'use warehouse' command.
失败的Task创建语句:
CREATE OR REPLACE TABLE TASK_TABLE_2(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP); CREATE OR REPLACE TABLE TASK_TABLE_3(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP); create or replace task DEMO_TASK_2 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL' SCHEDULE ='1 minutes' as EXECUTE IMMEDIATE $$ BEGIN insert into TASK_TABLE_2 values (2_1,SYSDATE()); insert into TASK_TABLE_2 values (2_2,SYSDATE()); insert into TASK_TABLE_3 values (3_1,SYSDATE()); END $$ ;
但当显式指定WAREHOUSE参数时,相同逻辑的Task可以成功执行:
CREATE OR REPLACE TABLE TASK_TABLE(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP); CREATE OR REPLACE TABLE TASK_TABLE_1(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP) ; create or replace task DEMO_TASK WAREHOUSE = COMPUTE_WH SCHEDULE ='1 minutes' as EXECUTE IMMEDIATE $$ BEGIN insert into TASK_TABLE values (0_1,SYSDATE()); insert into TASK_TABLE values (0_2,SYSDATE()); insert into TASK_TABLE_1 values (1_1,SYSDATE()); END $$ ;
原因分析
- Serverless Task会话的仓库特性:使用
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE创建的Serverless Task,其执行会话默认不会将托管仓库设置为会话的激活仓库(当前会话的WAREHOUSE上下文为NULL)。 - EXECUTE IMMEDIATE匿名块的执行逻辑:匿名PL/SQL块在执行时会继承当前会话的仓库上下文,块内的DML操作需要依赖激活的仓库才能执行。而显式指定
WAREHOUSE参数的Task,执行会话会自动激活指定的仓库,因此块内操作可以正常运行。
解决方法
提供两种可行的解决方案:
方案1:移除EXECUTE IMMEDIATE包裹,直接执行DML语句
Serverless Task的AS子句可以直接运行DML语句,无需通过EXECUTE IMMEDIATE包裹匿名块,这样会自动使用托管仓库执行操作:
CREATE OR REPLACE TABLE TASK_TABLE_2(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP); CREATE OR REPLACE TABLE TASK_TABLE_3(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP); CREATE OR REPLACE TASK DEMO_TASK_2 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL' SCHEDULE = '1 minutes' AS INSERT INTO TASK_TABLE_2 VALUES ('2_1', SYSDATE()), ('2_2', SYSDATE()); INSERT INTO TASK_TABLE_3 VALUES ('3_1', SYSDATE());
注意:原代码中
2_1这类值未加引号,会被识别为标识符而非字符串,需要添加单引号修正语法错误。
方案2:在匿名块内显式指定使用托管仓库
如果必须使用匿名块,可以在块内添加USE WAREHOUSE语句,关联Serverless Task的托管仓库:
CREATE OR REPLACE TABLE TASK_TABLE_2(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP); CREATE OR REPLACE TABLE TASK_TABLE_3(TBL_NAME VARCHAR, LAST_INSERTED_DATE TIMESTAMP); CREATE OR REPLACE TASK DEMO_TASK_2 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL' SCHEDULE = '1 minutes' AS EXECUTE IMMEDIATE $$ BEGIN USE WAREHOUSE (SELECT "WAREHOUSE_NAME" FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME => 'DEMO_TASK_2')) LIMIT 1); INSERT INTO TASK_TABLE_2 VALUES ('2_1', SYSDATE()); INSERT INTO TASK_TABLE_2 VALUES ('2_2', SYSDATE()); INSERT INTO TASK_TABLE_3 VALUES ('3_1', SYSDATE()); END $$;
更推荐方案1,因为更简洁且符合Serverless Task的设计逻辑。
内容的提问来源于stack exchange,提问作者Alexander M
相关产品推荐
相关产品推荐

