如何確定特定查詢將更改DB的狀態? 我使用JDBC。我應該使用解析搜索關鍵詞INSERT,DELETE還是還有其他方法?確定查詢是否會更改DB
回答
方式一:
- Execute the query
- 檢查update count
- 如果更新由,做你的用戶檢
- 在積極應對,commit交易。否定的,roll it back。
會有變化。探索Statement API以瞭解您的選擇。
編輯:確保autocommit已關閉,或事務性不在窗口!
更多編輯:正如評論者指出的,這不是一個可擴展的解決方案。對於可擴展性,交易必須保持簡短,並且您不希望讓用戶在公開交易期間思考時間。如果會有多個用戶,找到一種方法來做到這一點,而不需要保持一個事務處於打開狀態,可能會使用一些創造性的語句緩存和回滾/提交。爲獲得更好的建議,請詳細解釋您的要求。
是的,這是很好的選擇。謝謝兩次:) – damluar
嗯,這仍然不是一個好的解決方案,因爲用戶可以通過做'SET autocommit = 1; .....'所以這不是很安全。儘管如此,由你決定。它也執行不好,因爲對數據庫的所有其他更改都處於保留狀態,直到提交。 –
如果用戶可以執行任意查詢,情況就是這樣,但我認爲情況並非如此,否則他只是在編寫數據庫瀏覽器。性能可能是一個問題,取決於併發使用情況。我沒有想到這一點。 –
不檢查查詢。相反,請確保查詢在不允許修改數據庫的用戶憑據下運行。您可以創建多個用戶並授予每個有限權限。此應用程序應該使用只能選擇數據的用戶進行連接。
確切的方法(如果這是可能的話)取決於您使用的數據庫,但我認爲每個現代DBMS都支持這一點。
您可以執行查詢,捕獲您可能在用戶權限不足時發生的異常,並且在確認後可以使用其他用戶進行連接。通過這種方式,您可以將其全部留給數據庫及其權限管理,這比自己解析查詢更安全,更不容易出錯。
我不是一個JDBC的專家,但我看到了這一點,並能對您有所幫助:
http://www.techfeed.net/blog/index.cfm/2006/4/20/Obtaining-Affected-rows-from-SQL-Query
它提供了一些技術,用於檢索受INSERT的行數/ UPDATE/DELETE聲明。當然,這對CREATE/DROP TABLE等幫助不大,但這是一個開始。
啊,剛纔看到你想在執行它之前攔截語句*。沒關係! (這些將在執行後工作)。 –
我建議使用MySQL權限執行此操作。有兩個用戶,一個具有隻讀訪問權限和讀/寫權限。
- 執行查詢與只讀用戶
- 檢查的SQLException,如果一個拋出,則表明你的消息,如果他們真的想要寫
- 然後用第二個用戶。
這是我認爲是最安全的方式,因爲您正在推動數據庫的權限。否則,你將不得不有一個複雜的SQL解析器,這可能是困難的。
取決於。一個UPDATE
或DELETE
可能更改數據庫。如果您想知道是否可能在更改數據庫,那麼INSERT
,UPDATE
,DELETE
或ALTER
關鍵字不區分大小寫的搜索將告訴您有查詢更改數據庫的可能性。雖然沒有什麼能夠阻止像SELECT * FROM sometable WHERE something = 'update'
這樣的東西,所以請留意。
如果你想知道是否會改變實際運行查詢之前進行,,你將不得不瞭解一下已在數據庫中的數據。執行SELECT
使用相同的WHERE
子句作爲潛在的數據變更UPDATE
或DELETE
語句,並比較數據(例如,對於使用JOIN
或SQL的其他更高級功能的查詢,這可能會變得麻煩)。更簡單的方法是use transactions進行更改,檢查更改,然後回滾事務,撤消更改。
如果你想防止更改,如其他答案建議你利用你的DBMS的角色管理,不授予權限執行更改查詢用戶或角色上運行這些查詢。
謝謝,好想法 – damluar
- 1. 確定文件是否已更改
- 2. magento從1.6.2升級到1.7.0.2 - db base是否會被更改?
- 3. 只查詢特定列是否更快?
- 4. 更改DCG是確定性
- 5. 檢查IList是否更改?
- 6. 這是SUM()查詢是否正確?
- 7. 是我的查詢是否正確?
- 8. 如何檢查sql查詢是否爲確定性?
- 9. 檢查DB是否可用
- 10. 如何確定SQL查詢是否是SELECT?
- 11. 在TSQL查詢中使用COLLATE是否會做出永久更改?
- 12. 確定Object是否被更改的最佳方法是什麼?
- 13. 這個sql查詢是否正確?
- 14. 這個DQL查詢是否正確?
- 15. Django模型查詢是否正確?
- 16. 我的sql查詢是否正確?
- 17. 它是否正確查詢PHP?
- 18. PHP:關於會話死亡更改DB
- 19. 查詢Raven Db
- 20. 幫助查詢,改變就在DB
- 21. ASP.NET會話數據是否更改?
- 22. 會話是否比查詢數據庫更快?
- 23. 在setter調用之後Hibernate是否會觸發更新查詢?
- 24. 確定CoreApplicationView.GetCurrentView()是否會拋出異常?
- 25. 確定是否ASP.NET會話啓用
- 26. 如何檢查php會話是否更改值
- 27. mysql查詢瀏覽器:是否可以撤消更改?
- 28. 是否有可能確定是否空查詢串存在於導軌4
- 29. SQL查詢更改
- 30. 更改子查詢
你是否關心這個陳述是否會改變數據庫,或者你想知道實際上是否會改變? –
第一種情況。我想阻止它。 – damluar
你能詳細說明你爲什麼想知道這個嗎?你打算讓最終用戶直接輸入SQL查詢嗎? –