# 审核规范及原则

**说明**:下面所列出来的规则,不一定能覆盖所有goInception当前已经实现的功能,具体包括什么规则,还需要在使用过程中总结,发现,同时可以结合配置参数来详细了解这些规则。

## 支持的语句类型
* use db:此时会检查这个库是不是存在,需要连接到线上服务器来判断。
* set option:现在只需要支持set names charset,设置其它变量时都报错不支持。
* 创建数据库语句
* 插入语句(包括多值插入)
* 查询插入语句
* 删除语句(包括多表删除)
* 更新语句(包括多表更新)
* 创建表语句
* 删除表语句
* 修改表语句
* Truncate表语句
* inception命令集语句(包括管理命令)

## 插入语句检查项
* 表是否存在
* 必须指定插入列表,也就是要对哪几个列指定插入值,如insert into t (id,id2) values(...),(可配置)
* 必须指定值列表,与上面对应的列,插入的值是什么,必须要指定。
* 插入列列表与值列表个数相同,上面二者的个数需要相同,如果没有指定列列表(因为可配置),则值列表长度要与表列数相同。
* 不为null的列,如果插入的值是null,报错(可配置)
* 插入指定的列名对应的列必须是存在的。
* 插入指定的列列表中,同一个列不能出现多次。
* 插入值列表中的简单表达式会做检查,但具体包括什么不一一指定

## 更新、删除语句检查项
* 表是否存在
* 必须有where条件(可配置)
* delete语句不能有limit条件(可配置)
* 不能有order by语句(可配置)
* 影响行数大于10000条,则报警(数目可配置)
* 对WHERE条件这个表达式做简单检查,具体包括什么不一一指定
* 对更新列的值列表表达式做简单检查,具体不一一指定
* 对更新列对象做简单检查,主要检查列是不是存在等
* 多表更新、删除时,每个表必须要存在

## 建表语句检查项
### 表属性的检查项
* 这个表不存在
* 对于create table like,会检查like的老表是不是存在。
* 对于create table db.table,会检查db这个数据库是不是存在
* 表名、列名、索引名的长度不大于64个字节
* 如果建立的是临时表,则必须要以tmp为前缀
* 必须要指定建立innodb的存储引擎(可配置)
* 必须要指定utf8的字符集(字符串可配置,指定支持哪些字符集)
* 表必须要有注释(可配置)
* 表不能建立为分区表(可配置)
* 只能有一个自增列
* 索引名字不能是Primay
* 不支持Foreign key(可配置)
* 建表时,如果指定auto_increment的值不为1,报错(可配置)
* 如果自增列的名字不为id,说明有可能是有意义的,MySQL这样使用比较危险,所以报警(可配置)
### 列属性的检查项
* 不能设置列的字符集(可配置)
* 列的类型不能使用集合、枚举、位图类型。(可配置)
* 列必须要有注释(可配置)
* char长度大于20的时候需要改为varchar(长度可配置)
* 列的类型不能是BLOB/TEXT。(可配置)
* 每个列都使用not null(可配置)
* 如果列为BLOB/TEXT类型的,则这个列不能设置为NOT NULL。
* 如何是自增列,则使用无符号类型(可配置)
* 如果自增列,则长度必须要大于等于4个字节(可配置)
* 如果是timestamp类型的,则要必须指定默认值。
* 对于MySQL5.5版本(包含)以下的数据库,不能同时有两个TIMESTAMP类型的列,如果是DATETIME类型,则不能定义成DATETIME DEFAULT CURRENT_TIMESTAMP及ON UPDATE CURRENT_TIMESTAMP等语句。
* 每个列都需要定义默认值,除了自增列、主键列及大字段列之外(可配置)
* 不能有重复的列名
### 索引属性检查项
* 索引必须要有名字
* 不能有外键(可配置)
* Unique索引必须要以uniq_为前缀(可配置)
* 普通索引必须要以idx_为前缀(可配置)
* 索引的列数不能超过5个(数目可以配置)
* 表必须要有一个主键(可配置)
* 最多有5个索引(数目可配置)
* 建索引时,指定的列必须存在。
* 索引中的列,不能重复
* BLOB列不能建做KEY
* 索引长度不能超过766
* 不能有重复的索引,名字及内容
### 默认值检查项
* BLOB/TEXT类型的列,不能有非NULL的默认值
* MySQL5.5以下(含)的版本,对于DATETIME类型的列,不能有函数NOW()的默认值。
* 如果设置默认值为函数,则只能是NOW()。
* 如果默认值为NULL,但列类型为NOT NULL,或者是主键列,或者定义为自增列,则报错。
* 自增列不能设置默认值。

## 修改表语句检查项
* 表是不是存在
### 创建索引检查项
* 同上面创建表中的索引检查项
###加列检查项
* 同上面创建表中的列检查项
###修改表检查项
* 表是不是存在
* 如果语句块中存在多条对同一个表的修改语句,则建议合并成一个ALTER语句
* 列是否存在
* 剩下的同上面创建表,创建索引,创建列,默认值等检查项一样
### 删除索引检查项
* 表是不是存在
* 检查索引是不是存在
### 修改列的默认值检查项
* 同默认值检查项
### 修改表属性
* 表属性只支持对存储引擎、表注释、自增值及默认字符集的修改操作。
* 修改存储引擎时检查是不是Innodb(可配置)。
* 字符集修改检查是不是属于设置参数的值(支持字符集可配置)。
###转换表字符集
* 字符集修改检查是不是属于设置参数的值(支持字符集可配置)。

# 说明
* SQL审核主要针对mysql 5.7版本,其他版本支持会有通用的支持,但细节处可能会有差异,如果有什么问题,欢迎提交Issues来共同建设。