前提条件
- 用户需要具有进入SQL规范界面的菜单权限。菜单权限请参考权限说明。
- SQL规范为企业版功能,目前支持MySQL、PostgreSQL、DRDS三种数据库类型。
注意事项
SQL规范与实例关联,DMS系统针对每种数据库提供默认的SQL规范,默认规范不可删除。
操作步骤
- 用户登录DMS系统。
- 在左侧菜单栏依次选择SQL治理 > SQL规范。
规范审核结果
DMS定义了两种规范审核结果:
- 强制改进:SQL审核存在强制改进项会阻断用户在查询窗口、SQL变更、实例管理进行的执行动作。用户将强制改进项修改之后才能正常执行SQL。
- 建议改进:SQL审核存在建议改进项不会阻断用户的执行动作,但是会把改进项提示给用户。
功能介绍
DMS提供了搜索规范、创建SQL规范、删除SQL规范、编辑SQL规范、编辑SQL规范内规则、将SQL规范与实例关联等丰富的功能。
创建SQL规范
用户可以根据数据库类型创建不同的SQL规范,创建方式有直接创建和复制创建两种。创建好的SQL规范会包含默认的规则集,用户可根据自身需求调整规则内容,并与相应的实例进行关联。
删除SQL规范
用户可以删除无用的SQL规范,需要注意的是,默认规范不可删除,与实例关联的规范不可删除。
编辑SQL规范
用户可以编辑非内置SQL规范的规范名称和描述,对不同的SQL规范进行区分。
搜索SQL规范
用户可以通过规范名称对SQL规范进行模糊搜索。
关联实例
用户可以在SQL规范列表界面点击关联实例,在弹出的实例列表中选择实例与SQL规范关联。此外用户可以点击已关联实例,查看与当前SQL规范关联的实例列表信息。
编辑规则
用户可以在SQL规范列表界面点击编辑,进入规则编辑界面。在此界面,用户可以通过规则类型、规则级别、规则名称对规则进行查询,也可以编辑规则的生效状态、规则级别、某些规则的参数值、描述等内容。
规则内容
MySQL数据库默认SQL规范包含43条规则,DRDS数据库默认SQL规范包含27条规则,PostgreSQL数据库默认SQL规范包含53条规则,具体如下表:
规则类型 适用的数据库 适用的SQL语句 规则名称 库 MySQL、PostgreSQL CREATE DATABASE 限制创建库的字符集
表
MySQL、PostgreSQL
CREATE TABLE
表要有主键 MySQL、PostgreSQL 表要有备注 MySQL、PostgreSQL 限制表名大小写 MySQL 限制表存储引擎 MySQL、PostgreSQL 禁止使用分区表 MySQL、PostgreSQL 表要包含哪些列 MySQL 限制表字符集 MySQL、PostgreSQL 表名不能是关键字 MySQL、PostgreSQL 限制表字段数量
列
MySQL、PostgreSQL
CREATE TABLE
字段名不能是关键字 MySQL、PostgreSQL 限制字段名大小写 MySQL 不能设置列的字符集 MySQL、PostgreSQL 限制列不能使用部分数据类型 MySQL、PostgreSQL 列要有注释并限制长度 MySQL、PostgreSQL 限制char类型字段长度 MySQL、PostgreSQL 限制varchar类型字段长度
索引
PostgreSQL CREATE INDEX 建议以create index concurrently方式创建索引 MySQL、PostgreSQL CREATE TABLE 限制单表中索引数量
更新
MySQL、DRDS
UPDATE/DELETE
update/delete语句限制多表关联的数量 MySQL、DRDS、PostgreSQL update/delete语句建议指定where条件 MySQL、DRDS、PostgreSQL update/delete语句检测where条件是否包含子查询 MySQL、DRDS update/delete语句不能有order by子句 MySQL、DRDS、PostgreSQL update/delete语句检测涉及表/字段是否存在 MySQL、DRDS、PostgreSQL 限制某些表UPDATE/DELETE单个语句的总影响行数 MySQL、DRDS、PostgreSQL update语句检测是否更新了主键 PostgreSQL update语句检测是否更新了唯一键 DRDS 禁止使用truncate table语句 DRDS update/delete语句不能带limit条件
写入
MySQL、DRDS、PostgreSQL
INSERT
插入语句建议指定insert字段列表 插入语句中insert字段名不能重复 插入语句中insert字段列表要和值列表匹配 插入语句限制一条insert values的总行数 插入语句检测insert的表/字段是否存在 PostgreSQL 插入语句不能为not null列插入null值
查询
MySQL、DRDS、PostgreSQL
SELECT
select语句不建议group by或order by表达式或函数 select语句不建议order by多个字段使用不同方向排序 select语句不建议使用having子句 select语句不建议使用order by rand() select语句不建议使用select * select语句不建议使用union select语句不建议对不同的表group by或order by select语句建议指定where条件 select语句限制limit的offset大小 select语句限制多表关联的数量 MySQL、DRDS 多表关联的select语句建议指定where条件 PostgreSQL 多表关联的select语句建议指定关联条件
对象
PostgreSQL
CREATE
对象名称禁止包含中文 PostgreSQL 对象名称禁止以pg_、pgxc、sys_、__或者数字开头 PostgreSQL 对象名称禁止使用双引号 PostgreSQL 限制对象名长度 PostgreSQL 禁止使用触发器 PostgreSQL 禁止使用函数 PostgreSQL 禁止使用存储过程 系统 PostgreSQL ALTER 禁止关闭autovacuum
语句
PostgreSQL
包含WHERE条件子句的SELECT、UPDATE、DELETE语句等
禁止在where条件中使用前缀是%的like语法 PostgreSQL 使用IS NULL判断是否为NULL值 PostgreSQL 禁止在where条件中使用<>或者!=操作符 PostgreSQL 不建议使用cascade MySQL、DRDS、PostgreSQL
where条件中不建议使用反向查询(not in/not like) where条件中检测是否通过“or”操作符连接过滤条件