2016-03-03 79 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?