数据操作
SQL中的数据操作包括DML语句和DQL语句,主要涉及数据的插入(INSERT)、查询(SELECT)、更新(UPDATE)和删除(DELETE)等操作。这些数据操作语句的不恰当写法可能会导致SQL在正确性、安全性、可维护性、性能方面的各种问题,PawSQL针对数据操作语句从这四个角度共设计了85个审核规则。
正确性规则
1. INSERT...VALUES列和值数量一致
规则描述
INSERT...VALUES语句是根据列和值的顺序建立对应关系的,如果二者数量不一致,说明语句不正确。
默认预警级别
- 禁止
触发条件
- INSERT...VALUES的列显式的指定
- INSERT...VALUES列和值数量一致
2. 避免常量字符串开头或结尾包含空格
规则描述
一个字符串开头和结尾的空格通常来讲都没有意义,在SQL中出现的类似常量通常是由于开发人员误输入导致的,但是它可能会影响SQL查询的结果,因此需要特别关注。
默认预警级别
- 警告
触发条件
- 常量字符串开头或结尾包含空格
- 常量字符串出现在判断条件中
3. 避免COUNT DISTINCT多个可空列
规则描述
当你使用COUNT(DISTINCT)
进行多列的计算时,它的计算结果可能和你预想的不同。COUNT(DISTINCT col)
计算该列除 NULL 之外的不重复行数,而COUNT(DISTINCT col, col2)
则会排除掉任何一列为NULL
的行。
譬如对于如下的查询,对列a和列组合(a,b)的统计不同值的个数,
select count(distinct t.a) a_cnt, count(distinct t.a,t.b) a_b_cnt
from (values
row(1,2),
row(3,null)) as t(a,b);
其返回对于列a为2,而对于列组合(a,b)则为1,这可能不符合您的预想, 需特别关注。
默认预警级别
- 提示
触发条件
- SQL中存在COUNT DISTINCT函数
- COUNT的参数包括二个或两个以上的表达式
- 参数至少有一个是可以为空的
4. 禁止使用常见 SQL 注入函数
规则描述
SQL注入是一种常见的网络攻击技术,它利用不安全的输入验证和构造SQL查询来获取未授权的信息或是数据库注入恶意代码。常见的SQL注入函数包括database(); user(); version(); sleep()等。
默认预警级别
- 禁止
触发条件
- SQL中存在用户配置的函数名称
5. 禁止对非整形常量进行GROUP BY
规则描述
对非整数常量进行分组,其实没有意义;且在PostgreSQL里会语法报错,但是在MySQL里却不会,需特别关注。
SELECT l_orderkey, sum(l_quantity)
FROM lineitem
GROUP BY '1';
默认预警级别
- 禁止
触发条件
- 分组字段为非整型的常量
6. 避免UPDATE/DELETE 中使用 LIMIT 子句
在UPDATE
语句中使用LIMIT
会导致不可预测更新的数据,需谨慎使用。所以PawSQL会检查此类写法,并进行提醒。
默认预警级别
- 警告
触发条件
- 语句为UPDATE或DELETE
- 语句中使用 LIMIT 子句
7. 避免在UPDATE/DELETE中使用LIMIT而没有ORDER BY
规则描述
在UPDATE
或DELETE
语句中使用LIMIT
而没有ORDER BY
,会导致每次执行的结果不一致。PawSQL会检查此类写法,并进行提醒。
PostgreSQL/Opengauss不支持在
UPDATE
或DELETE
语句中使用ORDER BY
子句。
默认预警级别
- 警告
触发条件
- 语句为UPDATE或DELETE
- 语句中使用 LIMIT 子句而没有使用ORDER子句