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');
我们正在使用 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');