前提条件
- 用户需要具有进入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”操作符连接过滤条件 离线