范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SQL审核如何快速使用SQLE审核各种类型的数据库

  作者:孙健
  孙健,爱可生研发工程师,负责 SQLE 相关开发;
  本文来源:原创投稿
  *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。前言
  近些年来,数据库产业发展迅猛,各种新兴数据库如雨后春笋般出现,各个公司的技术栈也不再局限于某一种数据库。对于SQL质量管理平台来说仅支持某一个类型的数据库(例如MySQL),那么是会有一定的局限性,SQLE在设计之初考虑支持多种数据库,因此产品设计时,将审核流程(业务)的代码和具体SQL审核上线的代码进行分离,SQL审核上线通过插件的形式实现。SQLE对外提供插件开发所需的接口和库,可以快速创建开启一个审核插件,无需升级软件,导入审核插件即可获对应数据库类型的审核上线能力,使用平台所有功能。
  插件的开发参考文档:https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html ,
  插件的使用参考文档:https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_management.html。
  本文将演示如何从零开始创建一个简单可用的审核插件,作为案例。 目标
  首先将创建一个 Postgres 数据库审核插件,并添加两条规则,"禁止使用 SELECT *"和"创建的表字段过多",并在开发过程中结合SQLE对Postgres数据库进行SQL审核上线工单的测试演示。以下过程中的演示代码可从此处https://github.com/actiontech/sqle/tree/main/example/db_plugin下载。 实操
  提示:SQLE和插件为GO语言开发,如果要进行插件开发,需要对GO有一丢丢了解即可。 1. 创建插件项目
  首先使用go mod初始化一个go项目,然后 mkdir sqle-pg-plugin cd sqle-pg-plugin touch main.go go mod init sqle-pg-plugin # 初始化go mod  export GOPROXY=goproxy.cn,goproxy.io,direct # 设置 GoProxy,解决SQLE库下载问题,通过IDEA开发的可以在IDEA软件上设置; go get github.com/actiontech/sqle@v1.2204.0 # 此版本为该文章编辑时的最新版本。 2.编写最小化插件代码
  在项目main.go文件内编写如下代码,即可最快的添加一个Postgres数据库审核插件,此时插件没有审核规则。 package main   import (    adaptor "github.com/actiontech/sqle/sqle/pkg/driver" )   func main() {    plugin := adaptor.NewAdaptor(&adaptor.PostgresDialector{})    plugin.Serve() }
  使用‘go build‘编译后得到二进制文件 sqle-pg-plugin,按前言中的插件的使用参考文档,我们部署到SQLE服务里。可以正常添加数据源,如下图所示:
  此时正常进行SQL审核上线工单创建并上线,如下图所示:
  3.给插件添加一条规则
  在刚刚代码的基础上,我们在main函数内添加如下代码来新增一条规则"禁止使用 SELECT *",完整代码如下所示。 package main   import (    "context"    "strings"      "github.com/actiontech/sqle/sqle/driver"    adaptor "github.com/actiontech/sqle/sqle/pkg/driver"   )   func main() {    plugin := adaptor.NewAdaptor(&adaptor.PostgresDialector{})    rule1 := &driver.Rule{       Name:     "pg_rule_1", // 规则ID,该值会与插件类型一起作为这条规则在 SQLE 的唯一标识       Desc:     "禁止使用 SELECT *",      // 规则描述       Category: "DQL规范",           // 规则分类,用于分组,相同类型的规则会在 SQLE 的页面上展示在一起       Level:    driver.RuleLevelError,    // 规则等级,表示该规则的严重程度    }     //    rule1Handler := func(ctx context.Context, rule *driver.Rule, sql string) (string, error) {       if strings.Contains(sql, "select *") {          return rule.Desc, nil       }       return "", nil    }    plugin.AddRule(rule1, rule1Handler)    plugin.Serve() }
  我们按之前的方式编译插件二进制文件,并部署到SQLE server内,可以看到新增了一条规则,如下图所示:
  此时我们提交一个工单验证一下,可以看到触发了我们刚添加的规则
  4.给插件添加一条可配置的复杂规则
  基于上面的代码,我们再添加一条规则"创建的表字段过多",具备如下特性: 上面添加的规则基于字符串匹配进行的,准确性不高,无法匹配到不同的书写格式,比如大小写,换行等。因此我们在这里会基于SQL解析器开发一条规则,测试使用的解析库 https://github.com/pganalyze/pg_query_go; 为了增加规则的适用性,我们准备给规则加一个动态配置给用户提供可选项。
  代码如下: package main   import (    "context"    "fmt"    "strings"      "github.com/actiontech/sqle/sqle/driver"    adaptor "github.com/actiontech/sqle/sqle/pkg/driver"    "github.com/actiontech/sqle/sqle/pkg/params"    parser "github.com/pganalyze/pg_query_go/v2" )   func main() {    plugin := adaptor.NewAdaptor(&adaptor.PostgresDialector{})      rule1 := &driver.Rule{       Name:     "pg_rule_1",           // 规则ID,该值会与插件类型一起作为这条规则在 SQLE 的唯一标识       Desc:     "避免查询所有的列",            // 规则描述       Category: "DQL规范",               // 规则分类,用于分组,相同类型的规则会在 SQLE 的页面上展示在一起       Level:    driver.RuleLevelError, // 规则等级,表示该规则的严重程度    }    rule1Handler := func(ctx context.Context, rule *driver.Rule, sql string) (string, error) {       if strings.Contains(sql, "select *") {          return rule.Desc, nil       }       return "", nil    }      // 定义第二条规则    rule2 := &driver.Rule{       Name:     "pg_rule_2",       Desc:     "表字段不建议过多",       Level:    driver.RuleLevelWarn,       Category: "DDL规范",       Params: []*params.Param{ // 自定义参数列表          ¶ms.Param{             Key:   "max_column_count",  // 自定义参数的ID             Value: "50",                // 自定义参数的默认值             Desc:  "最大字段个数",            // 自定义参数在页面上的描述             Type:  params.ParamTypeInt, // 自定义参数的值类型          },       },    }      // 这时处理函数的参数是 interface{} 类型,需要将其断言成 AST 语法树。    rule2Handler := func(ctx context.Context, rule *driver.Rule, ast interface{}) (string, error) {       node, ok := ast.(*parser.RawStmt)       if !ok {          return "", nil       }       switch stmt := node.GetStmt().GetNode().(type) {       case *parser.Node_CreateStmt:          columnCounter := 0          for _, elt := range stmt.CreateStmt.TableElts {             switch elt.GetNode().(type) {             case *parser.Node_ColumnDef:                columnCounter++             }          }          // 读取 SQLE 传递过来的该参数配置的值          count := rule.Params.GetParam("max_column_count").Int()          if count > 0 && columnCounter > count {             return fmt.Sprintf("表字段不建议超过%d个,目前有%d个", count, columnCounter), nil          }       }       return "", nil    }      plugin.AddRule(rule1, rule1Handler)    plugin.AddRuleWithSQLParser(rule2, rule2Handler)      // 需要将 SQL 解析的方法注册到插件中。    plugin.Serve(adaptor.WithSQLParser(func(sql string) (ast interface{}, err error) {       // parser.Parse 使用 PostgreSQL 的解析器,将 sql 解析成 AST 语法树。       result, err := parser.Parse(sql)       if err != nil {          return nil, fmt.Errorf("parse sql error")       }       if len(result.Stmts) != 1 {          return nil, fmt.Errorf("unexpected statement count: %d", len(result.Stmts))       }       // 将 SQL 的语法树返回。       return result.Stmts[0], nil    }))      plugin.Serve() }
  打开SQLE规则界面,可以看到该规则已经添加到SQLE了,如图:
  我们将规则模板内该规则的值调小点然后进行测试一下
  首先我们提交一条超过5个字段的建表语句,此时SQLE会触发该规则并给出预期的提示信息,如下图所示:
  然后我们提交一条不超过5个字段的建表语句,此时SQLE不会触发该规则,如下图所示:
  总结
  通过上面的演示,大概介绍了SQLE数据库审核插件的简单开发测试过程。大家可根据类似步骤开发出一套符合自己公司需求的规则集,结合SQLE平台来满足日常使用。我们也提供了一些常见数据库的审核插件,大家也可以在此基础上进行开发,参考文档:https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/overview.html

IDC2021年PC总出货量达3。488亿台,创2012年以来新高IT之家1月13日消息,IDC发布了他们对传统PC(台式机笔记本电脑和工作站)全球出货量的估计,并宣布PC市场已成功保持新一季度增长。根据IDC全球季度个人计算设备追踪器的初步结果消息称苹果iPhone14Pro采用感叹号打孔,无缘屏下FaceIDIT之家1月13日消息,外界普遍预计苹果将在iPhone14Pro机型上取消刘海设计,但关于新设计的传言却相互矛盾。早期的传言称,苹果将采用打孔设计,FaceID将以某种方式完全移目前市面上拍摄最强的手机有哪些?入手这几款不亏随着生活水平的提高,大家的娱乐项目也有了很大的变化,如今各处旅游俨然成为了最受欢迎的放松方式,很多人在路途中都喜欢用手机去记录生活,拍个照片分享朋友圈什么的,不过,市面上满目琳琅的强烈建议中国移动,中国联通,中国电信取消月租,你支持么?月租费是非常不合理的收费,月租费和话费(含流量)是一种重复收费。既然交纳了月租费,就形成了使用消费合同,客户就应当有使用权,不得再重复收取话费(含流量费)。目前还有很多地方的客户交安徽聚焦破解卡脖子技术难题打好关键核心技术攻坚战中安在线中安新闻客户端讯1月11日,记者从奋勇争先开新局系列新闻发布会(第三场)获悉,安徽省科技厅重点围绕十大新兴产业领域,探索采取定向委托揭榜挂帅等新机制,组织实施重大技术攻关和跌至2999元,真全面屏骁龙888Plus,小米MIX4再创新低价说起小米MIX4这款手机,坊间评价可谓两极分化,一方面它是做给发烧友的产品,但另一方面短板也很明显,不过市场最终还是给出了答卷,那就是小米MIX4确实配不上它的价格,从发布到现在有电脑启动故障的分析电脑的启动过程是一个非常复杂的过程,它有一个非常完善的自检体系,在你按下电源开关的几秒之内,要经历大约100多个检测步骤,以下是启动过程以及常见的问题和大致的判断(一)电源,主板,超越华为,位居世界第二,80后哈工大博士做出一个IPO据媒体报道,智能激光雷达系统(SmartLiDARSensorSystem)科技企业速腾聚创(RoboSense)日前筹备明年在香港上市,计划募资10亿美元。据悉,前汽车之家CFOiOS开发的优势有哪些?看完你就知道了iOS的开发包括策略构思设计以及发布后阶段,比如发布前阶段。iOS开发不断追求新的高度,以保持一致的性能和积极的创新。接下来,我们将具体介绍一下iOS开发的好处。一iOS的历史20新疆实现快递业务经营许可证全程网办天山网讯(记者范琼燕报道)1月6日,新疆快递业务经营许可证开通寄递服务,这意味着新疆快递业务经营许可证(以下简称许可证)实现全程网办。1月14日,记者从新疆邮政管理局了解到,已有3新能源板块明显回调还能继续投资吗?开年以来,去年领涨的新能源板块明显回调。截至1月12日中证新能源汽车指数下跌6。26中证光伏产业指数下跌10。71。排除市场面因素的解释,行业基本面向好趋势不变,我们仍关注其中长期
麦肯锡中国先进制造灯塔企业领跑全球中国经济导报记者王晓涛工业场景灯塔的本意,就是引领众多数字化转型中的企业走出试点陷阱,走出转型黑暗,不再彷徨迷茫和焦虑。在近期举行的2021世界机器人大会新趋势主题报告会上,麦肯锡影谱科技中标中国电信数字城市千万级项目助力数字城市发展新一轮数字城市的规划和建设正在全国如火如荼展开。在数字城市的建设大潮中,作为新型信息基础设施的主力军,运营商以5G为契机在推进网络转型的同时,也在积极推进业务网络生态的融合发展,探物美价廉过半巴西受访者曾在中国电商网站购物据南美侨报网报道,巴西消费者保护网站ReclameAqui近日公布的一项调查显示,由于物美价廉,中国电商网站已成为巴西人购物习惯的一部分。据统计,56。5的受访者曾在中国平台上购物QQ早期是怎么让用户知道有这个软件的?当年腾讯QQ60万被卖,却没人愿意买?腾讯QQ如今成长为世界级的互联网公司,最高市值已经超越了两千亿,微信与QQ更是数亿级别超级产品。在十几年前,马化腾也曾因为资金差点断链,而想卖小米手机的最大缺点是什么?信号问题!近6年用过3台华为手机,但用过10台以上的小米手机,差异最大的就是手机信号问题小米最大的问题做工发热断流屏幕中等亮度明显不如其他几家屏幕中等亮度,要暗许多。发热,热到你害英媒中国电动车新锐抢滩欧洲市场据路透社慕尼黑北京9月30日报道,在欧洲大陆的碳中和行动进行得如火如荼之际,中国的电动汽车企业正在抢滩欧洲,希望在传统汽车巨头尚未做好准备时,在欧洲市场抢占先机。报道称,蔚来汽车便电信手机号码实名制登记,近期数次被运营商强行暂停服务自己实名制登记的电信手机号码,在不差钱的情况下,今年下半年以来,被运营商多次强行暂停服务,理由是违规使用(莫须有),第一次被暂停服务后,按照语音提示,带上身份证到电信营业厅办理恢复充电5分钟续航207km,17。26万起售,AIONVPLUS买哪款更值?我们知道,制约新能源车型进一步发展的两大因素就是续航和充电速度,尤其是在20万元左右这个期间,能同时兼顾续航以及充电速度的车型少之又少。不过,在9月29日,广汽AIONVPLUS正网约车行业到底有没有门槛?行业的头部玩家刚刚按下暂停键,行业内的玩家们马上跃跃欲试,更有不少原本没有这项业务的互联网平台,也似乎在一夜之间都火速上线了,这个看似毫无门槛的行业,说的就是网约车。送外卖的平台可从零开始设计中文编程语言SQL领域演示通过逐步完善一个简单的中文编程语言语法并最后转换为SQL语句,演示一种快速搭建中文编程语言原型的方法。达成效果是,如下的中文语句创建读者表,编号为整数,出生年为文本转换生成SQL语雅虎杨致远还是阿里独立董事,牛不,他当年把雅虎中国卖给了阿里杨致远是90年代末20世纪初的名人。当他超越李嘉诚成为华人首富,名满全球的时候,马云还在到处拉人投资。只是杨致远没有第一时间入股甚至控制阿里,多年后在阿里已经壮大后把雅虎中国打包卖