将UPDATE转换为SELECT

时间:2015-06-11 10:30:50

标签: sql regex

我正在创建一个简单的Web界面,允许对数据库执行查询(是的,我知道,我知道这是一个非常糟糕的做法,但它是一个私人网站,仅供少数目前直接使用的可信用户使用数据库管理器执行这些查询,因此Web界面只是为了使进程更加自动化。)

为了安全起见,每当检测到UPDATE查询时,我想首先执行与更新“等效”的SELECT语句(保持WHERE子句)以检索在执行之前将受影响的记录数。 UPDATE。

想法是用“SELECT * FROM”替换“UPDATE”并删除整个“SET”子句而不删除“WHERE”。
我正在尝试将UPDATE\s*(.*?)\s*SET.*(\s*WHERE\s*.*)替换为SELECT * FROM \1 \2和类似但是当没有“WHERE”子句时我遇到了麻烦(不常见,但可能)。

编辑:很难解释为什么我需要像这样做,但我知道,我知道存储过程,查询构建器,事务等...但对于我的情况这不是我需要做的。

1 个答案:

答案 0 :(得分:2)

你应该修复你的设计。用户更新数据库中的数据没有任何问题。问题是 他们是如何做到的。我强烈建议将update语句包装在存储过程中。然后只允许通过存储过程进行更新。

我更喜欢这种方法有几个主要原因:

  • 我认为设计良好的API可以生成更稳定和可维护的代码。
  • 存储过程控制安全性。
  • 存储过程可以更好地记录数据库中发生的事情。
  • 存储过程控制用户可以执行的操作。

但在你的情况下,它们提供了另一个优势。因为所有update代码都在数据库端,所以您知道更新语句的外观。那么,您可以决定如何获得“预先计数”(这是我假设您正在寻找的)。

编辑:

您的设计中也存在一个重要缺陷(正如您所描述的那样)。数据可能会在updateselect之间发生变化。如果您使用存储过程,有办法解决此问题。例如,您可以将操作包装在事务中。或者,使用SELECT来获取要更新的行,锁定这些行(取决于数据库),并仅对这些行执行更新。