在存储过程中创建 Snowflake 仓库会更改当前仓库

Posted

技术标签:

【中文标题】在存储过程中创建 Snowflake 仓库会更改当前仓库【英文标题】:Creating a Snowflake warehouse in a stored procedure changes the current warehouse 【发布时间】:2020-01-18 19:25:27 【问题描述】:

我正在尝试编写一个创建用户、角色和warhouse 的程序。此过程由具有 ACCOUNTADMIN 角色的高权限用户执行

USE ACCOUNT_ADMIN;
USE WAREHOUSE PROVISIONER;

CREATE or replace PROCEDURE TEST()
  RETURNS VARCHAR
  LANGUAGE javascript
  AS
  $$
    snowflake.execute( sqlText: "CREATE OR REPLACE WAREHOUSE test;");
    return "";
  $$
;

现在如果我查询当前仓库:

SELECT CURRENT_WAREHOUSE();

我收到PROVISIONER

如果我现在调用该过程

CALL TEST();

仓库变了

SELECT CURRENT_WAREHOUSE();

现在返回TEST

这是正常行为吗?这是一个问题,因为仓库是在过程之外更改的,我不能在过程中使用“USE WAREHOUSE”语句。

是否有另一种方法可以在不更改当前仓库的情况下从过程创建 WAREHOUSE?

【问题讨论】:

【参考方案1】:

是的,这是意料之中的。有关背景信息,请参阅the docs。

解决此问题的一种方法是在存储过程开始时获取当前仓库,并在存储过程结束时再次将其设置为当前仓库。

【讨论】:

在我的测试中,我直接创建仓库时也会出现这种情况,没有过程。 是的,创建仓库和数据库/模式也总是将它们设置为当前的。 很高兴知道,但我可以看到它没有记录在案。不要分裂头发。 感谢这个问题是存储过程中不允许使用“USE仓库”,所以我无法将当前仓库改回原来的样子。

以上是关于在存储过程中创建 Snowflake 仓库会更改当前仓库的主要内容,如果未能解决你的问题,请参考以下文章

在 Snowflake UI 中创建环境变量文件

如何更改 Snowflake 存储过程中的会话参数

试图在 Mysql 中创建存储过程的语法错误?

如何通过查询从Snowflake中创建特定视图的表

Snowflake /当存储过程作为OWNER执行时如何获取原始调用者

无法使用 oracle 存储过程在水晶报表 2013 中创建报表