snowflake-cloud-data-platform - 部署存储过程时使用会话变量-雪花
问题描述
我有一种情况,我将存储过程 DDL 推送到 git 存储库中。这些代码有一些特定于环境的代码,比如我有 dev、qa 和 prd,而我每次部署时都需要替换。
我正在寻找的是能够使用可以在部署时替换的变量。像这样的东西
var env= 'dev';
create or replace procedure test
returns varchar
language javascript
as
$$
insert into raw_$env.employee values(1);
$$;
当我运行此代码时,我希望像这样部署代码。
create or replace procedure test
returns varchar
language javascript
as
$$
insert into raw_raw.employee values(1);
$$;
解决方案
要指定动态模式名称,您可以使用 IDENTIFIER()。然后使用javascript存储过程API来执行。
create or replace procedure test()
returns text
language javascript
execute as caller
as
$$
snowflake.createStatement({ sqlText: `set t = 'raw_' || $env || '.employee'` }).execute()
snowflake.createStatement({ sqlText: `insert into identifier($t) values(1)` }).execute()
return 'SUCCESS'
$$;
set env= 'dev';
call test();
您可能还想指定数据库。
更新——静态解决方案,硬编码'env'参数
在 SNOWSQL 中运行
!define env=dev;
create or replace procedure test()
returns text
language javascript
execute as caller
as
$$
snowflake.createStatement({ sqlText: `insert into raw_&env.employee values(1)` }).execute() return 'SUCCESS'
$$;
要验证替换是静态的:
select get_ddl('procedure','test()')
env 参数也可以在配置文件或SNOWSQL命令行中定义。
推荐阅读
- javascript - 为什么 while() 构造在 Chrome 调试器中可以正常工作,但在 jsbin 中却不能?
- c# - 如何编写类似于为依赖注入提供的扩展方法?例如:.AddTransient
()? - javascript - 使用 DOM 操作将 forEach 函数转换为 for 循环
- php - 确定子字符串是否属于字符串的运算符
- reactjs - 你如何映射一个数组并将每个数字分配给一个 div?
- inno-setup - 只允许运行一次 Inno Setup 安装程序
- c++ - 为什么使用共享库时对象和库的顺序不影响链接?
- rust - 256 位无符号整数数据类型
- neo4j - 使用 WebFlux 返回 Neo4j 地图投影
- uwp - 无法处理 WebView 导航