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 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''P_1'' 附近使用正确的语法 [语句:“ALTER TABLE table1 DROP PARTITION :partition;”,位于:“ALTER TABLE table1 DROP PARTITION :partition; ", rewritten:"/* HiveDropBoxDBI.deletePartition */ ALTER TABLE table1 DROP PARTITION ?;", arguments:{ positional:{}, named:{partition:'P_1'}, finder:[]}]

不支持此功能吗?还是我的语法遗漏了什么?

谢谢

4

2 回答 2

1

您不能对 DDL 使用绑定参数,例如CREATE,ALTERDROP.

为了删除您的分区,您必须将分区名称连接到查询中。

但是,获取分区名称并将其直接附加到执行的 SQL 字符串中会导致安全漏洞。考虑以下几点:

  • 用反引号“转义”分区名称,
  • 检查分区名称是否仅包含某些列入白名单的字符(例如字母数字和下划线),
  • 查询INFORMATION_SCHEMA.PARTITIONS表以查看您尝试删除的分区是否存在。(如果在检查分区是否存在和删除分区之间有可能创建或删除分区,这可能不是一个好主意。我不太了解您的应用程序,无法说出这是否会成为问题。)

由于 JDBI 依赖于用于@SqlUpdate注释的常量字符串,因此您将无法以这种方式使用 JDBI 来删除分区,除非您只想删除同一个分区。

于 2015-08-19T15:27:21.830 回答
1

我们需要使用@Define 来更改查询。@Bind 仅用于绑定参数(如 some_field = :value)。

  @SqlUpdate("ALTER TABLE table1 DROP PARTITION :partition;")
  public void deletePartition(@Bind("partition") String partition);
于 2015-08-19T08:28:40.420 回答