Sonarqube PLSQL 自定义规则,用于在 SQL 脚本文件中检测正确的 SQL 终止符分号

Posted

技术标签:

【中文标题】Sonarqube PLSQL 自定义规则,用于在 SQL 脚本文件中检测正确的 SQL 终止符分号【英文标题】:Sonarqube PLSQL Custom rule for detecting correct SQL terminator semicolon within a SQL script file 【发布时间】:2018-11-15 03:37:59 【问题描述】:

我正在使用 Jenkins 和 SONARQUBE PL/SQL 插件进行 Oracle SQL 代码分析, 我需要使用 XPATH 创建自定义规则,以便对发送以通过 Jenkins 进行部署的 SQL 脚本文件进行质量分析。

我正在尝试创建一个自定义规则,用于检测是否在任何 SQL 命令的末尾缺少分号 (" ; ")。 SQL 终止符(“分号”)对于使用 SQLPLUS 部署 SQL 脚本很重要。

代码示例

 insert into table_name values('wait','for','completion'); -- compliant with script 
 insert into table_name values('somename','for','good'); -- compliant with script 
 **insert into table_name values('someplace','for','game')** -- non compliant as semicolon missing
 insert into table_name values('something','for','change'); -- compliant with script 
 delete from table_name ; -- compliant with script 
 delete from table_name ; -- compliant with script 
 update table_name set name='james' where id='22';

有一个插入查询缺少分号,因此 sonarqube 应该检测到这一点,并且 jenkins 构建失败或 SONAR 质量测试失败。

请帮助创建 PLSQL 自定义规则,以通过分号检测正确的 SQL 终止。

xpath 的示例是: /COMPILATION_UNIT/ANY_DML_EXPRESSION/following-sibling::SEMICOLON -- 类似这样的

【问题讨论】:

我会简单地用 BEGIN END 块包装所有东西 我需要编写 XPATH 来检测 SQL 脚本文件中缺少的任何分号,用于 Sonarqube 分析 @lad2025 这不仅仅适用于 PLSQL,普通 SQL 命令没有开始结束块! @aejaz 我对 SonarQube 不熟悉,但对于任何看起来很难的解析程序。在您的示例中,很明显命令应该结束并且需要一个分号。但是在很多情况下它会模棱两可。例如:select * from dual begin null; end; / 在这种情况下,begin 可以是表的别名,也可以是 PL/SQL 块的开头。您可能需要限制您的要求,而只需报告程序无法解析的任何错误。 @JonHeller 我只需要一个 sql 脚本解析器工具,它可以分析我的脚本文件中是否存在任何不正确的 sql 终止符(分号)相关问题。就像 SQLPLUS 或 Toad 一样。 【参考方案1】:

您可以按照指南“Create a plugin with custom rules”,使用模板项目plsql-custom-rules。 这比 adding a rule to XPATH 更复杂,但您将拥有更多控制权。

要创建支票,您可以创建org.sonar.plsqlopen.checks.AbstractBaseCheck 的子类。 您可以使用org.sonar.check.Ruleorg.sonar.squidbridge.annotations.SqaleConstantRemediation 注释来配置检查元数据(名称、描述、密钥...)。

您通常只需要重写两个方法:

init():订阅想要的语法规则 visitNode(AstNode):分析符合订阅语法规则的节点

但首先,如issue 21 中所示,请检查您的代码是否不会因“无法解析文件”消息而出错。

我只需要知道像声纳分析这样的解析器来检测脚本文件中的编译错误

检查您的大小写是否不是可选的分号,例如“Semicolon is not required in CREATE VIEW”。 查看该源代码是检查解析器(如 sonarqube 分析)如何检测脚本文件中的编译错误的好方法。

【讨论】:

【参考方案2】:

我们过去一直在使用它,稍作修改。您可以从这里实现相同逻辑的规则开始:

https://github.com/gretard/sonar-tsql-plugin/wiki/Custom-rules#creating-more-complex-custom-rule-with-distance

【讨论】:

以上是关于Sonarqube PLSQL 自定义规则,用于在 SQL 脚本文件中检测正确的 SQL 终止符分号的主要内容,如果未能解决你的问题,请参考以下文章

Sonarqube 用于 PLSQL 脚本中的编译错误

SonarQube - 自定义规则,以防止调用某些静态方法

SonarQube pl / sql规则plsql:S1764问题

SonarQube添加自定义规则:实践验证

使用 SonarQube 自定义 Fxcop 规则

C# 的 Sonarqube 5.4 自定义规则