Snowflake:有没有不使用就可以创建仓库的方法?
Posted
技术标签:
【中文标题】Snowflake:有没有不使用就可以创建仓库的方法?【英文标题】:Snowflake: Is there a way to create a warehouse without using it? 【发布时间】:2021-09-02 15:02:03 【问题描述】:我们正在使用 DBT 运行自动化 CI/CD 以在 Snowflake 中配置我们的所有资源,包括数据库、模式、用户、角色、仓库等。
我们在创建仓库时会出现问题 - 活动仓库会自动切换到新创建的仓库。无论仓库是否已经存在,都会发生这种情况(我们使用CREATE WAREHOUSE IF NOT EXISTS
命令)。
这基本上会无缘无故地恢复/打开我们所有的仓库(即使我们使用的是INITIALLY_SUSPENDED = TRUE
),因为雪花随后会使用该仓库来执行后续查询。然后我们的 CI/CD 继续在错误的仓库中(无论哪个是最后一个执行的)。我们有一个专门的 CI/CD 仓库,我们希望继续在那个仓库上执行(这样我们就可以监控成本)。
我们知道这是in the documentation 指定的默认行为,但是有没有什么方法可以不使用它来创建仓库?
我希望CREATE WAREHOUSE
命令有一个像USE_WAREHOUSE = TRUE|FALSE
这样的参数。
作为一种解决方法,如果仓库已经存在,我们正在探索完全跳过 CREATE WAREHOUSE
命令的方法,但这并不能解决确实需要创建仓库的问题。
否则,我们可能只是在每个 CREATE WAREHOUSE
之后添加一个 USE WAREHOUSE
命令,以便返回原始 CI/CD 仓库。
【问题讨论】:
【参考方案1】:想法是将当前仓库存储在一个变量中并恢复它:
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 仓库的名称(因此无需将其存储在 SQL 变量中)。【参考方案2】:Snowflake docs 描述了一个INITIALLY_SUSPENDED
属性,默认为 FALSE,它指定仓库最初是否应在 Suspended 状态下创建。
我认为您应该在脚本中设置该属性 TRUE
。
【讨论】:
另外,还有一点:and continues our CI/CD on the wrong warehouse (whichever one was the last one to execute)
。 Snowflake 会将会话上下文设置为最近创建的数据库、模式和仓库。在您的 CI/CD 脚本中,您可以在创建新脚本后运行 use warehouse original_warehouse
,以便将其设置回您想要的脚本。
@Schepo:我们已经在这样做了。那不是问题。问题是 Snowflake 会自动将仓库 USE
作为当前仓库,并自动恢复它以执行后续查询——即使它是使用 INITIALLY_SUSPENDED = TRUE
创建的。以上是关于Snowflake:有没有不使用就可以创建仓库的方法?的主要内容,如果未能解决你的问题,请参考以下文章