DMS的安全规则中新接入了SQL审核优化建议,在SQLConsole或数据变更中,对提交的SQL语句进行规范审核并提出相关优化建议。本文档向您介绍SQL审核优化建议与其自定义配置的操作步骤。

前提条件

  • 您的系统角色为DBA管理员,更多信息请参见用户管理
  • 安全规则集的数据库引擎为MySQL、RDS MySQL、PolarDB MySQL、MariaDB、PolarDB MySQL、PolarDB-X、AnalyticDB MySQL、OceanBase MySQL,更多信息,请参见创建安全规则

系统行为动作

DMS预定义了三种系统行为动作:

  • 必须改进:若开发人员不改进该语句,系统会自动阻断流程,并进行相应提示,系统初始化SQL审核规则中不包含必须改进
    说明 SQL审核规则的检测项请参见检测项

    例如:将表要有主键的规则设置为必须改进,若开发人员在创建表时未设置主键,系统将会拦截SQL语句的执行,并要求开发人员针对该项规则进行修改,验证通过后才允许系统执行。

  • 潜在问题:提醒开发人员该SQL存在问题,但不会阻断流程。
  • 建议改进:建议开发人员进行改进,且不阻断流程。

不同管控模式下的功能支持情况

DMS提供三种不同的管控模式,更多信息,请参见管控模式

支持项 安全协同 稳定变更 自由操作
开启或关闭规则 支持 支持 支持
配置行为动作 支持 不支持配置 不支持配置
更改规则参数

部分规则可填写参数,例如表的索引数量、表的字段数量。

支持 支持 不支持配置
配置备注

配置规则的业务背景。

支持 不支持配置 不支持配置

操作步骤

安全规则中已生成默认的SQL审核规则,本示例向您介绍如何进行自定义配置,将表要有主键的规则设置为必须改进

  1. 登录新版DMS控制台
  2. 在页面顶部,选择全部功能 > 系统管理 > 安全规则,进入安全规则页面。
  3. 单击目标安全规则右侧操作列下的编辑
    SQL审核优化-编辑安全规则
  4. 详情页左侧的导航栏中,单击SQL审核优化建议
  5. 单击表要有主键规则右侧的编辑
    编辑SQL审核规则
    说明 您可以单击标记(规则生效范围,目前包含DDL语句、DML语句(增删改查)、行为动作状态(开启或关闭规则)右侧的筛选按钮图标,进行快速筛选。
  6. 规则内容配置弹窗中,配置如下信息。
    规则内容配置
    参数名 说明
    行为动作 行为动作设置为必须改进
    说明 系统初始化规则中不包含必须改进
    备注 输入此规则的备注信息,如业务背景信息。
  7. 单击确定
    说明 您已配置完成该项SQL审核规则,后续当开发人员在提交对应实例的建表或修改表结构的SQL语句时,若不符合表要有主键该项规则,系统会自动阻断流程。

检测项

当前SQL审核优化建议支持的检测项如下。

类别 检测项 适用的SQL语句 检测点
表结构定义 库属性 CREATE DATABASE 限制建库字符集
表属性
  • CREATE TABLE
  • ALTER TABLE
  • 表要有主键
  • 表要有备注
  • 表不能使用外键
  • 限制表名大小写
  • 限制表存储引擎
  • 表禁止使用分区设置
  • 表必须包含某些列
  • 表字符集限制
  • 表校验规则限制
  • 表名不能是关键字
  • 表限制索引的数量
  • 表限制字段的数量
  • 表限制自增初始值
  • 限制主键列必须自增
  • 限制使用视图
  • 限制使用触发器
  • 限制使用事件
  • 限制使用存储过程
  • 限制使用自定义函数
  • 修改表字符集建议用ALTER TABLE CONVERT语法
列属性
  • CREATE TABLE
  • ALTER TABLE
  • 字段名不能是关键字
  • 限制字段名大小写
  • 不能设置列的字符集
  • 限制列不能使用的数据类型
  • 列必须要有注释
  • 限制char类型字段长度
  • 限制varchar类型字段长度
  • 每个列都使用NOT NULL
  • 自增列名字建议为ID
  • 自增列需要设置无符号
  • 不能使用floatdouble类型(建议用decimal替换)
  • 每个列都要有默认值
  • 不能设置列的校验集
  • 修改表禁止重命名列
  • 修改表禁止删除列
  • 修改表禁止更改数据类型
  • 修改表新增字段要求都可空
  • 修改表新增非空字段时要明确指定默认值
  • 修改字段将可空改为非空时要明确指定默认值
  • 不能使用enum类型(建议用tinyintchar代替)
  • 字段禁用ZEROFILL属性
索引属性
  • CREATE TABLE
  • ALTER TABLE
  • 索引必须要有名字
  • 限制Unique索引名格式
  • 限制普通索引名格式
  • 限制索引列个数
  • 限制主键列个数
  • 限制主键列类型
  • 修改表禁止删除主键
  • 修改表禁止删除索引
数据查询
  • SELECT
  • INSERT SELECT
  • 子查询(嵌套在UPDATEDELETE中)
  • SELECT语句建议指定WHERE条件
  • SELECT语句不建议使用ORDER BY RAND()
  • SELECT语句不建议对常量进行GROUP BY
  • SELECT语句不建议对常量进行ORDER BY
  • SELECT语句不建议对不同的表GROUP BYORDER BY
  • SELECT语句不建议ORDER BY多个字段使用不同方向排序
  • SELECT语句不建议GROUP BYORDER BY表达式或函数
  • SELECT语句不建议使用union
  • SELECT语句限制多表关联的数量
  • SELECT语句限制LIMIToffset大小
  • SELECT语句不建议使用HAVING子句
数据变更 插入数据
  • INSERT SELECT
  • INSERT [IGNORE]
  • REPLACE
  • 插入语句建议指定INSERT字段列表
  • 插入语句中INSERT字段名不能重复
  • 插入语句不能为NOT NULL列插入NULL
  • 插入语句中INSERT字段列表要和值列表匹配
  • 插入语句限制一条INSERT VALUES的总行数
  • 插入语句检测INSERT的表或字段是否存在
  • 插入语句不建议使用SYSDATA()函数
修改、删除数据
  • UPDATE
  • DELETE
  • UPDATEDELETE语句限制多表关联的数量
  • UPDATEDELETE语句建议指定WHERE条件
  • UPDATEDELETE语句检测WHERE条件是否包含子查询
  • UPDATEDELETE语句限制LIMIT数据量大小
  • UPDATEDELETE语句检测多表关联语法是否完整(如join遗漏on子句)
  • UPDATEDELETE语句不能有ORDER BY子句
  • UPDATE语句检测SET多个列之间的分隔符(and非法)
  • UPDATE多表时检测SET的列是否指定表前缀
  • UPDATE语句检测涉及表或字段是否存在
  • UPDATE语句检测是否更新了主键
  • UPDATE语句检测是否更新了唯一键
  • UPDATE语句建议同时更新表上的“修改时间”列
  • UPDATE语句不建议更新表上的“创建时间”列
SQL WHERE条件 包含WHERE条件子句的SELECTUPDATEDELETEINSERT SELECT语句。
  • WHERE条件中不建议索引字段包含数学运算或函数运算
  • WHERE条件中不建议使用前通配符查找
  • WHERE条件中检测没有通配符的LIKE语句
  • WHERE条件中不建议使用反向查询(not in/ not like
  • WHERE条件中限制IN子句包含元素个数
  • WHERE条件中检测字段是否存在隐式类型转换
  • WHERE条件中检测是否通过OR操作符连接过滤条件