1

JDBI を使用してテーブル パーティションを変更する際に問題が発生しました。実行しようとしているクエリの例を次に示します。

ALTER TABLE table1 DROP PARTITION P_1

テーブル「table1」からパーティション「P_1」を削除すると、これは MySQL で正常に実行されます。

次のようにJavaコードに実装しました。

@SqlUpdate("ALTER TABLE table1 DROP PARTITION :partition;")
public void deletePartition(@Bind("partition") String partition);

そして、この関数をそのように呼び出します

deletePartition("P_1")

ただし、これにより次のエラーが発生します。

原因: org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: SQL 構文にエラーがあります。1 行目の ''P_1'' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください [ステートメント:"ALTER TABLE table1 DROP PARTITION :partition;", located:"ALTER TABLE table1 DROP PARTITION :partition; "、書き換え:"/* HiveDropBoxDBI.deletePartition */ ALTER TABLE table1 DROP PARTITION ?;"、引数:{位置:{}、名前付き:{パーティション:'P_1'}、ファインダー:[]}]

この機能はサポートされていませんか? または、構文に何か不足していますか?

ありがとう

4

2 に答える 2

1

CREATEALTERおよびなどの DDL にバインド パラメータを使用することはできませんDROP

パーティションを削除するには、代わりにパーティション名をクエリに連結する必要があります。

ただし、パーティション名を取得して、実行される SQL 文字列に直接追加することは、セキュリティの脆弱性のレシピです。次のいくつかを検討してください。

  • バッククォートでパーティション名を「エスケープ」し、
  • パーティション名にホワイトリストに登録された特定の文字 (英数字やアンダースコアなど) のみが含まれていることを確認します。
  • テーブルをクエリして、INFORMATION_SCHEMA.PARTITIONS削除しようとしているパーティションが存在するかどうかを確認します。(パーティションの存在を確認してから削除するまでの間にパーティションが作成または削除される可能性がある場合、これは良い考えではないかもしれません。これが問題になるかどうかを判断できるほどアプリケーションをよく知りません。)

JDBI は@SqlUpdate注釈用の定数文字列に依存しているため、同じパーティションのみを削除する場合を除き、この方法で JDBI を使用してパーティションを削除することはできません。

于 2015-08-19T15:27:21.830 に答える