1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hanchuanchuan-goInception

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
rules.md 5.8 КБ
Копировать Редактировать Исходные данные Просмотреть построчно История
hanchuanchuan Отправлено 6 лет назад 696524b

审核规范及原则

说明:下面所列出来的规则,不一定能覆盖所有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来共同建设。

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/hanchuanchuan-goInception.git
git@gitlife.ru:oschina-mirror/hanchuanchuan-goInception.git
oschina-mirror
hanchuanchuan-goInception
hanchuanchuan-goInception
v1.2.4