sqle icon indicating copy to clipboard operation
sqle copied to clipboard

使用session.context的审核,上下文关联和基础对象审核功能能够开启关闭

Open HuangWeiCen opened this issue 2 years ago • 0 comments

背景

SQL的上下文关联设计之初也是为了满足sql审核上线的,在sqle 的扫描任务中,sql之间没有关联性且扫描的sql可能也是已经上线过了,因此有部分场景不应该进行上下文关联和基础的对象验证。

例如:

某扫描任务中扫描到 create table的SQL,此时如果对create table进行连库审核,必然触发表已存在的审核建议

详见文档(pageId=36632145)

影响面

影响插件

MySQL, TiDB, OceanBase For MySQL 目前会使用到session.Context

开发方案

整体方案

  1. 新增一个规则, 用于控制开启或关闭基础对象检查和上下文关联, 位于全局配置中
  2. 一旦开启这个规则, 所有的库表结构检查都停止运行, 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规范 所有

代码逻辑

关闭上下文关联实现逻辑

  1. 当前添加上下文的位置统一在 MysqlDriverImpl.Audit() 中通过调用i.Ctx.UpdateContext(nodes[0])实现 , 对应规则启用后不再调用此方法更新上下文
  2. 在MysqlDriverImpl.Ctx外包一个方法, 用于获取Ctx, 如果开启了此规则, 则这个Ctx永远是初始化时的状态

规则调整逻辑

  1. 重构规则逻辑 #720
  2. 需要调整的规则增加一套处理逻辑, 用于处理关闭基础对象审核功能后的表现
  3. 调用方处进行微调, 从以前的直接调用函数改为调用 对象方法(), 同时在调用前传入初始化配置
  4. 调整其他关联插件

HuangWeiCen avatar Aug 01 '22 07:08 HuangWeiCen