SQL开发规范一览表
DBSC 提供 SQL 开发规范,方便在企业多人协作开发的场景下提供安全管控,确保企业数据库的安全。本文提供当前支持的 SQL 开发规范一览表,以及规范支持的数据源类型。
SQL Review
SQL Review
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 列 |
限制自增列名字为 ID |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制自增列为无符号 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 CHAR 类型字段长度 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制字段名大小写 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 字段名不能是关键字 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制列要有注释 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制列要有默认值 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制列不可空(NOT NULL) |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制列不能使用部分数据类型 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 不能设置列的字符集 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 不能设置列的校对集 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 VARCHAR 类型字段长度 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 分区键为 CHAR、VARCHAR 类型时长度限制 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 分区键的字段类型 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 不建议索引字段是 VARCHAR 类型时其长度大于阈值 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 字段危险操作管控 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 表(DDL) |
限制表字段的数量 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 修改表字符集建议用 ALTER TABLE CONVERT 语法 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制表字符集 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制表校验规则 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制表名大小写 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| 表名不能是关键字 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制表必须注释 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 表要有主键 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制表不能使用外键 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| OnlineDDL:大表结构变更风险检测 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 表需要包含某些列 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制表存储引擎 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制建表自增初始值 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 同一张表的多条 ALTER 语句建议合为一条 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 数据库 |
限制库的字符集 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 更新 |
UPDATE/DELETE 语句建议指定 WHERE 条件 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE/DELETE 语句不能有 ORDER BY 子句 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 多表时检测 SET 的列是否指定表前缀 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 语句不建议更新表上的“创建时间”列 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 语句检测是否更新了主键 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 语句建议更新表上的“修改时间”列 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 语句检测 SET 多个列之间的分隔符( AND 非法) |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 语句检测表/字段是否存在 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 语句检测是否更新了唯一键 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE/DELETE 语句必须使用索引 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 UPDATE/DELETE 单个语句总影响行数 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| OnlineDML:大表数据变更风险检测 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE 不可以更新表上的分区键 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 对象 |
字段禁用 Zerofill 属性 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 禁止事件相关操作 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 禁止自定义函数相关操作 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 分区键对应字段必须在主键、唯一键中 |
✔️ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 禁止触发器相关操作 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 禁止视图相关操作 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 索引 |
限制表索引数量 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 索引需要设置名称 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制普通索引名格式 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制主键列必须自增 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制主键包含列的个数 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制主键列类型 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制单个索引包含列的个数 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制唯一索引名格式 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 索引名称不允许重复 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 分区键对应字段必须在主键、唯一键中 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 检查 DDL 语句中可能存在的冲突 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 写入 |
INSERT 语句字段名不能重复 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| INSERT 语句字段列表和值列表要匹配 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| INSERT 语句建议指定 INSERT 字段列表 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| INSERT 语句不能为 NOT NULL 列插入 NULL 值 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| INSERT 语句不建议使用 SYSDATE()函数 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 INSERT 语句一条 INSERT VALUES 的总行数 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| INSERT 语句检测 INSERT 的表/字段是否存在 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| INSERT/REPLACE必须指定分区键 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 分区键不可写入中文 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 查询 |
SELECT 时不建议 GROUP BY 常量 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 SELECT 语句多表关联的数量 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句建议包含 WHERE 条件 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 SELECT 语句 LIMIT 的 OFFSET 大小 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议对不同的表 GROUP BY 或 ORDER BY |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议对常量进行 ORDER BY |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议 ORDER BY 多个字段使用不同方向排序 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议使用 ORDER BY RAND() |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议使用 HAVING 子句 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议使用 UNION |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 WHERE 条件中 IN 子句包含元素个数 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| WHERE 条件中不建议使用前通配符查找 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| WHERE 条件中不建议索引字段包含数学运算或函数运算 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| WHERE 条件中不建议使用反向查询(NOT IN / NOT LIKE) |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| WHERE 条件中检测没有通配符的 LIKE 语句 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议 GROUP BY 或 ORDER BY 表达式或函数 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句不建议使用 * |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT语句不建议嵌套多层子语句 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SELECT 语句必须使用索引 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 禁止使用非分区键对分片表进行关联 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| WHERE 条件中建议带上分区键 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| 查询/变更 |
WHERE 条件中检测字段是否存在隐式类型转换 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| WHERE 条件中检测是否通过 OR 操作符连接过滤条件 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 表(DML) |
UPDATE/DELETE 语句检测 WHERE 条件是否包含子查询 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 UPDATE/DELETE 语句 LIMIT 数据量大小 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| UPDATE/DELETE 语句检测多表关联语法是否完整(JOIN 遗漏 ON 子句) |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制 UPDATE/DELETE 语句多表关联的数量 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 查询(DML) |
禁止对 WHERE 条件的分区键进行数学运算和函数运算 |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
| ["DDL", "DML"] |
SQL类型风险管控 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| ["DML", "DELETE"] |
DELETE语句检测表是否存在 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
SQL 窗口
SQL 窗口
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 权限 |
开启 SQL 窗口数据更新类型检查 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 执行变更 SQL 校验影响行数提示 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| 开启 SQL 任务结构更新类型检查 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| NoSQL 类型数据库 SQL 窗口支持命令 |
❌ |
❌ |
❌ |
❌ |
✔️ |
✔️ |
✔️ |
| SQL 任务 DDL 执行时间窗口 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| SQL 任务 DML 执行时间窗口 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| SQL 窗口 DQL 执行时间窗口 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| WHERE 条件包含未授权敏感列 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| NoSQL 类型数据库 SQL 任务支持命令
|
❌ |
❌ |
❌ |
❌ |
✔️ |
✔️ |
✔️ |
| 拦截解析失败的SQL语句 |
✔️ |
✔️ |
✔️ |
✔️ |
✔️ |
✔️ |
✔️ |
| 数据安全 |
单次查询最大返回行数 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| 单次查询超时时间控制 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| 限制 SQL 窗口编辑结果集 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
✔️ |
| 允许 SQL 窗口导出结果集 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
SQL 任务
SQL 任务
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 权限 |
SQL 任务执行人配置 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 开启 SQL 任务数据更新类型检查 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 开启 SQL 任务结构更新类型检查 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SQL 任务 DML 执行时间窗口 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SQL 任务 DDL 执行时间窗口 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| SQL 任务资源并发控制 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 数据安全 |
OnlineDDL 配置 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
数据导出
数据导出
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 权限 |
导出任务执行人配置 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 限制访问来源 IP |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 数据安全 |
数据导出超时时间限制 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| Excel文件增加数字水印 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 导出行数限制 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 数据导出文件加密 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
数据导入
数据导入
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 权限 |
导入任务执行人配置 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 数据导入操作检查 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
数据生成
数据生成
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 权限 |
生成任务执行人配置 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 测试数据生成记录数阈值配置 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
| 开启测试数据生成功能 |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
数据归档与清理
数据归档与清理
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 数据安全 |
数据归档与清理配置 |
✔️ |
✔️ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
数据追踪与回滚
数据追踪与回滚
| 分类 |
规则名称 |
MySQL |
PostgreSQL |
GaiaDB |
GaiaDB-X |
Redis |
PegaDB |
MongoDB |
| 数据安全 |
数据追踪 Binlog 文件总的大小阈值配置(GB) |
✔️ |
❌ |
✔️ |
✔️ |
❌ |
❌ |
❌ |
![]()