SNOWFLAKE - 如何在程序中将变量与 DDL 绑定?

SNOWFLAKE - How to bind variables with DDL inside a procedure?

提问人:user18243519 提问时间:5/12/2023 更新时间:5/12/2023 访问量:220

问:

我已经在带有“?”或“:1”占位符的 INSERT 或 SELECT 等语句中使用了绑定变量,但我不能将它与 CREATE ROLE 等指令一起使用,因为它会引发异常。

我需要绑定变量以创建一个过程,在其中我将创建一个具有给定名称的角色。我想避免 CONCAT t 或 ||出于 SQL 注入原因。

这有效

CREATE  PROCEDURE TEST (name VARCHAR)
RETURNS VARCHAR NOT NULL
LANGUAGE SQL
AS
DECLARE
  query VARCHAR;
BEGIN
  query:= 'SELECT * from DUMMY name =  ?';
  EXECUTE IMMEDIATE :query USING (name);
  RETURN  'OK';
END;
 
CALL TEST('OK');

但这会返回异常“语法错误行 1 在位置 12 意外”?“。调用过程时

CREATE PROCEDURE TEST2 (name VARCHAR)
RETURNS VARCHAR NOT NULL
LANGUAGE SQL
AS
DECLARE
  query VARCHAR;
BEGIN
  query:= 'CREATE ROLE ?';
  EXECUTE IMMEDIATE :query USING (name);
  RETURN  'OK';
END;
 
CALL TEST2('WRONG');
snowflake-cloud-data-platform 准备语句 SQL 注入 过程 ddl

评论


答:

0赞 NickW 5/12/2023 #1

当您引用对象名称时,您需要使用 IDENTIFIER 关键字,例如

query:= 'CREATE ROLE IDENTIFIER(?)';