如何区分修改数据的SQL语句和只读的语句?
我需要编写一个jdbc兼容的驱动程序包装器,其目的是记录所有修改数据的SQL语句。区分那些修改数据的语句和那些只读取数据的语句最简单的方法是什么?我想唯一的方法是即时解析SQL代码,任何可以做到这一点的库?如何区分修改数据的SQL语句和只读的语句?
我认为一个很好的开始是寻找以INSERT,UPDATE或DELETE开头的查询。确保在测试字符串之前修剪前导空格。
如果要包含模式更改语句,请包括诸如CREATE,ALTER,DROP和TRUNCATE之类的命令。
上述方法的具体情况将取决于您使用的数据库。例如,在一个字符串中可能有批处理命令,用分号分隔。您将需要解析字符串以查找这样的实例。
不要忘了现代SQL DBMS上的MERGE。 – 2010-09-14 13:53:47
在某些RDBMS系统中,您可以修改不与插入,更新或删除操作相关的语句。 (例如,在SQL Server中,其中的任何一个都可以嵌入到cte中,因此首先使用“WITH”语句。)这是一个复杂的问题,并且为您的系统找到第三方工具可能是最安全的选择。 – 2010-09-14 13:55:45
如果这不是一般用途的包装,我只会记录每个呼叫executeXXX()
方法,除了调用executeQuery()
,然后在客户端代码中调用appropiate方法。
如果您希望它是通用目的并希望避免解析SQL,您可以调查getUpdateCount()
方法以及executeXXX()
方法的返回值。这意味着在执行之后记录,并且我认为它不会100%正确。
如果语句是对存储过程的调用会怎么样? – Quassnoi 2010-09-14 14:07:29
如果SP,我会认为它默认修改数据。为了更详细的解决方案,我可能会实现一个只读(或修改列表)SP的列表。 – Dan 2010-09-14 15:05:02