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 [оператор:"ALTER TABLE table1 DROP PARTITION:partition;", расположенный: "ALTER TABLE table1 DROP PARTITION: partition; ", переписано:"/* HiveDropBoxDBI.deletePartition */ ALTER TABLE table1 DROP PARTITION?;", аргументы:{ positional:{}, named:{partition:'P_1'}, finder:[]}]
Эта функция не поддерживается? Или я что-то упустил с моим синтаксисом?
Спасибо
2 ответа
Вы не можете использовать параметры связывания для DDL, такие как CREATE
, ALTER
а также DROP
,
Чтобы удалить ваш раздел, вы должны вместо этого объединить имя раздела с запросом.
Тем не менее, взятие имени раздела и добавление его прямо в строку SQL, которая выполняется, является рецептом для уязвимости безопасности. Рассмотрим некоторые из следующих:
- "экранирование" имени раздела с помощью обратных кавычек,
- проверка того, что имя раздела содержит только определенные символы из белого списка (например, буквенно-цифровые символы и подчеркивания),
- запрашивая
INFORMATION_SCHEMA.PARTITIONS
таблица, чтобы увидеть, существует ли раздел, который вы пытаетесь удалить. (Это может не быть хорошей идеей, если есть вероятность, что раздел может быть создан или удален между проверкой его существования и удалением. Я не знаю вашего приложения достаточно хорошо, чтобы сказать, будет ли это проблемой.)
Поскольку JDBI полагается на постоянные строки для @SqlUpdate
аннотации, вы не сможете использовать JDBI для удаления разделов, если только вы не захотите удалить один и тот же раздел.
Нам нужно использовать @Define для изменения запроса. @Bind используется только для параметров привязки (например, some_field =:value).
@SqlUpdate("ALTER TABLE table1 DROP PARTITION :partition;")
public void deletePartition(@Bind("partition") String partition);