我需要編寫一個jdbc兼容的驅動程序包裝器,其目的是記錄所有修改數據的SQL語句。區分那些修改數據的語句和那些只讀取數據的語句最簡單的方法是什麼?我想唯一的方法是即時解析SQL代碼,任何可以做到這一點的庫?如何區分修改數據的SQL語句和只讀的語句?
回答
你或許可以找到一些完整的SQL解析器,例如one,但是如果你的包裝只會攔截單個語句,那麼你可能(沒有足夠的細節)將SELECT語句視爲只讀,而其他所有內容都視爲修改數據的語句。
我認爲一個很好的開始是尋找以INSERT,UPDATE或DELETE開頭的查詢。確保在測試字符串之前修剪前導空格。
如果要包含模式更改語句,請包括諸如CREATE,ALTER,DROP和TRUNCATE之類的命令。
上述方法的具體情況將取決於您使用的數據庫。例如,在一個字符串中可能有批處理命令,用分號分隔。您將需要解析字符串以查找這樣的實例。
不要忘了現代SQL DBMS上的MERGE。 – 2010-09-14 13:53:47
在某些RDBMS系統中,您可以修改不與插入,更新或刪除操作相關的語句。 (例如,在SQL Server中,其中的任何一個都可以嵌入到cte中,因此首先使用「WITH」語句。)這是一個複雜的問題,並且爲您的系統找到第三方工具可能是最安全的選擇。 – 2010-09-14 13:55:45
如果這不是一般用途的包裝,我只會記錄每個呼叫executeXXX()
方法,除了調用executeQuery()
,然後在客戶端代碼中調用appropiate方法。
如果您希望它是通用目的並希望避免解析SQL,您可以調查getUpdateCount()
方法以及executeXXX()
方法的返回值。這意味着在執行之後記錄,並且我認爲它不會100%正確。
- 1. 如何修改SQL中的WHERE語句?
- 2. SQL更新語句數據庫修改
- 3. sql修改文件語句
- 4. 如何添加數據和SQL語句
- 5. SQL語句修改索引,並添加分區
- 6. 修改由JDBC生成的sql語句
- 7. Sql中的Callable語句和Prepared語句有什麼區別?
- 8. 如何修改此SQL SELECT語句以更改非數字值?
- 9. 修改功能和如果語句
- 10. 在Select語句中修改SQL查詢
- 11. 修改SQL SELECT語句與PHP
- 12. 的Oracle SQL語句改寫
- 13. deleterow()只讀語句錯誤
- 14. 數組和if語句中的語句
- 15. 改變switch語句和if-else語句
- 16. SQL語句選擇語句
- 17. 如何分解MERGE語句的sql%rowcount
- 18. if語句,修改輸出
- 19. 如何修改此代碼語句?
- 20. 核心數據SQL語句
- 21. SQL語句從數據庫
- 22. SQL語句數據插入
- 23. 如何在SQL語句的WHERE子句內修剪?
- 24. SED語句更改/修改CSV分隔符和分隔符
- 25. SQL語句中的Where語句中的IF語句
- 26. 按語句分組的SQL語法
- 27. 只有一條SQL語句,如果語句爲
- 28. sql server - 如何修改查詢語句中的值?
- 29. 我如何修改Linq生成的sql語句?
- 30. where語句中的case語句 - SQL Server
如果語句是對存儲過程的調用會怎麼樣? – Quassnoi 2010-09-14 14:07:29
如果SP,我會認爲它默認修改數據。爲了更詳細的解決方案,我可能會實現一個只讀(或修改列表)SP的列表。 – Dan 2010-09-14 15:05:02