如何判断SQL查询是否是SELECT?

问题描述 投票:0回答:4

早上好。

编辑

我想对 sql 查询进行一些验证,以验证该查询是 SELECT 而不是 UPDATE、DELETE、INSERT 或任何 sql 奇怪的语句。

我知道最简单的方法是匹配“^SELECT”但是:

  • 查询可以以“(”开头,例如

    (SELECT * FROM blah WHERE id > 1 LIMIT 3) UNION (SELECT * ...)

  • 查询可以以“WITH RECURSIVE”开头

    使用递归 cte AS(从 blah 中选择 *)

我想确定 SQL 查询是否是 SELECT。 好吧,我不知道在编写正则表达式之前是否必须知道一些奇怪的查询。

如有任何帮助,我们将不胜感激。

编辑:我想检查它是否是纯选择查询:)

sql validation select
4个回答
2
投票

处理此问题的正常方法是使用权限 - 您授予在 sql server 中运行查询的用户 db_reader 权限,但不授予 db_writer 或其他任何权限。 然后,如果查询失败,则处理错误/异常。


1
投票

您还可以制作更新语句,在内部运行自己的 SELECT 来查找要更新的数据,或者使用许多其他方式将语句嵌入到彼此中...假设您不使用“SELECT”作为数据或字段名称,只需运行

/\bselect\b/i
的正则表达式,否则你将需要一个完整的解析器。

编辑:还有:

/\b(insert|update)\b/i
反转它以确保其中没有它们。


0
投票

一种可能是搜索保留字:INSERT、UPDATE、DELETE,这些词很可能不会在 SELECT 语句中使用。

另一种可能性是在实际语句周围使用 COUNT(*) SELECT。

需检查的声明:

stmt_ = "UPDATE table set value = 'x'" 

检查:

check_stmt_ = "SELECT count(*) from (" + stmt_ + ")"

对数据库执行 check_stmt_。如果引发错误 stmt_,则不是 SELECT 语句。 SELECT 语句总是返回多条记录,而 INSERT、UPDATE、DELETE 语句则不然。 使用ORACLE会出现“Ora-00903无效表名”。

也许这不是最优雅的检查方式,但它确实有效。


-3
投票

如果查询以单词“select”开头(不区分大小写),那么它是一个选择查询

© www.soinside.com 2019 - 2024. All rights reserved.