2011-08-23 69 views
0

如何確定特定查詢將更改DB的狀態? 我使用JDBC。我應該使用解析搜索關鍵詞INSERT,DELETE還是還有其他方法?確定查詢是否會更改DB

+0

你是否關心這個陳述是否會改變數據庫,或者你想知道實際上是否會改變? –

+0

第一種情況。我想阻止它。 – damluar

+0

你能詳細說明你爲什麼想知道這個嗎?你打算讓最終用戶直接輸入SQL查詢嗎? –

回答

1

方式一:

  1. Execute the query
  2. 檢查update count
  3. 如果更新由,做你的用戶檢
  4. 在積極應對,commit交易。否定的,roll it back

會有變化。探索Statement API以瞭解您的選擇。

編輯:確保autocommit已關閉,或事務性不在窗口!

更多編輯:正如評論者指出的,這不是一個可擴展的解決方案。對於可擴展性,交易必須保持簡短,並且您不希望讓用戶在公開交易期間思考時間。如果會有多個用戶,找到一種方法來做到這一點,而不需要保持一個事務處於打開狀態,可能會使用一些創造性的語句緩存和回滾/提交。爲獲得更好的建議,請詳細解釋您的要求。

+0

是的,這是很好的選擇。謝謝兩次:) – damluar

+0

嗯,這仍然不是一個好的解決方案,因爲用戶可以通過做'SET autocommit = 1; .....'所以這不是很安全。儘管如此,由你決定。它也執行不好,因爲對數據庫的所有其他更改都處於保留狀態,直到提交。 –

+0

如果用戶可以執行任意查詢,情況就是這樣,但我認爲情況並非如此,否則他只是在編寫數據庫瀏覽器。性能可能是一個問題,取決於併發使用情況。我沒有想到這一點。 –

3

不檢查查詢。相反,請確保查詢在不允許修改數據庫的用戶憑據下運行。您可以創建多個用戶並授予每個有限權限。此應用程序應該使用只能選擇數據的用戶進行連接。

確切的方法(如果這是可能的話)取決於您使用的數據庫,但我認爲每個現代DBMS都支持這一點。

您可以執行查詢,捕獲您可能在用戶權限不足時發生的異常,並且在確認後可以使用其他用戶進行連接。通過這種方式,您可以將其全部留給數據庫及其權限管理,這比自己解析查詢更安全,更不容易出錯。

+0

我問我問了什麼。謝謝你,我知道不同的角色併爲他們分配用戶。但這不是問題。 – damluar

+0

與其回答你的問題,我想我會爲你提供解決問題的方案。我做了一些補充,可能會有所幫助,但如果您自己解析查詢,請繼續。但是你需要有相當多的SQL知識才能做到這一點。 select查詢不一定以select開始,delete和insert語句也可以包含select。而這些只是常見的例外...... – GolezTrol

+0

謝謝,我認爲唯一的辦法就是解析。但希望它不是。 – damluar

0

我不是一個JDBC的專家,但我看到了這一點,並能對您有所幫助:

http://www.techfeed.net/blog/index.cfm/2006/4/20/Obtaining-Affected-rows-from-SQL-Query

它提供了一些技術,用於檢索受INSERT的行數/ UPDATE/DELETE聲明。當然,這對CREATE/DROP TABLE等幫助不大,但這是一個開始。

+0

啊,剛纔看到你想在執行它之前攔截語句*。沒關係! (這些將在執行後工作)。 –

2

我建議使用MySQL權限執行此操作。有兩個用戶,一個具有隻讀訪問權限和讀/寫權限。

  1. 執行查詢與只讀用戶
  2. 檢查的SQLException,如果一個拋出,則表明你的消息,如果他們真的想要寫
  3. 然後用第二個用戶。

這是我認爲是最安全的方式,因爲您正在推動數據庫的權限。否則,你將不得不有一個複雜的SQL解析器,這可能是困難的。

1

取決於。一個UPDATEDELETE可能更改數據庫。如果您想知道是否可能在更改數據庫,那麼INSERT,UPDATE,DELETEALTER關鍵字不區分大小寫的搜索將告訴您有查詢更改數據庫的可能性。雖然沒有什麼能夠阻止像SELECT * FROM sometable WHERE something = 'update'這樣的東西,所以請留意。

如果你想知道是否會改變實際運行查詢之前進行,你將不得不瞭解一下已在數據庫中的數據。執行SELECT使用相同的WHERE子句作爲潛在的數據變更UPDATEDELETE語句,並比較數據(例如,對於使用JOIN或SQL的其他更高級功能的查詢,這可能會變得麻煩)。更簡單的方法是use transactions進行更改,檢查更改,然後回滾事務,撤消更改。

如果你想防止更改,如其他答案建議你利用你的DBMS的角色管理,不授予權限執行更改查詢用戶或角色上運行這些查詢。

+0

謝謝,好想法 – damluar