2015-08-19 2 views
1

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

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") 

Однако это приводит к следующей ошибке:

Causing: org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''P_1'' at line 1 [statement:"ALTER TABLE table1 DROP PARTITION :partition;", located:"ALTER TABLE table1 DROP PARTITION :partition;", rewritten:"/* HiveDropBoxDBI.deletePartition */ ALTER TABLE table1 DROP PARTITION ?;", arguments:{ positional:{}, named:{partition:'P_1'}, finder:[]}]

Не поддерживается ли эта функция? Или я что-то пропустил с помощью своего синтаксиса?

Thanks

+0

Спасибо за редактирование спойлера! Не понял, что сделал символ «+», так как он был частью трассировки стека. – Andrew

ответ

1

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

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

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

Для того чтобы отбросить раздел, вы должны связать имя раздела с запросом.

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

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

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