2016-03-03 74 views
2

在相同的UPDATE查詢中是否存在指定的更新同一列2+次的行爲,如下所示?在查詢中多次更新同一列

UPDATE tbl SET a = 5, b = 'something', a = 6 WHERE c = 'whatever'; 

是否有這樣的行爲規範,也可能是SQL的口味有所不同(例如,它是「未定義的行爲」)?用sqlite粗略測試似乎表明它們是從左到右執行的,所以最後一列的值將是結果值,但這並不意味着總是這樣。

編輯:我試圖做到這一點的原因是我正在測試一些類項目的SQL注入。 UPDATE中的一個字段被不安全地注入,我試圖用它來覆蓋來自同一查詢的以前的SET字段。

+1

你爲什麼要這樣做?也許樣本數據和期望的結果會幫助我們理解你的目標。在'mysql'中,它會用你提供的最後一個值更新 - 'sql server'甚至不允許它。你想達到什麼目的? – sgeddes

+0

@sgeddes我更新了帖子。 – iobender

+0

'set'語句的賦值順序通常沒有指定。給定的數據庫可能會指定詞法排序,但不能保證。 –

回答

0

這不是你正在尋找的答案,而是假設文本「something」是一個你傳入的字段,它沒有被參數化或轉義,你可能可以做到這一點。這完全取決於如何構建查詢以及運行哪個數據庫。

UPDATE tbl SET a = 5, b = 'something'; UPDATE tbl set a = 6;--' WHERE c = 'whatever'; 

通過輸入用戶輸入

something'; UPDATE tbl set a = 6;-- 

這假定查詢是建立動態像這樣

var query = "UPDATE tbl set a = 5, b = '" + userInput + "' WHERE c = 'whatever'"; 

在這裏,下面是一個相關的問題:How does the SQL injection from the "Bobby Tables" XKCD comic work?