确定查询是否会更改DB

时间:2011-08-23 19:13:40

标签: java database jdbc

如何确定特定查询是否会更改DB的状态? 我使用JDBC。我应该使用解析搜索INSERT,DELETE等关键词还是有其他方法吗?

5 个答案:

答案 0 :(得分:3)

不要检查查询。相反,请确保在不允许修改数据库的用户凭据下运行查询。您可以创建多个用户并授予每个有限权限。此应用程序应使用只能选择数据的用户进行连接。

确切的方式(如果可能的话)取决于您使用的数据库,但我认为每个现代DBMS都支持这一点。

您可以执行查询,捕获用户权限不足时可能获得的异常,并在确认后使用其他用户进行连接。通过这种方式,您可以将其全部留给数据库及其权限管理,这比自己解析查询更安全,更不容易出错。

答案 1 :(得分:2)

我建议使用MySQL权限执行此操作。有两个用户,一个具有只读访问权限和读/写权限。

  1. 使用只读用户
  2. 执行查询
  3. 检查是否有SQLException,如果有人抛出,则显示您的消息是否真的要写
  4. 然后使用第二个用户。
  5. 我认为这是最安全的方式,因为您正在推送数据库的权限。否则你将需要一个复杂的SQL解析器,这可能很困难。

答案 2 :(得分:1)

一种方式:

  1. Execute the query
  2. 查看update count
  3. 如果进行了更新,请执行用户检查
  4. 积极回复,commit交易。否定,roll it back
  5. 会有变化。探索Statement API以了解您的选择。

    修改:确保autocommit已关闭,或事务已超出窗口!

    更多编辑:正如评论者所指出的,这不是一个可扩展的解决方案。对于可伸缩性,事务必须保持简短,并且您不希望在打开的事务期间让用户有思考时间。如果有多个用户,找到一种方法来执行此操作,不涉及保持事务处于打开状态,可能需要一些创造性地使用语句缓存和回滚/提交。如需更好的建议,请详细说明您的要求。

答案 3 :(得分:1)

取决于。 UPDATEDELETE 可能会更改数据库。如果您想知道是否更改数据库,请对INSERTUPDATEDELETEALTER进行不区分大小写的搜索关键字将告诉您查询可能会更改数据库。虽然没有什么可以阻止类似SELECT * FROM sometable WHERE something = 'update'的内容,但请注意这一点。

如果您想知道是否实际进行了更改在运行查询之前,您将需要了解有关已经存在的数据的信息。数据库。使用与潜在的数据更改SELECTWHERE语句相同的UPDATE子句执行DELETE,并比较数据(例如,这可能会使查询变得混乱)使用JOIN或SQL的其他更高级功能)。一种更简单的方法是use transactions进行更改,检查更改,然后回滚事务,撤消更改。

如果您想阻止更改,因为其他答案建议您应该使用DBMS的角色管理,并且不授予对运行这些查询的用户或角色执行更改查询的权限

答案 4 :(得分:0)

我不是JDBC专家,但我看过这个并且可能对您有所帮助:

http://www.techfeed.net/blog/index.cfm/2006/4/20/Obtaining-Affected-rows-from-SQL-Query

它提供了一些检索受INSERT / UPDATE / DELETE语句影响的行数的技术。当然,这对CREATE / DROP TABLE等没什么帮助。但这是一个开始。