sqle
sqle copied to clipboard
使用session.context的审核,上下文关联和基础对象审核功能能够开启关闭
背景
SQL的上下文关联设计之初也是为了满足sql审核上线的,在sqle 的扫描任务中,sql之间没有关联性且扫描的sql可能也是已经上线过了,因此有部分场景不应该进行上下文关联和基础的对象验证。
例如:
某扫描任务中扫描到 create table的SQL,此时如果对create table进行连库审核,必然触发表已存在的审核建议
详见文档(pageId=36632145)
影响面
影响插件
MySQL, TiDB, OceanBase For MySQL 目前会使用到session.Context
开发方案
整体方案
- 新增一个规则, 用于控制开启或关闭基础对象检查和上下文关联, 位于全局配置中
- 一旦开启这个规则, 所有的库表结构检查都停止运行, context会变成一个永远为最开始状态的context
方案说明
所有库表检查全部取消, 因为库表改了或者没了不代表当时也是这样
方案细节
规则调整
离线无效检查流程 将在线的检查流程中不依赖下发sql结果的部分提取出来加入离线检查流程中
永远通过规则列表
规则名 | 规则类型 | 通过原因 |
---|---|---|
使用explain加强预检查 | 全局配置 | explain本身是用来检查基础对象是否正确的 |
存在多条对同一个表的修改语句,建议合并成一个ALTER语句 | 使用建议 | 没有上下文了, 所以不存在多个语句的情况 |
特殊处理规则列表
规则名 | 规则类型 | 改动后表现 |
---|---|---|
无效检查 | 这不是规则 | 关闭对象检查后进入离线无效检查流程, 离线无效检查流程只会进行基础的sql检查, 不会通过下发sql的结果执行其他判断逻辑 |
查询的扫描不建议超过指定行数(默认值:10000) | DML规范 | 获取执行计划失败跳过后续检查 |
该查询使用了文件排序 | DML规范 | 获取执行计划失败跳过后续检查 |
该查询使用了临时表 | DML规范 | 获取执行计划失败跳过后续检查 |
检查DML操作的表是否超过指定数据量 | DML规范 | 获取表空间大小失败跳过后续检查 |
检查DDL操作的表是否超过指定数据量 | DDL规范 | 获取表空间大小失败跳过后续检查 |
库表不存在或表结构不完整直接跳过检查的规则列表
规则名 | 规则类型 | 跳过的SQL类型 |
---|---|---|
禁止将blob类型的列加入索引 | 索引规范 | alter table, create index |
检查DDL创建的新索引对应字段是否已存在过多索引 | 索引规范 | alter table, create index |
建议创建约束前,先行创建索引 | 索引规范 | 全部 |
表必须有主键 | 索引规范 | alter table |
主键禁止使用自增 | 索引规范 | alter table |
主键建议使用自增 | 索引规范 | alter table |
主键建议使用 bigint 无符号类型,即 bigint unsigned | 索引规范 | alter table |
建议选择可选性超过阈值字段作为索引 | 索引优化 | 全部 |
检查DDL是否创建冗余的索 | 索引优化 | alter table, create index |
索引创建建议 | 索引优化 | 所有 |
避免对条件字段使用函数操作 | DML规范 | 所有 |
条件字段存在数值和字符的隐式转换 | DML规范 | 所有 |
建议使用规定的数据库排序规则 | DDL规范 | 所有 |
必须使用指定数据库字符集 | DDL规范 | 所有 |
必须使用指定数据库引擎 | DDL规范 | 所有 |
代码逻辑
关闭上下文关联实现逻辑
- 当前添加上下文的位置统一在 MysqlDriverImpl.Audit() 中通过调用i.Ctx.UpdateContext(nodes[0])实现 , 对应规则启用后不再调用此方法更新上下文
- 在MysqlDriverImpl.Ctx外包一个方法, 用于获取Ctx, 如果开启了此规则, 则这个Ctx永远是初始化时的状态
规则调整逻辑
- 重构规则逻辑 #720
- 需要调整的规则增加一套处理逻辑, 用于处理关闭基础对象审核功能后的表现
- 调用方处进行微调, 从以前的直接调用函数改为调用 对象方法(), 同时在调用前传入初始化配置
- 调整其他关联插件