PawSQL更新 | 新增7个SQL可维护性/安全性规则

2024-08-20 19:55:05 浏览数 (2)

PawSQL最新版本针对DML和DQL新增了审核和重写优化规则共计33个,整体的规则数目达到了83个,覆盖了正确性,安全性、可维护性、性能四个方面的SQL质量问题,并提供了优化建议,已经形成比较完善的针对数据操作的SQL质量审查体系。本文介绍其中新增的5可维护性规则以及2个安全性规则。

可维护性规则

1. 在一个查询块中,多表应该使用别名

规则描述

如果在一个查询块存在多个表的引用,建议为每个表起一个简单易认的别名,并为所有的字段添加别名前缀,方便阅读代码以及后续维护。

默认预警级别
  • 提示
触发条件
  • 一个查询块中存在多个表引用

2. 避免表引用使用重复的别名

规则描述

查询语句中存在别名相同的表引用/子查询,或者是表的别名和其他表名本身相同,会导致代码可读性急剧恶化,且不利于后续维护。

默认预警级别
  • 警告
触发条件
  • 存在别名相同的表引用/子查询
  • 或表的别名和其他表名本身相同

3. 建议使用'<>'代替'!='

规则描述

'!=' 是非标准的运算符,'<>' 才是SQL中标准的不等于运算符。为了提升SQL的可移植性和规范程度,建议使用'<>'代替'!='。

默认预警级别
  • 警告
预警触发条件
  • SQL语句中出现'!=' 运算符

4. 对于入参建议使用变量绑定

规则描述

通过变量绑定,可以重用SQL的执行计划,降低SQL解析的时间;同时还可以避免SQL注入,提升应用的安全性。

默认预警级别
  • 警告
预警触发条件
  • 当用户设定'strict'模式时,在条件及排序的字段中出现任意常量
  • 当用户设定'loose'模式时,在条件及排序的字段中不存在变量绑定

5. SQL长度超过阈值

规则描述

过长的SQL可读性较差,难以维护,且容易引发性能问题;如果SQL的长度超过用户指定的阈值,则触发该规则。具体规则阈值可以根据业务需求调整,默认值:1024。

默认预警级别
  • 提升
预警触发条件
  • SQL文本长度超过阈值

5. 禁止使用常见 SQL 注入函数

规则描述

SQL注入是一种常见的网络攻击技术,它利用不安全的输入验证和构造SQL查询来获取未授权的信息或是数据库注入恶意代码。常见的SQL注入函数包括database(); user(); version(); sleep()等。

默认预警级别
  • 禁止
触发条件
  • SQL中存在用户配置的函数名

7. NPE重写

规则描述

SQL的NPE(Null Pointer Exception)问题是指在SQL查询中,当聚合列全为NULL时,SUM、AVG等聚合函数会返回NULL,这可能会导致后续的程序出现空指针异常。譬如对于下面的SQL:

代码语言:javascript复制
select sum(t.b) from (values row(1,null)) as t(a,b);

可以使用如下方式避免NPE问题:

代码语言:javascript复制
SELECT IFNULL(SUM(t.b), 0) from (values row(1,null)) as t(a,b);

这会返回0而不是NULL,避免了空指针异常。

Oracle:NVL(); SQL Server和MS Access:ISNULL(); MySQL:IFNULL()或COALESCE();

默认预警级别
  • 警告
触发条件
  1. SUM或AVG聚集函数
  2. 聚集函数的参数可能全为NULL, 包括
    1. 参数是列,列定义可以为空
    2. 参数是表达式,表达式可以为空
    3. 列定义不可为空,但是是外连接的内表,结果可能为空

关于PawSQL

PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL优化产品包括

  • PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,
  • PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。
  • PawSQL Engine, 是PawSQL系列产品的后端优化引擎,可以以docker镜像的方式独立安装部署,并通过http/json的接口提供SQL优化服务。
  • PawSQL Ora2pg/PawsQL Ora2op,Oracle语法的SQL应用转换为PostgreSQL和openGauss语法的工具。

0 人点赞