2010-09-14 61 views
1

我需要編寫一個jdbc兼容的驅動程序包裝器,其目的是記錄所有修改數據的SQL語句。區分那些修改數據的語句和那些只讀取數據的語句最簡單的方法是什麼?我想唯一的方法是即時解析SQL代碼,任何可以做到這一點的庫?如何區分修改數據的SQL語句和只讀的語句?

+0

如果語句是對存儲過程的調用會怎麼樣? – Quassnoi 2010-09-14 14:07:29

+0

如果SP,我會認爲它默認修改數據。爲了更詳細的解決方案,我可能會實現一個只讀(或修改列表)SP的列表。 – Dan 2010-09-14 15:05:02

回答

1

你或許可以找到一些完整的SQL解析器,例如one,但是如果你的包裝只會攔截單個語句,那麼你可能(沒有足夠的細節)將SELECT語句視爲只讀,而其他所有內容都視爲修改數據的語句。

+0

「許多人試圖用解析器生成工具編寫完整的SQL語法並失敗。」他們說。似乎比我最初想象的更復雜.. – Dan 2010-09-15 01:56:31

+0

@丹,是的,特別是由於標準的擴展。例如,你可以在這裏找到SQL語法http://savage.net.au/SQL/,它在BNF中可以找到解析器並做很好的事情;然而,如果你的目標是完全符合,那麼你很可能談論完全符合一些現有的RDBMS(甚至更糟糕的是,多個RDBMS),並且有更多的版本,並且更多沒有記錄:) – Unreason 2010-09-15 16:06:09

1

我認爲一個很好的開始是尋找以INSERT,UPDATE或DELETE開頭的查詢。確保在測試字符串之前修剪前導空格。

如果要包含模式更改語句,請包括諸如CREATE,ALTER,DROP和TRUNCATE之類的命令。

上述方法的具體情況將取決於您使用的數據庫。例如,在一個字符串中可能有批處理命令,用分號分隔。您將需要解析字符串以查找這樣的實例。

+0

不要忘了現代SQL DBMS上的MERGE。 – 2010-09-14 13:53:47

+2

在某些RDBMS系統中,您可以修改不與插入,更新或刪除操作相關的語句。 (例如,在SQL Server中,其中的任何一個都可以嵌入到cte中,因此首先使用「WITH」語句。)這是一個複雜的問題,並且爲您的系統找到第三方工具可能是最安全的選擇。 – 2010-09-14 13:55:45

0

如果這不是一般用途的包裝,我只會記錄每個呼叫executeXXX()方法,除了調用executeQuery(),然後在客戶端代碼中調用appropiate方法。

如果您希望它是通用目的並希望避免解析SQL,您可以調查getUpdateCount()方法以及executeXXX()方法的返回值。這意味着在執行之後記錄,並且我認爲它不會100%正確。