JDBI ALTER TABLE DROP PARTITION

Привет, у меня проблема с изменением разделов таблицы с помощью JDBI. Вот пример запроса, который я пытаюсь выполнить:

ALTER TABLE table1 DROP PARTITION P_1

Это отлично работает в MySQL при удалении раздела «P_1» из таблицы «table1».

Я реализовал это в своем 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, на предмет правильного синтаксиса для использования рядом с «P_1» в строке 1 [утверждение: «ИЗМЕНИТЬ ТАБЛИЦУ table1 DROP PARTITION: раздел;», расположенный: «ALTER TABLE table1 DROP PARTITION: раздел; ", переписано:"/* HiveDropBoxDBI.deletePartition */ ALTER TABLE table1 DROP PARTITION ?;", аргументы: {positional:{}, named:{partition:'P_1'}, finder:[]}]

Эта функция не поддерживается? Или я что-то упустил в своем синтаксисе?

Спасибо


person Andrew    schedule 19.08.2015    source источник
comment
Спасибо за редактирование спойлера! Не понял, что делает символ +, так как он был частью трассировки стека.   -  person Andrew    schedule 19.08.2015


Ответы (2)


Нам нужно использовать @Define для изменения запроса. @Bind используется только для привязки параметров (например, some_field = :value).

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

Вы не можете использовать параметры привязки для DDL, такие как CREATE, ALTER и DROP.

Чтобы удалить раздел, вы должны вместо этого объединить имя раздела с запросом.

Однако взять имя раздела и добавить его прямо в строку SQL, которая будет выполнена, — это рецепт уязвимости системы безопасности. Рассмотрим некоторые из следующих:

  • «экранирование» имени раздела с помощью обратных кавычек,
  • проверка того, что имя раздела содержит только определенные символы из белого списка (например, буквы, цифры и символы подчеркивания),
  • запрашивая таблицу INFORMATION_SCHEMA.PARTITIONS, чтобы узнать, повторно пытается удалить существует. (Это может быть плохой идеей, если существует вероятность того, что раздел может быть создан или удален между проверкой его существования и его удалением. Я недостаточно хорошо знаю ваше приложение, чтобы сказать, будет ли это проблемой.)

Поскольку JDBI использует постоянные строки для аннотаций @SqlUpdate, вы не сможете использовать JDBI таким образом для удаления разделов, если только вы не захотите удалить один и тот же раздел.

person Luke Woodward    schedule 19.08.2015