我们有许多使用Sybase数据库的Java Spring项目。
我们想将其迁移到MSSQL。
任务之一是开发脚本来查找项目源代码中使用的所有SQL查询。此外,项目中还增加了存储过程的使用。
什么是合适的方法呢?
@Override
public void update(int id, Entity entity) {
jdbcTemplate.update(
"UPDATE exclusion SET [enabled] = :enabled WHERE [id] = :id",
HashMapBuilder.<String, Object>builder()
.put("id", id)
.put("enabled", entity.enabled)
.build()
);
}
这是最简单的情况。
首先,我们想对源代码进行正则表达式,以便通过一系列SQL关键字查找SQL。
答案 0 :(得分:0)
从本质上讲,您希望找到任何送入jdbc调用的(SQL)字符串。
这意味着您的工具必须知道什么是jdbc方法(例如,“ jdbcTemplate.update”),以及每个方法的哪个参数是要用作SQL的字符串。既然已记录下来,那很容易。
很难找到字符串,因为它是动态组装的。不能保证整个SQL字符串实际上都作为函数调用的直接参数而存在。可以通过使用“ +”和任意函数调用组合SQL字符串片段来计算得出。
这意味着您必须从编译器的角度解析Java,了解每个符号的含义,并通过代码中的数据流跟踪值。
地球上正则表达式无法可靠地做到这一点。 (您可能做得不好,也许对您来说已经足够了,我建议您搜寻所有的jdbc方法调用名称。)
还有一个更严重的问题:一旦弄清了SQL字符串 是什么,您就需要知道它是否符合MSSQL。这就要求使用兼容MSSQL的解析器(同样,没有regex可以进行上下文无关的解析)来解析抽象字符串(记住,它是由一堆片段组成的),并抱怨那些没有解析的字符串。
即使这还不够,如果MSSQL的语句看起来与sybase语句相同,但含义不同。
这是使用自动化解决好一个非常困难的问题。 (有研究论文描述了上述所有活动)。
我认为您需要做的是找到所有SQL调用,并手动检查每个SQL调用的兼容性。
下次,您应该使用数据库访问层构建应用程序。然后所有SQL调用都放在一个地方。