如何确定特定查询是否会更改DB的状态? 我使用JDBC。我应该使用解析搜索INSERT,DELETE等关键词还是有其他方法吗?
答案 0 :(得分:3)
不要检查查询。相反,请确保在不允许修改数据库的用户凭据下运行查询。您可以创建多个用户并授予每个有限权限。此应用程序应使用只能选择数据的用户进行连接。
确切的方式(如果可能的话)取决于您使用的数据库,但我认为每个现代DBMS都支持这一点。
您可以执行查询,捕获用户权限不足时可能获得的异常,并在确认后使用其他用户进行连接。通过这种方式,您可以将其全部留给数据库及其权限管理,这比自己解析查询更安全,更不容易出错。
答案 1 :(得分:2)
我建议使用MySQL权限执行此操作。有两个用户,一个具有只读访问权限和读/写权限。
我认为这是最安全的方式,因为您正在推送数据库的权限。否则你将需要一个复杂的SQL解析器,这可能很困难。
答案 2 :(得分:1)
一种方式:
会有变化。探索Statement API以了解您的选择。
修改:确保autocommit已关闭,或事务已超出窗口!
更多编辑:正如评论者所指出的,这不是一个可扩展的解决方案。对于可伸缩性,事务必须保持简短,并且您不希望在打开的事务期间让用户有思考时间。如果有多个用户,找到一种方法来执行此操作,不涉及保持事务处于打开状态,可能需要一些创造性地使用语句缓存和回滚/提交。如需更好的建议,请详细说明您的要求。
答案 3 :(得分:1)
取决于。 UPDATE
或DELETE
可能会更改数据库。如果您想知道是否更改数据库,请对INSERT
,UPDATE
,DELETE
或ALTER
进行不区分大小写的搜索关键字将告诉您查询可能会更改数据库。虽然没有什么可以阻止类似SELECT * FROM sometable WHERE something = 'update'
的内容,但请注意这一点。
如果您想知道是否实际进行了更改,在运行查询之前,您将需要了解有关已经存在的数据的信息。数据库。使用与潜在的数据更改SELECT
或WHERE
语句相同的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等没什么帮助。但这是一个开始。