hi 好久不见!明天将为大家带来一期干货满满的技术分享。
作为一款数据库管控平台,大家通常认为 CloudQuery 的外围能力是对平台的管控,包含对立入口治理、权限体系、审计剖析等,但实际上 CloudQuery 的核心技术点之一在于其独特的 SQL 解析能力。
01SQL 解析性能界定
SQL 解析是指将结构化查询语言(SQL 语句)转换成能够被数据库系统了解和执行的外部示意模式的过程。在执行 SQL 查问之前,数据库系统须要对查问语句进行解析,以确定查问语句的语法是否正确,是否存在语义谬误,并生成执行打算。
目前 SQL 解析工具有 Druid、JSqlParser、Apache Calcite、Presto 等,它们都提供了一些 API 用于剖析 SQL 语句中的信息,比方获取表名、列名等字段。然而上述工具提供的 SQL 解析性能通常封装性比拟强,扩展性有余,反对的数据源无限,在许多非凡场景下它们无奈精确的给出 SQL 解析后果。
因而,CloudQuery 技术团队抉择应用 ANTLR 作为 SQL 解析的引擎。ANTLR 作为 SQL 解析引擎具备很多劣势,它帮忙咱们构建高效、可扩大和易于保护的 SQL 解析器。
02SQL 解析原理介绍 SQL
解析是将用户输出的 SQL 语句转换为数据库可能了解的结构化查询语言的过程,与一般编程语言的解析无本质区别。次要分为词法剖析、语法分析、语义剖析、优化、代码生成这些步骤。SQL 解析的原理能够分为两个次要阶段:词法剖析和语法分析。词法剖析词法剖析是将 SQL 语句合成为一个个独自的 Token,标识每一个关键字、符号或者其余语法元素的过程。词法分析器会一一读取 SQL 语句中的字符,依据预约义好的规定组成不同的 Token,并将 Token 序列传递给下一个步骤。比方,上面是一个简略的 SELECT 语句:
SELECT FirstName FROM Employee WHERE Department = ‘Sales’
在进行词法剖析后,将生成的 Token 序列如下:
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
语法分析语法分析是将 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 高危操作查看等。
03SQL 解析在 CloudQuery 中的利用
CloudQuery 很多性能的实现都离不开弱小的 SQL 解析能力,SQL 解析是 CQ 稳步前行的一大基石。
SQL 高亮
在编辑框中输出一条 SQL 语句,能够看到语句中的关键字局部 SELECT、FROM、WHERE 会被渲染成蓝色,这其实就是下面讲到的词法剖析的利用。
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
在语句通过词法剖析后,语句会变成一系列 Token,Token 代表了语句中不同类型的字符。Token 大抵上能够分为关键字、标识符、数字、字符串、正文这几种,而后编辑器就能够依据这几种类别,将用户输出的 SQL 语句进行着色。
语法提醒
咱们在输出 SQL 的过程中,比方输出上面的文本:SELECT * FROM SYS. 通常输出到这里的时候,咱们心愿提醒出 SYS 上面的一些信息来帮忙咱们疾速写完 SQL,比方提醒出表名、视图名、函数名等。目前 CloudQuery 在用户书写 SQL 语句的过程中有欠缺的智能提醒性能,包含提醒出关键字、表名、列名、函数名、子查问别名等。这里 SQL 的智能提醒技术就是下面讲到的语法分析的利用,当咱们输出 SELECT FROM SYS. 的时候,其实曾经通过语法分析形成了一棵语法树,只是这棵语法树不残缺,CloudQuery 在用户输出 SQL 语句时会实时遍历语法树,找出以后语法树中缺失的节点,在例子中缺失的节点就是表名节点,由此能够失去咱们以后提示信息应该是 SYS 下的表名或视图名。
SQL 语句权限管制 CloudQuery 应用基于角色的权限访问控制体系,权限管制粒度能够具体到每一种 SQL 语句、每一个数据库对象。比方罕用的 SELECT、UPDATE、DELETE、CREATE TABLE、CREATE FUNCTION、函数调用等语句。
这里语句权限的管制就是 SQL 解析的重要利用场景,CloudQuery 在接管到用户输出的 SQL 语句后,会通过上述的词法剖析和语法分析步骤,再遍历语法树收集 SQL 语句中的信息。在信息收集过程中,会提取出 SQL 语句中波及到的所有表名、列名、别名、函数、查问条件等信息,接下来会对这些信息做进一步加工解决,比方打消 TABLE 的别名、绑定列的起源表、对象的实在类型查问等。
无权限的用户输出上面的 SQL 语句,将会受到权限管控: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;
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
动静过滤数据行 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 继续一直地为用户提供稳固高效的操作体验。