使用参数化查询
您可以使用 Athena 参数化查询在执行时使用不同的参数值重新运行同一个查询,从而帮助防止 SQL 注入攻击。在 Athena 中,参数化查询可以在任何 DML 查询或 SQL 预准备语句中采用执行参数的形式。
-
带有执行参数的查询可以在单个步骤中完成,而不是特定于工作组。您可以在任何 DML 查询中为要参数化的值放置问号。运行查询时,按顺序声明执行参数的值。参数的声明和参数的赋值可以在同一查询中完成,但单独进行。与预准备语句不同,您可以在提交带有执行参数的查询时选择工作组。
-
预准备语句需要两个单独的 SQL 语句:
PREPARE
和EXECUTE
。首先,在PREPARE
语句中定义参数。然后,运行为您定义的参数提供值的EXECUTE
语句。预准备语句特定于工作组;您不能在预准备语句所属的工作组的上下文以外运行它们。
注意事项和限制
-
参数化查询仅在 Athena 引擎版本 2 及更高版本中受支持。有关 Athena 引擎版本的更多信息,请参阅 Athena 引擎版本控制。
-
目前,参数化查询仅在
SELECT
、INSERT INTO
、CTAS
和UNLOAD
语句中受支持。 -
在参数化查询中,参数是位置参数,并用
?
指示。参数按其在查询中的顺序赋值。命名参数不受支持。 -
目前,
?
参数只能放在WHERE
子句中。不支持SELECT ? FROM table
之类的语法。 -
问号参数不能放在双引号或单引号以内(即
'?'
和"?"
不是有效的语法)。 -
要将 SQL 执行参数视为字符串,它们必须用单引号而不是双引号括起来。
-
如有必要,您可以在为参数化术语输入值时使用
CAST
函数。例如,如果您有一列date
类型在查询中参数化,并且想要查询日期2014-07-05
,则为参数值输入CAST('2014-07-05' AS DATE)
将返回结果。 -
预准备语句特定于工作组,预准备语句名称在工作组中必须唯一。
-
预准备语句的 IAM 权限是必需的。有关更多信息,请参阅 配置对于预编译语句的访问。
-
在 Athena 控制台中使用执行参数的查询最多只能有 25 个问号。