2015-08-19 189 views
1

嘿,我正在改變使用JDBI表分區的問題。下面是我試圖運行的查詢的一個示例:JDBI ALTER TABLE DROP PARTITION

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

然而,這會導致以下錯誤:

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:[]}]

不支持此功能嗎?或者我用我的語法錯過了什麼?

謝謝

+0

感謝您編輯擾流板!沒有意識到這是「+」符號的作用,因爲它是堆棧跟蹤的一部分。 – Andrew

回答

1

我們需要使用@Define來改變查詢。 @綁定僅用於綁定參數(如some_field =:value)。

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

不能使用綁定參數DDL如CREATEALTERDROP

爲了刪除您的分區,您必須將分區名稱連接到查詢上。

但是,獲取分區名稱並將其直接附加到執行的SQL字符串中是一個安全漏洞的祕訣。考慮以下一些:

  • 「逃逸」與反引號中的分區名稱,
  • 檢查分區名只包含一定的白名單中的字符(如字母數字和下劃線),
  • 查詢INFORMATION_SCHEMA.PARTITIONS表看如果你試圖刪除的分區存在。 (這可能不是一個好主意,如果有可能在創建或刪除分區時檢查它的存在並將其刪除,我不知道您的應用程序是否足以說明這是否會造成問題。)

由於JDBI依靠@SqlUpdate註釋的常量字符串,因此您將無法以此方式使用JDBI來刪除分區,除非您只想刪除同一分區。