SQL 解析在 CloudQuery 中的应用

CloudQuery
企业官方账号
2023-05-11 09:29:22

 

hi 好久不见!今天将为大家带来一期干货满满的技术分享。

 

作为一款数据库管控平台,大家通常认为 CloudQuery 的核心能力是对平台的管控,包括统一入口管理、权限体系、审计分析等,但实际上 CloudQuery 的核心技术点之一在于其独特的 SQL 解析能力

 

01

SQL 解析功能界定

 

SQL 解析是指将结构化查询语言( SQL 语句)转换成可以被数据库系统理解和执行的内部表示形式的过程。在执行 SQL 查询之前,数据库系统需要对查询语句进行解析,以确定查询语句的语法是否正确,是否存在语义错误,并生成执行计划

 

目前 SQL 解析工具有 Druid、JSqlParser、Apache Calcite、Presto 等,它们都提供了一些 API 用于分析 SQL 语句中的信息,比如获取表名、列名等字段。但是上述工具提供的 SQL 解析功能通常封装性比较强,扩展性不足,支持的数据源有限,在许多特殊场景下它们无法准确的给出 SQL 解析结果。

 

因此, CloudQuery 技术团队选择使用 ANTLR 作为 SQL 解析的引擎。ANTLR 作为 SQL 解析引擎具有很多优势,它帮助我们构建高效、可扩展和易于维护的 SQL 解析器。

 

02

SQL 解析原理介绍

 

SQL 解析是将用户输入的 SQL 语句转换为数据库能够理解的结构化查询语言的过程,与普通编程语言的解析无本质区别。主要分为词法分析、语法分析、语义分析、优化、代码生成这些步骤。SQL 解析的原理可以分为两个主要阶段:词法分析和语法分析。

 

词法分析

 

词法分析是将 SQL 语句分解为一个个单独的 Token,标识每一个关键字、符号或者其他语法元素的过程。词法分析器会逐个读取 SQL 语句中的字符,根据预定义好的规则组成不同的 Token,并将 Token 序列传递给下一个步骤。

 

比如,下面是一个简单的 SELECT 语句:

 

  •  
SELECT FirstName FROM Employee WHERE Department = 'Sales'

 

在进行词法分析后,将生成的 Token 序列如下:

 

语法分析

 

语法分析是将 Token 序列转换成语法分析树,并进行语义分析、类型检查等处理的过程。语法分析器会根据事先定义好的 SQL 语法规则,将 Token 序列转换为语法分析树,并对其进行分析,以确定 SQL 语句是否符合语法规范。

 

比如,针对上述 SELECT 语句,语法分析器会将其转换为以下语法分析树:

SELECT_STATEMENT/ | \ \SELECT COLUMN_LIST FROM WHERE| | |FirstName Employee Department = 'Sales'

 

SQL 语句数据收集

 

在经过词法分析和语法分析的步骤后,我们就得到了一棵语法分析树。我们要收集 SQL 语句中的表名、列名、表达式等信息,其实就是遍历这个语法树的各个节点,将想要获取的信息保存下来。

 

在上面的语法树中,我们通过访问 COLUMN_LIST 节点可以获取到语句中查询的列名,通过 FROM 节点可以获取到语句中查询的表名,通过WHERE 节点可以获取到语句中的查询条件。

 

有了这些信息,我们就可以基于这些信息做许多数据库方面的功能,比如 SQL 语句权限管控、SQL 合法性检查、SQL 高危操作检查等。

 

03

SQL 解析在 CloudQuery 中的应用

 

CloudQuery 很多功能的实现都离不开强大的 SQL 解析能力,SQL 解析是 CQ 稳步前行的一大基石。 

 

SQL 高亮

 

在编辑框中输入一条 SQL 语句,可以看到语句中的关键字部分 SELECT、FROM、WHERE 会被渲染成蓝色,这其实就是上面讲到的词法分析的应用。

 

在语句经过词法分析后,语句会变成一系列 Token,Token 代表了语句中不同类型的字符。Token 大致上可以分为关键字、标识符、数字、字符串、注释这几种,然后编辑器就可以根据这几种类别,将用户输入的 SQL 语句进行着色。

 

语法提示

 

我们在输入 SQL 的过程中,比如输入下面的文本:

 

  •  
SELECT * FROM SYS.

 

 

通常输入到这里的时候,我们希望提示出 SYS 下面的一些信息来帮助我们快速写完 SQL,比如提示出表名、视图名、函数名等。目前 CloudQuery 在用户书写 SQL 语句的过程中有完善的智能提示功能, 包括提示出关键字、表名、列名、函数名、子查询别名等。

 

这里 SQL 的智能提示技术就是上面讲到的语法分析的应用,当我们输入 SELECT  FROM SYS. 的时候,其实已经经过语法分析构成了一棵语法树,只是这棵语法树不完整,CloudQuery 在用户输入 SQL 语句时会实时遍历语法树,找出当前语法树中缺失的节点,在例子中缺失的节点就是表名节点,由此可以得到我们当前提示信息应该是 SYS 下的表名或视图名

 

 

SELECT * FROM "SYS"."ACCESS$" LEFT JOIN "SYS"."ACLMV$";DELETE FROM "CQ"."USER" WHERE ID = 1;CREATE OR REPLACE FUNCTION GET_UUID RETURN VARCHAR2 IS   uuid VARCHAR2(32);BEGIN   uuid := REPLACE(SYS_GUID(),'-','');RETURN uuid;END;BEGIN"CQ"."GET_UUID"();END;

 

动态过滤数据行

 

CloudQuery 支持数据行安全控制,行安全控制是 CloudQuery 的一项安全特性,它允许管理员定义基于行的安全规则,以限制用户在表中的访问权限。

 

使用行安全控制,可以根据用户的角色、组织、部门等信息来动态控制数据的可见性,从而增强数据库的安全性。CloudQuery 的行安全控制条件支持任意的 SQL 表达式、支持引用用户的任何参数值、支持引用系统级别的参数值、支持引用环境变量等。

 

下面用一个例子说明行安全控制的使用场景: 存在一张业务数据表,其中有一个部门字段( dept ),管理员希望普通用户在查询这张表里的数据时,只能查询到自己部门的数据。在 CloudQuery 可以通过给表配置行安全控制实现上面的需求,配置方式类似下面这样:

 

  •  
 DEPT = '${USER.DEPT}'

 

上面配置中 DEPT 是表中的列名, ${USER.DEPT} 是引用用户的部门参数,在真正执行 SQL 时这里会被替换成用户的真实部门值。用户在执行下面的 SQL 语句时:

 

  •  
SELECT * FROM DEPT;

 

最终执行的 SQL 会被修改成:

 

  •  
SELECT * FROM DEPT WHERE DEPT = 'dept1';

 

行安全控制的实现方式也依赖于 SQL 解析,在经过前面所说的词法分析、语法分析、SQL 语句信息收集这几步后,我们可以收集到语句中的需要行过滤的表名,当然还要知道这个表名所在的 SELECT 语句的位置信息, 以及所在 SELECT 语句中 FROM 的位置和WHERE条件的位置。通过这些信息,我们就可以对原始语句进行改写。

 

以上就是 SQL 解析在 CloudQuery 中的基本应用,正是凭借强大的 SQL 解析能力,CloudQuery 持续不断地为用户提供稳定高效的操作体验。

 

 

 

...全文
70 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
2021 云和恩墨大讲堂PPT汇总,共50份。 2021 云和恩墨大讲堂内容涵盖Oracle、MySQL、PG等多种数据库。 带你走进PG的世界 MySQL查询优化 Oracle数据库SQL执行计划的取得和解析 11gR2频繁遭遇Checkpoint incompelte 12C_19C统计信息最佳实践 并行不悖 - Oracle数据库的并行执行 抽丝剥茧_一起有关新冠病毒疫情的勒索病毒案例 从内存故障到CPU过高Oracle诊断案例(上) 从内存故障到CPU过高Oracle诊断案例(下) 从纸上谈兵到躬行实践-shared pool道法器术 高并发Oracle OLTP系统的故障案例分享 经典知识库:深入解析Oracle检查点 经典知识库:数据库对象命名设计规范手册 经典知识库:数据模型重构案例分享 经典知识库:性能优化那些事 经典知识库:ASM元数据简介及案例分享 经典知识库:MGR原理介绍与案例分享 经典知识库:MySQL常用运维工具小妙招集锦 经典知识库:MySQL故障诊断常用方法手册 经典知识库:Oracle 19c X86下移经验分享 经典知识库:Oracle DBA的SQL编写技能提升宝典 经典知识库:Oracle PDB Refresh实战分享 经典知识库:Oracle数据库索引分裂详解 经典知识库:PostgreSQL的锁 经典知识库:SQL条件等价改写秘笈 如何实现海量数据迁移及落地实践 如何通过APEX 实现标准化运维 如何通过APEX实现标准化运维sql 深入解析:oracle drop table purge内部原理及异常恢复 数据时代万象更新-从数据库技术演进看国产数据库机遇 一次特殊的Oralce 硬解析性能问题的技术分享 CloudQuery 权限管理体系在证券行业的应用 DML操作时索引是如何同步变化的 MogDB优化入门 MySQL备份恢复工具应用场景和使用方法 MySQL的性能 MySQL的索引探究 Oracle 12cR2 ADG LGWR Library Cache案例分享 Oracle 10046 Trace 的取得和解析方法 Oracle 基于AWR ASH的性能分析 Oracle DataGuard备份恢复最佳实践-姚远 Oracle Nologging全面总结 Oracle RAC 集群安装部署 Oracle RMAN 单实例异机迁移恢复(版本:11GR2) Oracle存储过程性能分析案例 Oracle技术加油站:快速处理紧急性能问题的工具与经验 Oracle诊断性能问题时常用脚本工具 PostgreSQL日常工作分享 PostgreSQL实践分享 wls、was间件故障基本分析介绍

60

社区成员

发帖
与我相关
我的任务
社区描述
一体化数据管控云平台 公众号:CloudQuery社区 官网:http://cloudquery.club/
社区管理员
  • BinTools图尔兹
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

大家好,欢迎来到 CloudQuery社区!

CloudQuery是一体化数据管控云平台,集成开发者和 DBA 日常所需各种数据工具,提供一体化权限、数据审计等多种安全措施,最大化减小数据风险。

除了社区,也欢迎大家加入我们的用户群,可添加小助手wx:13282178279

试试用AI创作助手写篇文章吧