审核规则
了解和熟悉下面的审核规则,可以知道goinception大概做了哪些操作。
说明:下面所列出来的规则,不一定能覆盖所有goinception当前已经实现的功能,具体包括什么规则,还需要在使用过程中总结,发现,同时可以结合配置参数来详细了解这些规则。
支持语法
| 语法 | 说明 |
| use db | 会检查这个库是否存在,需要连接到线上服务器来判断。 |
| set names charset | 仅支持这一个SET命令 |
| create database | 建库 |
| create table | 建表 |
| alter table | 修改表 |
| drop table | 删除表 |
| truncate table | 清空表 |
| insert | 插入语句(包括多值插入和查询插入) |
| update | 更新语句(包括多表关联更新) |
| delete | 删除语句(包括多表关联删除) |
| inception命令集 | 查看进程,osc进程,查看/设置变量及审核级别等 |
| 用户管理命令 | 开启安全登陆后,可以创建/修改/删除用户,以及授权/收回和设置密码 |
DDL操作
create table
表属性
| 检查项 | 相关配置项 |
| 这个表不存在 | |
| 当前库存在 | |
对于create table like,会检查like的老表是不是存在。 | |
| 表名、列名、索引名的长度不大于64个字节 | |
| 对象名必须大写 | check_identifier_upper |
| 对象名允许字符[a-zA-Z0-9_] | check_identifier |
| 对象名不能使用关键字 | enable_identifer_keyword |
如果建立的是临时表,则必须要以tmp为前缀 不支持临时表! | |
| 字符集限制 | enable_set_charset,support_charset |
| 排序规则限制 | enable_set_collation,support_collation |
| 存储引擎限制 | enable_set_engine,support_engine |
| 不能建立为分区表 | enable_partition_table |
| 只能有一个自增列 | |
| 只能有一个主键 | |
| 表要有主键 | check_primary_key |
| 表要有注释 | check_table_comment |
| 至少有一个列 | |
| 表必须包含某些列 | must_have_columns |
| 表注释长度不能溢出 | |
| 不允许create table as 语法 | |
| 禁止使用Foreign key | enable_foreign_key |
列属性
| 检查项 | 相关配置项 |
| 不能设置列的字符集 | enable_column_charset |
| 列的类型不能使用集合、枚举、位图类型 | enable_enum_set_bit |
| 列必须要有注释 | check_column_comment |
| char长度大于20的时候需要改为varchar(长度可配置) | max_char_length |
| 列的类型不能是BLOB/TEXT | enable_blob_type |
| 列的类型不能是JSON | enable_json_type |
| 不能有重复的列名 | |
| 非数值列不能使用自增 | |
| 不允许无效库名/表名前缀 | |
| 每个列都使用not null | enable_nullable |
| 是否允许timestamp类型 | enable_timestamp_type |
| 如果是timestamp类型的,则要必须指定默认值。 | check_timestamp_default |
| 如果是datetime类型的,则要必须指定默认值。 | check_datetime_default |
| 不能同时有两个timestamp类型的列,如果是datetime类型,则不能有两个指定DEFAULT CURRENT_TIMESTAMP及ON UPDATE CURRENT_TIMESTAMP的列。 | check_timestamp_count,check_datetime_count |
| 只有timestamp或datatime才能指定on update | |
| on update表达式只能为CURRENT_TIMESTAMP | |
| 建议将 float/double 转成 decimal | check_float_double |
索引属性检查项
| 检查项 | 相关配置项 |
| 索引必须要有名字 | enable_null_index_name |
| Unique索引必须要以uniq_为前缀 | check_index_prefix |
| 普通索引必须要以idx_为前缀 | check_index_prefix |
| 索引的列数不能超过5个 | max_key_parts |
| 主键索引列数限制 | max_primary_key_parts |
| 主键列必须使用int或bigint | enable_pk_columns_only_int |
| 最多有5个索引 | max_keys |
| 建索引时,指定的列必须存在。 | |
| 索引中的列,不能重复 | |
| BLOB列不能建做KEY | |
| 索引长度不能超过767或3072,由实际mysql的innodb_large_prefix决定 | |
| 索引名不能是PRIMARY | |
| 索引名不能重复 | |
默认值
| 检查项 | 相关配置项 |
| BLOB/TEXT类型的列,不能有非NULL的默认值 | enable_blob_not_null |
| 如果默认值为NULL,但列类型为NOT NULL,或者是主键列,或者定义为自增列,则报错。 | |
| JSON列不能设置默认值。 | |
| 每个列都需要定义默认值,除了自增列/主键/JSON/计算列/以及大字段列之外 | check_column_default_value |
自增列
| 检查项 | 相关配置项 |
| 建表时,自增列初始值为1 | check_autoincrement_init_value |
| 如果自增列的名字不为id,说明可能是有意义的,不建议 | check_autoincrement_name |
| 自增列类型必须为int或bigint | check_autoincrement_datatype |
| 自增列需要设置无符号 | enable_autoincrement_unsigned |
ALTER
| 检查项 | 相关配置项 |
| 创建索引 | 同建表 |
| 添加字段 | 同建表 |
| 默认值 | 同建表 |
| 检查字符集 | 同建表 |
| 检查排序规则 | 同建表 |
| 检查存储引擎 | 同建表 |
| - | - |
| 表是否存在 | |
| 同一个表的多个ALTER建议合并 | merge_alter_table |
| 列是否存在 | |
| 表属性只支持对存储引擎、表注释、自增值及默认字符集的修改操作。 | |
| 是否允许change column操作 | enable_change_column |
| 是否允许列顺序变更 | check_column_position_change |
| 是否允许列类型变更 | check_column_type_change |
DML
INSERT
| 检查项 | 相关配置项 |
| 表是否存在 | |
| 列必须存在 | |
| 必须指定插入列表,也就是要写入哪些列,如insert into t (id,id2) values(...) | check_insert_field |
| 必须指定值列表。 | |
| 插入列列表与值列表个数相同 | |
| 不为null的列,如果插入的值是null,报错 | |
| 插入指定的列列表中,同一个列不能出现多次。 | |
INSERT SELECT
| 检查项 | 相关配置项 |
| 涉及的所有库/表/字段必须存在 | |
| 必须指定插入列表,也就是要写入哪些列,如insert into t (id,id2) select ... | check_insert_field |
| 是否允许select * | enable_select_star |
| 必须有where条件 | check_dml_where |
| 不能有limit条件 | check_dml_limit |
| 不能有order by rand子句 | enable_orderby_rand |
| 使用explain获取预估行数或select count获取真实行数 | 调用选项real_row_count,explain_rule |
UPDATE/DELETE
| 检查项 | 相关配置项 |
| 表必须存在 | |
| 必须有where条件 | check_dml_where |
| 不能有limit条件 | check_dml_limit |
| 不能有order by语句 | check_dml_orderby |
| 影响行数大于10000条,则报警(数目可配置) | max_update_rows |
| 对WHERE条件这个表达式做简单检查,具体包括什么不一一指定 | |
| 多表更新、删除时,每个表及涉及字段必须要存在 | |
| 限制一条insert values的总行数 | max_insert_rows |
| update 多表关联时,如果set未指定表前缀,自动判断 | |
| 多表时判断未指明表前缀的列是否有歧义 | |
| update多表关联时,如果set了多个表的字段,同样支持回滚语句生成 | |
| 使用explain获取预估行数或select count获取真实行数 | 调用选项realRowCount,explain_rule |
| mysql版本在5.6之前时,自动将语句转换为select做explain | |
设置数据库sql_safe_updates参数 | sql_safe_updates |
| 多表关联时,审核join语句是否包含on子句 | check_dml_where |
| 条件中的列是否存在隐式类型转换 | check_implicit_type_conversion |
| update set 判断set使用了逗号还是and分隔 | |
说明