2017-08-02 91 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语法等)

相关问题