Athena のパラメータ化されたクエリを使用して、実行時に同じクエリを異なるパラメータ値で再実行し、SQL インジェクション攻撃を防ぐことができます。Athena では、パラメータ化されたクエリは、任意の DML クエリまたは SQL プリペアドステートメントの実行パラメータの形式をとることができます。
-
実行パラメータを持つクエリは 1 つのステップで実行でき、ワークグループ固有ではありません。パラメータ化する値の DML クエリには、疑問符を付けます。クエリを実行するときは、実行パラメータ値を順番に宣言します。パラメータの宣言とパラメータへの値の割り当ては、同じクエリで、しかし分離された方法で行えます。プリペアドステートメントとは異なり、実行パラメータを含むクエリを送信するときにワークグループを選択できます。
-
プリペアドステートメントには、
PREPARE
とEXECUTE
の 2 つの別個の SQL ステートメントが必要です。まず、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 個に制限されます。