有没有一种简单的方法来检查SQL语句是否会更新数据库?

时间:2017-08-02 09:00:13

标签: c# 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 个答案:

答案 0 :(得分:3)

正如许多其他人所评论的那样,这确实是一个令人讨厌的问题,并且检查SQL并不是真的会为你削减它,因为你实际上最终会编写一个完整的SQL解析器(这真的会重新发明轮)。您可能必须创建一个只对所有表具有读权限的数据库用户,然后使用该只读用户实际执行要测试的查询,并捕获由于权限违规而导致失败的情况(而不是SQL)语法等)

答案 1 :(得分:-2)

由于您的语句文本仅使用以UPDATEINSERT开头的SQL查询更改值,因此测试您是否尝试更新的一种方法可能如下:

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

但是您无法知道查询是否会有效地更新表中的某些字段。例如,如果您的查询类似于UPDATE persons SET age = 25 WHERE name = "John"并且没有名称​​ John 的条目,则您的查询将尝试更新,但显然无法更新,因为没有更新内容。

修改

感谢@NikBo和@Gusman,我将包含替换为 StartsWith 以避免像Nik Bo在下面的评论中解释的任何问题。