Snowflake:有没有办法在不使用的情况下创建仓库?

Snowflake: Is there a way to create a warehouse without using it?

我们正在使用 DBT 到 运行 自动化 CI/CD 来配置我们在 Snowflake 中的所有资源,包括数据库、模式、用户、角色、仓库等。

当我们创建仓库时出现问题 -- 活动仓库会自动切换到新创建的仓库。无论仓库是否已经存在,都会发生这种情况(我们正在使用 CREATE WAREHOUSE IF NOT EXISTS 命令)。

这基本上无缘无故地在我们所有的仓库上 resumes/turns(即使我们正在使用 INITIALLY_SUSPENDED = TRUE),因为雪花然后使用该仓库来执行后续查询。然后我们的 CI/CD 在错误的仓库上继续(以最后执行的仓库为准)。我们有一个专门用于 CI/CD 的仓库,我们希望执行保留在那个仓库上(这样我们就可以监控成本)。

我们知道这是指定的默认行为 in the documentation,但是 有什么方法可以不使用它来创建仓库吗?

我希望 CREATE WAREHOUSE 命令有一个类似 USE_WAREHOUSE = TRUE|FALSE 的参数。

作为解决方法,我们正在探索在仓库已经存在的情况下完全跳过 CREATE WAREHOUSE 命令的方法,但这并不能解决确实需要创建的仓库的问题。

否则,我们可能只是在每个CREATE WAREHOUSE之后添加一个USE WAREHOUSE命令,以便return到原来的CI/CD仓库。

Snowflake docs描述了一个INITIALLY_SUSPENDED属性,默认为FALSE,指定仓库是否应该在Suspended状态下创建。

我认为您应该在脚本中设置 属性 TRUE

想法是将当前仓库存储在一个变量中并恢复它:

SET warehouse_name = (SELECT CURRENT_WAREHOUSE());

CREATE WAREHOUSE TEST WAREHOUSE_SIZE=XSMALL, INITIALLY_SUSPENDED=TRUE;

USE WAREHOUSE IDENTIFIER($warehouse_name);

或者用存储过程包装它(简化版本 - 没有错误处理,只提供仓库名称作为参数):

CREATE OR REPLACE PROCEDURE create_warehouse(CURRENT_WAREHOUSE_NAME STRING
                                            ,WAREHOUSE_NAME STRING)
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
 var rs = snowflake.execute({sqlText: `CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER(?) WAREHOUSE_SIZE=MEDIUM, INITIALLY_SUSPENDED=TRUE`, binds:[WAREHOUSE_NAME]});   
 // restore original warehouse, USE WAREHOUSE cannot be used inside SP
 var rs2 = snowflake.execute({sqlText:`CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER(?)`, binds:[CURRENT_WAREHOUSE_NAME]});   
 return 'Done.';
$$;

CALL create_warehouse(CURRENT_WAREHOUSE(), 'TEST');