Snowflake cloud data platform 雪花动态SQL:引用参数
基于雪花文档: 如SQL注入(在本主题中)所述,使用动态SQL时要小心防范攻击。 创建存储过程。此过程允许您传递表名并获取该表中的行数(相当于从表名中选择计数(*)): 提供的示例看起来不安全:Snowflake cloud data platform 雪花动态SQL:引用参数,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,基于雪花文档: 如SQL注入(在本主题中)所述,使用动态SQL时要小心防范攻击。 创建存储过程。此过程允许您传递表名并获取该表中的行数(相当于从表名中选择计数(*)): 提供的示例看起来不安全:“从”+表名称中选择计数(*)-简单字符串串联 因此,可以运行如下代码: CALL get_row_count('TAB'); -- intended use CALL get_row_count('(SELECT * FROM TAB UNION ALL SELECT * FROM TAB) s
“从”+表名称中选择计数(*)代码>-简单字符串串联
因此,可以运行如下代码:
CALL get_row_count('TAB'); -- intended use
CALL get_row_count('(SELECT * FROM TAB UNION ALL SELECT * FROM TAB) s'); -- subquery
第一个想法是通过使用TABLE/IDENTIFIER
函数来运行代码(在工作表中看起来像):
作为程序的一部分:
var sql_command = "SET TABLE_NAME = " + TABLE_NAME + "; SELECT COUNT(*) FROM TABLE($TABLE_NAME);";
但它不会起作用,因为:
存储过程GET_ROW_COUNT中的执行错误:不支持单个API调用中的多个SQL语句;每个语句使用一个API调用
使用表/标识符和绑定变量:
create or replace procedure get_row_count(table_name VARCHAR)
returns float
not null
language javascript
as
$$
var row_count = 0;
// Dynamically compose the SQL statement to execute.
// Note that we uppercased the input parameter name.
var sql_command = "select count(*) from TABLE(:1)";
// Run the statement.
var stmt = snowflake.createStatement(
{
sqlText: sql_command,
binds: [TABLE_NAME]
}
);
var res = stmt.execute();
res.next();
row_count = res.getColumnValue(1);
return row_count;
$$
;
电话:
问题:
是否可以以某种方式将多个语句作为一个批处理(snowflake.createStatement
)运行
在JS中是否有一个安全引用name的选项,排序如下:
var sql\u command=“从”+FUNC(表名称)中选择计数(*)代码>
表和绑定值方法是否存在任何潜在缺陷
Re:批处理执行,你可以自己执行:this.executeMany=(s)=>s.split(“;”).map(sqlText=>snowflake.createStatement({sqlText}).execute())
@waldente谢谢,我会查出来的。它们是否在相同的上下文中(即,如果其中一个语句是SET var…
下一个查询是否可以使用它?是的。例如,您可以执行:executeMany('SET x=1;select$x')
。
var sql_command = "SET TABLE_NAME = " + TABLE_NAME + "; SELECT COUNT(*) FROM TABLE($TABLE_NAME);";
create or replace procedure get_row_count(table_name VARCHAR)
returns float
not null
language javascript
as
$$
var row_count = 0;
// Dynamically compose the SQL statement to execute.
// Note that we uppercased the input parameter name.
var sql_command = "select count(*) from TABLE(:1)";
// Run the statement.
var stmt = snowflake.createStatement(
{
sqlText: sql_command,
binds: [TABLE_NAME]
}
);
var res = stmt.execute();
res.next();
row_count = res.getColumnValue(1);
return row_count;
$$
;
CALL get_row_count('TAB'); --works
CALL get_row_count('(SELECT * FROM TAB UNION ALL SELECT * FROM TAB) s');
-- SQL compilation error: syntax error line 1 at position 0 unexpected '('.