2017-08-02 13 views
1

我有一段代碼,做這樣的事情:有沒有簡單的方法來檢查SQL語句是否會更新數據庫?

if (sqlStatement.WillUpdateDatabase) 
    DoThing1(); 
else 
    DoThing2(); 

目前WillUpdateDatabase實現爲

public bool WillUpdateDatabase { 
    get { return statementText.StartsWith("SELECT"); } 
} 

這捕獲大多數情況下,但它可以與SELECT ... INTO ...更加複雜。可能還需要考慮其他一些情況。

只是要清楚:這不是實現任何類型的安全。還有其他系統可以檢查SQL注入攻擊,這段代碼只需要做出是否執行thing1或thing2的選擇。

這似乎應該是一個解決的問題。有沒有行業標準的方法可靠地做到這一點?

更新/說明:類似UPDATE Table1 SET Column1 = 'a' WHERE 1 = 2應該被視爲更新。

+2

難道你不能'.Contains(「UPDATE」)'和'.Contains(「INSERT」)'? – EpicKip

+1

@Jonny如果SQL包含一個'UPDATE'而不是'WHERE'子句,那麼沒有記錄會被更新。這算作'會更新數據庫'嗎? – mjwills

+0

你不能預測它是否會更新一個值,直到它有效地嘗試它...所以,不,你不能真正檢查這個 –

回答

-2

由於您的聲明文本會改變值只與SQL查詢與UPDATEINSERT開始,一個方式來測試,如果你的查詢將嘗試更新可能是以下幾點:

public bool WillUpdateDatabase { 
    get { return (statementText.StartsWith("UPDATE") || statementText.StartsWith("INSERT")) } 
} 

但你不能知道該查詢將有效更新表中的一些字段。例如,如果您的查詢類似UPDATE persons SET age = 25 WHERE name = "John",並且沒有名稱爲約翰的條目,則您的查詢將嘗試更新,但顯然無法更新,因爲沒有任何更新。

編輯

感謝@NikBo和@Gusman,我取代包含StartsWith,以避免任何問題,像聶伯在波紋管的意見解釋。

+2

這將返回true使用此語句回答'SELECT * FROM表1 WHERE字段1 =「UPDATE「' –

+0

使用StartsWith代替包含 – Gusman

+0

';隨着SomeCTE()更新表1 ...'不會導致更新,然後 –

3

像其他許多人所說的那樣,這確實是一個令人討厭的問題,檢查SQL並不是真的會爲你削減它,因爲你實際上最終會編寫一個完整的SQL解析器(這真的會重塑車輪)。您可能必須創建一個只具有所有表的讀取權限的數據庫用戶,然後使用該只讀用戶實際執行要測試的查詢,並捕獲由於權限衝突而導致失敗的情況(而不是SQL語法等)

相關問題