CN113722348A - 结构化查询语言sql语句的处理方法、装置和电子设备 - Google Patents

结构化查询语言sql语句的处理方法、装置和电子设备 Download PDF

Info

Publication number
CN113722348A
CN113722348A CN202110708041.6A CN202110708041A CN113722348A CN 113722348 A CN113722348 A CN 113722348A CN 202110708041 A CN202110708041 A CN 202110708041A CN 113722348 A CN113722348 A CN 113722348A
Authority
CN
China
Prior art keywords
sql
sql statement
character string
characters
character
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202110708041.6A
Other languages
English (en)
Other versions
CN113722348B (zh
Inventor
徐仁杰
吴海英
曾琳铖曦
蒋宁
郭江
刘磊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mashang Xiaofei Finance Co Ltd
Original Assignee
Mashang Xiaofei Finance Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Mashang Xiaofei Finance Co Ltd filed Critical Mashang Xiaofei Finance Co Ltd
Priority to CN202110708041.6A priority Critical patent/CN113722348B/zh
Publication of CN113722348A publication Critical patent/CN113722348A/zh
Application granted granted Critical
Publication of CN113722348B publication Critical patent/CN113722348B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/903Querying
    • G06F16/90335Query processing
    • G06F16/90344Query processing by using string matching techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/602Providing cryptographic facilities or services
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/205Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/253Grammatical analysis; Style critique

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computational Linguistics (AREA)
  • General Health & Medical Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Databases & Information Systems (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Artificial Intelligence (AREA)
  • Data Mining & Analysis (AREA)
  • Mathematical Physics (AREA)
  • Bioethics (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请实施例提供了一种结构化查询语言SQL语句的处理方法、装置和电子设备,在对SQL语句进行处理时,可以先遍历待处理的SQL语句中的字符,基于预设字符和SQL语法规则,从SQL语句中提取多组目标字符串;并创建多组目标字符串各自对应的组成片段,若确定多个组成片段中包括关键字段,则分别对关键字段和关键字段对应的取值进行加密,以生成新的SQL语句。这样通过遍历SQL语句中的所有字符,并基于预设字符和SQL语法规则对SQL语句进行解析,提高了SQL语句解析的准确度,使得后续基于解析结果生成的新的SQL语句时,从而提高了新的SQL语句的准确度。

Description

结构化查询语言SQL语句的处理方法、装置和电子设备
技术领域
本申请涉及数据处理技术领域,尤其涉及一种结构化查询语言SQL语句 的处理方法、装置和电子设备。
背景技术
结构化查询语言(Structured Query Language,SQL),是一种特殊目的 的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、 更新和管理关系数据库系统。
对于一些场景下的数据,例如银行系统中的数据,假设用户通过SQL语 句对银行系统中的部分数据进行存储,电子设备在接收到输入的SQL语句后, 会对先SQL语句进行解析,并根据解析结果判断SQL语句中是否包括关键 字段,在银行系统中,关键字段可以为姓名、地址、电话、身份证号、银行 卡号或者存款金额等;若包括关键字段,则增加该关键字段对应的密文数据, 以及关键字段的取值对应的密文数据,生成新的SQL语句,并执行该新的SQL 语句,以将数据存储在数据库中。数据库中不仅包括SQL语句中关键字段的 明文数据,还包括该关键字段对应的密文数据。
但是,现有技术中,对SQL语句进行解析时,通常采用语法解析器中的 语法文件对SQL语句进行解析,由于语法文件覆盖不全等问题,使得在对结 构较为复杂的SQL语句进行解析时,会出现解析错误或者无法解析的问题, 从而导致SQL语句执行出现错误。
发明内容
本申请实施例提供了一种结构化查询语言SQL语句的处理方法、装置和 电子设备,可以准确地对待处理的SQL语句进行解析,提高了解析的准确度, 从而提高了SQL语句执行的准确度。
第一方面,本申请实施例提供了一种SQL语句的处理方法,该SQL语 句的处理方法可以包括:
遍历待处理的SQL语句中的字符,基于预设字符和SQL语法规则,从 所述SQL语句中提取多组目标字符串;
创建所述多组目标字符串各自对应的组成片段。
若确定多个组成片段中包括关键字段,则分别对所述关键字段和所述关 键字段对应的取值进行加密,以生成新的SQL语句。
第二方面,本申请实施例提供了一种SQL语句的处理装置,该SQL语 句的处理装置可以包括:
处理单元,用于遍历待处理的SQL语句中的字符,基于预设字符和SQL 语法规则,从所述SQL语句中提取多组目标字符串;
创建单元,用于创建所述多组目标字符串各自对应的组成片段。
加密单元,用于若确定所述多个组成片段中包括关键字段,则分别对所 述关键字段和所述关键字段对应的取值进行加密,以生成新的SQL语句。
第三方面,本申请实施例还提供了一种电子设备,该电子设备可以包括: 存储器,处理器;
存储器;用于存储计算机程序;
所述处理器,用于读取所述存储器存储的计算机程序,并根据所述存储 器中的计算机程序执行上述第一方面所述的SQL语句的处理方法。
第四方面,本申请实施例还提供了一种可读存储介质,其上存储有计算 机程序,所述计算机程序中存储有计算机执行指令,所述计算机执行指令被 处理器执行时用于实现如上述第一方面所述的SQL语句的处理方法。
第五方面,本申请实施例还提供了一种计算机程序产品,包括计算机程 序,该计算机程序被处理器执行时,实现如上述第一方面所述的SQL语句的 处理方法。
由此可见,本申请实施例提供了的结构化查询语言SQL语句的处理方法、 装置和电子设备,在对SQL语句进行处理时,可以先遍历待处理的SQL语 句中的字符,基于预设字符和SQL语法规则,从SQL语句中提取多组目标 字符串;并创建多组目标字符串各自对应的组成片段,若确定多个组成片段 中包括关键字段,则分别对关键字段和关键字段对应的取值进行加密,以生 成新的SQL语句。这样通过遍历SQL语句中的所有字符,并基于预设字符和SQL语法规则对SQL语句进行解析,提高了SQL语句解析的准确度,使 得后续基于解析结果生成的新的SQL语句时,从而提高了新的SQL语句的 准确度。
附图说明
图1为本申请实施例提供的一种开源软件的框架示意图;
图2为本申请实施例提供的SQL语句对应的抽象语法树的结构示意图;
图3为本申请实施例提供的一种SQL语句的处理方法的流程示意图;
图4为本申请实施例提供的一种SQL语句解析结果的示意图;
图5为本申请实施例提供的一种加密后解析结果的示意图;
图6为本申请实施例提供的一种insert SQL语句解析结果的示意图
图7为本申请实施例提供的另一种加密后解析结果的示意图;
图8为本申请实施例提供的一种SQL语句的处理装置的结构示意图;
图9为本申请实施例提供的一种电子设备的结构示意图。
通过上述附图,已示出本公开明确的实施例,后文中将有更详细的描述。 这些附图和文字描述并不是为了通过任何方式限制本公开构思的范围,而是 通过参考特定实施例为本领域技术人员说明本公开的概念。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的 描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的 要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所 有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一 些方面相一致的装置和方法的例子。
在本申请的实施例中,“至少一个”是指一个或者多个,“多个”是指 两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种 关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存 在B这三种情况,其中A,B可以是单数或者复数。在本申请的文字描述中, 字符“/”一般表示前后关联对象是一种“或”的关系。
本申请实施例提供的技术方案可以应用于数据加密存储、加密查询或者 加密传输场景中。其中,数据加密存储可以理解为:通过关键字段加密后的 SQL语句将需要存储的数据存储到数据库中;数据加密查询可以理解为:通 过关键字段加密后的SQL语句从数据库中查询所需的数据;数据加密传输可 以理解为:将关键字段加密后的SQL语句传输给第三方。
示例的,关键字段的设定可根据实际需要进行设置。例如,对于银行系 统中的数据,关键字段可以为姓名、地址、电话、身份证号、银行卡号或者 存款金额等;对于医院系统中的数据,关键字段可以为姓名、电话、身份证 号、病历、地址等。关键字段具体可以根据实际需要进行设置,实际需求如 产品的安全性需求、法律法规的要求、监管机构的规章制度要求,或者行业 标准的规定与建议等,在此,对于关键字段的具体设置,本申请实施例不做进一步地限制。
通常情况下,使用SQL语句进行数据存储、查询或传输时,会先对SQL 语句进行解析,若包括关键字段,则增加该关键字段对应的密文数据,以及 关键字段的取值对应的密文数据,生成新的SQL语句,并执行该新的SQL 语句,实现数据的加密存储或者查询。
现有技术中,通常采用开源软件实现数据的加密存储或者查询,可参见 图1所示,图1为本申请实施例提供的一种开源软件的框架示意图,该开源 软件中可以包括编译器、抽取器、填充器以及优化器。
以SQL语句为:SELECT id,name FROM t_user WHERE status='ACTIVE' AND age>18为例,可以先通过解析引擎将该SQL语句输入至开源软件中, 通过编译器(Parser)对该SQL语句进行编译处理,生成该SQL语句对应的 抽象语法树(Abstract Syntax Tree,AST),可参见图2所示,图2为本申请 实施例提供的SQL语句对应的抽象语法树的结构示意图,可以得到SQL语 句包括的多个字符串;再使用抽取器(Extractor),对抽象语法树中包括的多个字符串进行提取,得到该SQL语句的多个组成片段,即segment,不同 的组成片段代表SQL语句的不同组成部分,如select sql的where部分,from 部分等,都可以被抽象成一个segment。
接着,使用填充器(Filler)将提取出来的多个segments填充到一个 Statement里面,此处的Statement是开源软件的一个抽象概念,表示一个SQL 语句,如selectstatement和insert statement等,填充完成后,表示一个statement 的组成部分(segment)已经确定;再使用优化器(Optimizer)对填充得到的 Statement进行优化,若涉及加密,则将需要将SQL语句中涉及到的加解密字 段改写成密文字段,得到最终的SQL语句如下:
SELECT id,name_enc name FROM t_user WHERE status='ACTIVE'AND age>18
其中,name_enc为关键字段name的密文字段。
但是,采用现有的开源软件中的编译器和抽取器对SQL语句进行解析时, 通常是采用标准SQL的语法文件进行解析,对于一些简单的SQL语句,例 如上述SQL语句,可以准确地实现解析。但是,对于一些复杂的SQL语句, 由于语法文件覆盖不全等问题,使得在对结构较为复杂的SQL语句进行解析 时,会出现解析错误或者无法解析的问题,从而导致SQL语句执行出现错误。
可以理解的是,复杂SQL语句可以包括涉及子查询的SQL语句,或者 涉及is notnull判断的SQL语句,或者涉及表达式的SQL语句,例如加法表 达式、以及常量并存的SQL语句,或者insert类型中包括了select关键字的 SQL语句等,或者前述类型的SQl语句组合等,具体可以根据实际需要进行 设置。
示例的,涉及子查询的SQL语句可以为:
select*from(select*from mytable where mobile=?)t where mobile=?
涉及is not null判断的SQL语句可以为:
select customerCode,mobile1 contactNumber from customers where label= '1'and customerCode is not null and mobile1 is not null
涉及表达式的SQL语句可以为:
insert into mytable(id,name,cnt,createtime) values(?,?,3+3,?),(1001,'abcd',6,?);
insert类型中包括了select关键字的SQL语句:
insert into customer(customer_code,name,age,gender)select customer_code,name,age,gender from customer_bak where name=“张三”;
或者,
insert into customer(customer_code,name,age,gender)values(‘1’,‘张三’,20,‘male’)on duplicate key update name=COALESCE(values(name),name),age=COALESCE(values(age),age),gender= COALESCE(values(gender),age);
需要说明的是,在本申请实施例中,“sql”和“SQL”虽然是两种不同 的表示方式,但是其指代的含义是相同的。
为了可以准确地对输入的SQL语句进行解析,提高解析的准确度,本申 请实施例提供了一种SQL语句的处理方法,可以实现SQL语句的解析,尤 其是针对一些复杂SQL语句的解析,其相比于现有技术中采用语法文件进行 解析,其解析效果更加明显,更能体现出解析结果准确度较高的优势。下面, 将通过具体的实施例对本申请提供的SQL语句的处理方法进行详细地说明。 可以理解的是,下面这几个具体的实施例可以相互结合,对于相同或相似的 概念或过程可能在某些实施例不再赘述。
图3为本申请实施例提供的一种SQL语句的处理方法的流程示意图,该 SQL语句的处理方法可以由软件和/或硬件装置执行,例如,该硬件装置可以 为SQL语句的处理装置。示例的,请参见图3所示,该SQL语句的处理方 法可以包括:
S301、遍历待处理的SQL语句中的字符,基于预设字符和SQL语法规 则,从SQL语句中提取多组目标字符串。
示例的,预设字符可以为空格“”或者括号,括号可以为“()”,也 可以为“{}”,具体可以根据实际需要进行设置,在此,本申请实施例只是 以预设字符可以为空格或者括号为例进行说明,但并不代表本申请实施例仅 局限于此。
本申请实施例中,通过遍历待处理的SQL语句中的所有字符,基于预设 字符和SQL语法规则,对SQL语句进行解析,提高了SQL语句解析的准确 度。其中,SQL语法规则用于描述SQL语句的语法结构。
以待处理的SQL语句为下述SQL语句为例:
insert into user(user_code,name,gender,stature)values(‘1’,‘张三’,‘male’,‘1.65’)on duplicate key update name=COALESCE(values(name), name),gender=COALESCE(values(gender),age),stature= COALESCE(values(stature),stature);
基于预设字符和SQL语法规则,从SQL语句中提取的多组目标字符串 包括:“insert into”、“user”、“user_code,name,gender,stature”、“values”、 “‘1’,‘张三’,‘male’,‘1.65’”、“on duplicate key update”、以及“name= COALESCE(values(name),name),gender=COALESCE(values(gender),age), stature=COALESCE(values(stature),stature)”这7组目标字符串。其中,根据 SQL语法规则可以确定出“insertinto”为SQL语句中的insert into字面量, “user”为SQL语句中的table表名部分,“user_code,name,gender,stature” 为SQL语句中的insert columns部分,“values”为SQL语句中的values字 面量,“‘1’,‘张三’,‘male’,‘1.65’”为SQL语句中的insert values 部分、“onduplicate key update”为SQL语句中的on duplicate key update字 面量,“name=COALESCE(values(name),name),gender= COALESCE(values(gender),age),stature=COALESCE(values(stature),stature)” 为SQL语句中的update values部分。
其中,字面量可以理解为SQL语句中的关键字,例如“insert into”、 “values”、以及“on duplicate key update”字面量;非字面量可以理解为SQL 语句中除字面量之外的,可改变的字段,例如“user_code,name,gender, stature”、“‘1’,‘张三’,‘male’,‘1.65’”、以及“name=COALESCE(values(name), name),gender=COALESCE(values(gender),age),stature= COALESCE(values(stature),stature)”。
示例的,基于预设字符和SQL语法规则,从SQL语句中提取多组目标 字符串时,可以先遍历待处理的SQL语句中的所有字符,基于预设字符从SQL 语句中提取多个初始字符串;按照SQL语法规则对多个初始字符串进行处理, 得到多组目标字符串。
示例的,基于预设字符从SQL语句中提取多个初始字符串时,可以包括 两种可能的场景,在一种场景中,当预设字符为第一预设字符,例如空格时, 可以在遍历SQL语句字符的过程中,若遍历到的当前字符为首个第一预设字 符,则将SQL语句中第一个字符与当前字符之间的字符串确定为初始字符串; 若遍历到的当前字符为非首个第一预设字符,则将前一个第一预设字符与当 前字符之间的字符串确定为初始字符串。
继续以上述待处理的SQL语句为例,若遍历到第一个空格,即“insert” 后面的一个空格,则将该SQL语句中的第一个字符“i”到第一个空格之间的 字符串“insert”确定为一个初始字符串;若遍历到第三个空格,即“user” 后面的一个空格,则将该第三个空格的前一个空格,即第二个空格与当前第 三个空格之间的字符串“user”确定为一个初始字符串。
在另一种场景中,当预设字符为第二预设字符时,例如括号“()”时, 可以在遍历SQL语句字符的过程中,若遍历到的当前字符为第二预设字符, 则从当前字符之后的字符中确定第一个与第二预设字符匹配的字符;将当前 字符和与第二预设字符匹配的字符之间的字符,确定为初始字符串。
继续以上述待处理的SQL语句为例,若遍历到第一个左括号“(”,即 “user”后面的第一个左括号,则可以先确定与该第一个左括号“(”匹配的 右括号,即“stature”后面紧邻的右括号“)”,则将“user”后面的第一个 左括号“(”和“stature”后面紧邻的右括号“)”之间的字符串“user_code, name,gender,stature”确定为一个初始字符串,这样基于预设字符可以从SQL 语句中提取多个初始字符串。
基于预设字符可以从SQL语句中提取多个初始字符串后,不是直接将该 多个初始字符串确定为多组目标字符串,而是需要按照SQL语法规则对多个 初始字符串进行处理,得到多组目标字符串,具体过程为:按照SQL语法规 则对当前初始字符串进行处理;若当前初始字符串符合SQL语法规则,则将 当前初始字符串确定为一组目标字符串;若当前初始字符串不符合SQL语法 规则,且当前初始字符串和下一个初始字符串符合SQL语法规则,则将当前 初始字符串和下一个初始字符串确定为一组目标字符串;若当前初始字符串 不符合所述SQL语法规则,且当前初始字符串和下一个初始字符串不符合 SQL语法规则,则继续查找下一个初始字符串,以找到符合SQL语法规则的 目标字符串;重复执行上述步骤,直至遍历到最后一个初始字符串,以找出 所有符合SQL语法规则的多组目标字符串。具体过程换一种表述方式,即遍 历多个初始字符串,判断遍历到的当前初始字符串是否符合SQL语法规则; 若当前初始字符串符合SQL语法规则,则将当前初始字符串确定为一组目标 字符串;若当前初始字符串不符合SQL语法规则,则判断当前初始字符串和 下一个初始字符串是否符合SQL语法规则,若当前初始字符串和下一个初始 字符串符合SQL语法规则,则将当前初始字符串和下一个初始字符串确定为 一组目标字符串;若当前初始字符串不符合SQL语法规则,且当前初始字符 串和下一个初始字符串不符合SQL语法规则,则继续查找下一个初始字符串, 以找到符合SQL语法规则的目标字符串。
继续以上述待处理的SQL语句为例,假设当前初始字符串为“insert”, 根据SQL语法规则,初始字符串“insert”不能单独作为一个SQL语句的 segment组成部分,因此,可以结合下一个初始字符串“into”,并根据SQL 语法规则判断初始字符串“insert”和“into”是否符合SQL语法规则,可以 理解的是,初始字符串“insert”和“into”可以作为一个SQL语句的segment 组成部分,因此,可以将初始字符串“insert”和“into”确定为一组目标字 符串。又例如,假设当前初始字符串为“values”,根据SQL语法规则,该 初始字符串可以作为一个SQL语句的segment组成部分,因此,可以将初始 字符串“values”确定为一组目标字符串,类似的,可以按照SQL语法规则 对多个初始字符串进行处理,得到7组目标字符串,该7组目标字符串分别 为:“insert into”、“user”、“user_code,name,gender,stature”、“values”、 “‘1’,‘张三’,‘male’,‘1.65’”、“on duplicate key update”、以及“name=COALESCE(values(name),name),gender=COALESCE(values(gender),age), stature=COALESCE(values(stature),stature)”。
从SQL语句提取出7组目标字符串后,可以基于该7组目标字符串,创 建其对应的组成片段,即执行下述S302:
S302、创建多组目标字符串各自对应的组成片段。
其中,每一个组成片段可以理解为SQL语句中的一个segment,一个 segment可以包含其它segment,多个segments填充到一个Statement里面, 就可以组成一个SQL语句。
示例的,segment可以包括InserCloumnsSegment、SelectCloumnsSegment、InsertValuesSegment、UpdateValuesSegment、WhereCloumnsSegment、以及LiteralSegment等。
示例的,SQL语句的类型可以包括插入类SQL语句,可记为 InsertStatement、查询类SQL语句,可记为SelectStatement、更新类SQL语 句,可记为UpdateStatement、以及插入查询类SQL语句,可记为 InsertSelectStatement;其中,更新类SQL语句和插入查询类SQL语句均可以 看作为插入类SQL语句。
继续以上述SQL语句为例,在SQL语句提取出7组目标字符串后,可 以基于提取出的7组目标字符串创建各自对应的segment,具体过程为:可以 创建目标字符串“insertinto”对应的insert into Segment,并将该insert into Segment的类型记为LiteralSegment,创建目标字符串“user”对应的table Segment,并将该table Segment的类型记为Table Segment,创建目标字符串 “user_code,name,gender,stature”对应的insert columns Segment,并将该insert columns Segment的类型记为InsertcolumnsSegment,创建目标字符串“values” 对应的values Segment,并将该valuesSegment的类型记为LiteralSegment, 创建目标字符串“‘1’,‘张三’,‘male’,‘1.65’”对应的insert values Segment, 将该insert values Segment的类型记为InsertValuesSegment,创建目标字符串 “on duplicate key update”对应的onduplicate key update Segment,并将该on duplicate key update Segment的类型记为LiteralSegment,创建目标字符串 “name=COALESCE(values(name),name),gender=COALESCE(values(gender),age),stature=COALESCE(values(stature),stature)” 对应的update values Segment,将该update values Segment的类型记为UpdateValuesSegment,从而解析得到7组目标字符串各自对应的Segment, 即组成片段。
可参见图4所示,图4为本申请实施例提供的一种SQL语句解析结果的 示意图,可以看出,该Segment中包括7个Segment,该7个Segment分别 为:LiteralSegment、TableSegment、InsertcolumnsSegment、LiteralSegment、 InsertValuesSegment、LiteralSegment以及UpdateValuesSegment;其中,第一 个LiteralSegment对应的目标字符串为“insert into”,Ttable Segment对应的 目标字符串为“user”,InsertcolumnsSegment对应的目标字符串为“user_code, name,gender,stature”,第二个LieralSegment对应的目标字符串为“values”, InsertValuesSegment对应的目标字符串为“‘1’,‘张三’,‘male’,‘1.65’”、 第三个LiteralSegment对应的目标字符串为“onduplicate key update”,以及 UpdateValuesSegment对应的目标字符串为“name=COALESCE(values(name), name),gender=COALESCE(values(gender),age),stature=COALESCE(values(stature),stature)”。
结合上述描述,基于预设字符获取SQL语句中的多个组成片段后,可以 判断多个组成片段中是否包括关键字段。由于SQL语句中通常包括字面量组 成片段和非字面量组成片段,字面量组成片段例如“insert into”、“user”、 “values”以及“on duplicate keyupdate name”,非字面量组成片段例如 “user_code,name,gender,stature”,“‘1’,‘张三’,‘male’,‘1.65’” 以及“name=COALESCE(values(name),name),gender= COALESCE(values(gender),age),stature=COALESCE(values(stature), stature)”,鉴于字面量组成片段中通常不会包括关键字段,关键字段通常会 包含在非字面量组成片段中,因此,在判断多个组成片段中是否包括关键字 段时,可以先从多个组成片段中确定出非字面量片段,“user_code,name, gender,stature”、“‘1’,‘张三’,‘male’,‘1.65’”以及“name=COALESCE(values(name),name),gender=COALESCE(values(gender),age), stature=COALESCE(values(stature),stature)”,并将非字面量片段“user_code, name,gender,stature”和“name=COALESCE(values(name),name),gender= COALESCE(values(gender),age),stature=COALESCE(values(stature),stature)” 中的条目分别与多个预设关键字段进行匹配;若不存在匹配成功的条目,则 确定多个组成片段中不包括关键字段,可以直接执行该SQL语句;相反的, 若存在匹配成功的条目,则确定多个组成片段中包括关键字段,则分别对关 键字段和关键字段对应的取值进行加密,以生成新的SQL语句,即执行下述 S302。
由于字面量组成片段中通常不会包括关键字段,因此,只判断非字面量 片段中是否关键字段,无需遍历字面量片段,简化了遍历操作,从而提高了 关键字段的确定效率。
需要说明的是,在本申请实施例中,在将非字面量片段与多个预设关键 字段进行匹配时,之所以未匹配非字面量“‘1’,‘张三’,‘male’,‘1.65’”, 是因为非字面量“‘1’,‘张三’,‘male’,‘1.65’”是非字面量“user_code, name,gender,stature”的赋值,当非字面量“user_code,name,gender,stature” 中包括关键字段时,例如,关键字段为“name”,则除了对关键字段“name” 进行加密之外,也需要对该关键字段对应的取值“张三”进行加密,以生成 新的SQL语句。
S303、若确定多个组成片段中包括关键字段,则分别对关键字段和关键 字段对应的取值进行加密,以生成新的SQL语句。
示例的,在分别对关键字段和关键字段对应的取值进行加密,以生成新 的SQL语句时,可以先分别对关键字段和关键字段对应的取值进行加密,得 到关键字段和取值各自对应的密文字段;从多个组成片段中分别获取关键字 段所属的组成片段,以及取值所属的组成片段;将关键字段对应的密文字段 添加到关键字段所属的组成片段中,并将取值对应的密文字段添加到取值所 属的组成片段中,以生成新的SQL语句。
继续以上述待处理的SQL语句为例,假设关键字段为“name”,则可以 先对关键字段“name”和“name”对应的取值进行加密,得到关键字段“name” 和取值“张三”各自对应的密文字段,可记关键字段“name”的密文字段为 “name_enc”,取值“张三”对应的密文字段为“XXX”,并确定关键字段 “name”所属的组成片段,以及取值“张三”所属的组成片段,可以看出, 关键字段“name”所属的组成片段为“user_code,name,gender,stature”和 “name=COALESCE(values(name),name),gender= COALESCE(values(gender),age),stature=COALESCE(values(stature), stature)”,取值“张三”所属的组成片段为“‘1’,‘张三’,‘male’,‘1.65’”, 则将关键字段“name”的密文字段“name_enc”分别添加至关键字段“name” 所属的组成片段“user_code,name,gender,stature”和“name= COALESCE(values(name),name),gender=COALESCE(values(gender),age), stature=COALESCE(values(stature),stature)”中,并将取值“张三”对应的密 文字段“XXX”添加至取值“张三”所属的组成片段为“‘1’,‘张三’, ‘male’,‘1.65’”,得到7个新的Segment,可参见图5所示,图5为本申 请实施例提供的一种加密后解析结果的示意图,该7个Segment分别为:LiteralSegment、Table Segment、InsertcolumnsSegment、LiteralSegment、InsertValuesSegment、LiteralSegment以及UpdateValuesSegment;其中,第一 个LiteralSegment对应的目标字符串为“insert into”,Table Segment对应的 目标字符串为“user”,InsertcolumnsSegment对应的目标字符串为“user_code, name,gender,stature,name_enc”,第二个LieralSegment对应的目标字符串为 “values”,InsertValuesSegment对应的目标字符串为“‘1’,‘张三’,‘male’, ‘1.65’‘XXX’”、第三个LiteralSegment对应的目标字符串为“on duplicate key update”,以及UpdateValuesSegment对应的目标字符串为“name= COALESCE(values(name),name),name_enc=COALESCE(values(name_enc), name_enc),gender=COALESCE(values(gender),age),stature= COALESCE(values(stature),stature)”。
上述7个Segment可以填充得到一个Statement,基于填充得到的 Statement可以生成新的SQL语句,如下:
insert into user(user_code,name,gender,stature,name_enc)values(‘1’,‘张三’,‘male’,‘1.65’,XXX)on duplicate key update name= COALESCE(values(name),name),name_enc=COALESCE(values(name_enc), name_enc),gender=COALESCE(values(gender),age),stature= COALESCE(values(stature),stature);
在生成加密后的SQL语句后,就可以执行该新的SQL语句。
可以看出,本申请实施例中,在对SQL语句进行处理时,可以先遍历待 处理的SQL语句中的字符,基于预设字符和SQL语法规则,从SQL语句中 提取多组目标字符串;并创建多组目标字符串各自对应的组成片段,若确定 多个组成片段中包括关键字段,则分别对关键字段和关键字段对应的取值进 行加密,以生成新的SQL语句。这样通过遍历SQL语句中的所有字符,并 基于预设字符和SQL语法规则对SQL语句进行解析,提高了SQL语句解析 的准确度,使得后续基于解析结果生成的新的SQL语句时,提高了新的SQL 语句的准确度。
此外,采用遍历SQL语句中的所有字符,并基于预设字符和SQL语法 规则对SQL语句进行解析,不侵入业务代码,影响范围只限于特定类型的 SQL;例如insert SQL语句和update SQL语句,只会影响特定包含敏感字段 表的SQL,而不会影响不包括敏感字段表的SQL,因此,本方案实施例无需 像现有方案一样修改datasource层,避免因修改datasource层对包含非敏感字 段表的SQL也造成影响,进而对整个系统的影响较小,提高了系统的安全性。 其中,datasource,翻译成中文即为数据源,在本申请实施例中,datasource 可以作为操作数据库的一个接口。
基于上述图3所示的实施例,在执行上述S301遍历待处理的SQL语句 中的所有字符之前,可以先判断SQL语句的类型;若SQL语句的类型为插 入类型,即为插入类SQL语句,则可以先判断该SQL语句对应的插入文件 中是否包括关键字段;若SQL语句对应的插入文件中包括关键字段,则遍历 SQL语句中的所有字符,进行解析;相反的,若SQL语句对应的插入文件中 不包括关键字段,则无需对该SQL语句进行解析,直接执行该SQL语句即 可。SQL语句的类型为查询类型,即为查询类SQL语句,则可以判断该SQL 语句中是否包括预设注释信息,例如@AutoTranslate,若该SQL语句中包括 预设注释信息,说明该SQL语句中包括关键字段,则遍历SQL语句中的所 有字符,进行解析;相反的,若该SQL语句中不包括预设注释信息,说明该 SQL语句中不包括关键字段,则无需对该SQL语句进行解析,直接执行该 SQL语句即可,这样只需要对包括预设注释信息的查询类SQL语句进行回归, 无需对所有SQL语句,例如不包括预设注释信息的查询类SQL语句进行回 归,降低了需要数据处理量,从而提高了处理效率。
示例的,包括预设注释信息的查询SQL语句可以为:
@AutoTranslate
@Select("select phoneNumber from import_success_invalid_number whereguid=#{guid}")
List<String>cacheInvalidExcelContainsGuid(@Param("guid")String guid)。
为了便于理解本申请实施例提供的SQL语句的处理方法,下面,将分别 以SQL语句为插入类SQL和查询类SQL为例,对本申请实施例提供的SQL 语句的处理方法进行详细描述。
在处理待处理的SQL语句时,可以通过Mybatis的拦截器获取待处理的 SQL语句,并对该待处理的SQL语句进行解析、加密以及双写操作。以待处 理的SQL语句为下述insertSQL语句为例:
insert into customer(customer_code,name,age,gender)values(‘1’,‘张三’,20,‘male’)on duplicate key update name=COALESCE(values(name), name),age=COALESCE(values(age),age),gender= COALESCE(values(gender),gender);
在对待处理的SQL语句进行解析时,可以先创建一个对象,可记为insertStatement,并遍历该待处理的SQL语句中的所有字符,基于空格或者括 号对SQL语句进行解析,以提取SQL语句中的多个Segment。示例的,基于 空格或者括号对SQL语句进行解析时,可以使用ParseStrategy进行解析, ParseStrategy可以理解为代码层对于解析策略的抽象。其中, TokenParseStrategy包括SelectTokenParseStrategy、InsertTokenParseStrategy、 UpdateTokenParseStrategy、以及InsertSelectTokenParseStrategy,用于实现不 同SQL语句的解析策略。以该insert SQL语句为例,则可以采用 InsertTokenParseStrategy进行解析,具体过程可参见如下步骤:
步骤1、基于预设字符和SQL语法规则,从SQL语句中提取目标字符串 “insertinto”,并基于目标字符串“insert into”创建其对应的组成片段insert into Segment。具体过程为:可以先从insert SQL语句的第一个字符开始,调 用nextToken获取初始字符串insert,并继续调用nextToken获取初始字符串 into,初始字符串“insert”和“into”符合语法规则,可以记为一组目标字符 串,即insert SQL语句中的insert into字面量;并根据insert into字面量生成 对应的组成片段insert into Segment,并将该insert intoSegment的类型记为 LiteralSegment,再将insert into Segment添加至预先创建的对象insertStatement 中。
示例的,调用nextToken获取字面量的过程,可参见下述伪代码:
Figure BDA0003132128490000151
Figure BDA0003132128490000161
步骤2、基于预设字符和SQL语法规则,从SQL语句中提取目标字符串 “customer”,并基于目标字符串“customer”创建其对应的组成片段Table Segment。具体过程为:从insert SQL语句中insert into字面量的下一个字符 开始,调用nextToken获取tableName表名部分customer,该初始字符串 “customer”符合语法规则,可以记为一组目标字符串,即上述insert SQL 语句中的“customer”;并根据tableName表名部分生成对应的tableSegment, 并将该table Segment的类型记为Table Segment,再将table Segment添加至预先创建的对象insertStatement中。
步骤3、基于预设字符和SQL语法规则,从SQL语句中提取目标字符串 “customer_code,name,age,gender”,并基于目标字符串“customer_code, name,age,gender”创建其对应的组成片段insert columns Segment。具体过 程为:从insert SQL语句中tableName表名部分的下一个字符开始,以预设字 符“(”和其匹配的第一个字符“)”作为提取依据,从insert SQL中提取 出预设字符“(”和其匹配的第一个字符“)”之间的初始字符串“customer_code, name,age,gender”,并判断该初始字符串“customer_code,name,age,gender”是否符合SQL语句的语法规则,可以看出,该初始字符串 “customer_code,name,age,gender”是否符合SQL语句的语法规则,因 此,可以将该初始字符串“customer_code,name,age,gender”作为insert SQL 语句中的insert columns部分,并在预设字符“(”和其匹配的第一个字符“)” 之间解析Token,每解析一个Token表示数据库中的一列数据,提取出insert SQL语句中的insert columns部分,即上述insert SQL语句中的 “customer_code,name,age,gender”,并根据“customer_code,name,age, gender”,创建insertcolumns Segment,并将该insert columns Segment的类型 记为InsertcolumnsSegment,再将insert columns Segment添加至预先创建的对 象insertStatement中。
步骤4、基于预设字符和SQL语法规则,从SQL语句中提取目标字符串 “values”,并基于目标字符串“values”创建其对应的组成片段values Segment。 具体过程为:从insertSQL语句中insert columns部分的下一个字符开始,调 用nextToken获取初始字符串values,初始字符串“values”符合语法规则, 可以记为一组目标字符串,即insert SQL语句中的values字面量;根据“values” 字面量生成对应的values Segment,并将该valuesSegment的类型记为 LiteralSegment,再将values Segment添加至预先创建的对象insertStatement 中。
步骤5、基于预设字符和SQL语法规则,从SQL语句中提取目标字符串 “insertvalues”,并基于目标字符串“insert values”创建其对应的组成片段 insert valuesSegment。具体过程为:从insert SQL语句中values字面量的下一 个字符开始,以预设字符“(”和其匹配的第一个字符“)”作为提取依据, 通常情况下,由于涉及批量插入,因此,可以匹配每一对(),且每一对() 中的字符串即为一组插入值,并可以将每一组插入值添加在insert values数组 中,从而解析insert SQL语句中的insert values部分,具体实现可参见下述伪 代码:
Figure BDA0003132128490000171
Figure BDA0003132128490000181
通过该部分伪代码,可以从insert SQL语句中values字面量的下一个字 符开始,以预设字符“(”和其匹配的第一个字符“)”作为提取依据,匹 配每一对(),且每一对()中的字符串即为一组插入值,并可以将每一组 插入值添加在insert values数组中,从而解析得到insert SQL语句中的insert values部分。
其中,解析得到的insert values部分为“‘?’,‘?’,?,‘?’”,“?” 可以理解为占位符,用于接收插入值“‘1’,‘张三’,20,‘male’”,后续 在执行SQL语句时,再将values值“‘1’,‘张三’,20,‘male’”对应插入 至insert SQL语句中的“?”位置,只是在解析时,解析得到的insert values 部分为“‘?’,‘?’,?,‘?’”,并根据“‘?’,‘?’,?,‘?’”, 创建insertvalues Segment,将该insert values Segment的类型记为 InsertValuesSegment,再将insert values Segment添加至预先创建的对象 insertStatement中。
需要说明的是,在insert values Segment创建过程中,可以统计insert values部分中“?”的数量,使得后续可以根据“?”的数量,计算插入位置,从 而将values值“‘1’,‘张三’,20,‘male’”对应插入至insert SQL语句中 的“?”位置,具体实现可参见下述伪代码:
Figure BDA0003132128490000182
Figure BDA0003132128490000191
确定出每组插入值末尾的插入位置后,后续在执行SQL语句时,就可以 直接将values值“‘1’,‘张三’,20,‘male’”对应插入至insert SQL语句 中的“?”位置。
步骤6、基于预设字符和SQL语法规则,从SQL语句中提取目标字符串 “onduplicate key update”,并基于目标字符串“on duplicate key update”创 建其对应的组成片段on duplicate key update Segment。具体过程为:从insert values部分的下一个字符开始,调用nextToken获取初始字符串on,继续调 用nextToken获取初始字符串duplicate,继续调用nextToken获取初始字符串 key,继续调用nextToken获取初始字符串update,初始字符串“on duplicate key update”符合语法规则,可以记为一组目标字符串,即insert SQL语句中的 on duplicate key update;根据on duplicate key update字面量生成对应的on duplicate key update Segment,并将该on duplicate key updateSegment的类型 记为LiteralSegment,再将on duplicate key update Segment添加至预先创建的 对象insertStatement中。
步骤7、基于预设字符和SQL语法规则,从SQL语句中提取目标字符串 “name=COALESCE(values(name),name),age=COALESCE(values(age),age), gender=COALESCE(values(gender),gender)”,并基于目标字符串“name= COALESCE(values(name),name),age=COALESCE(values(age),age),gender= COALESCE(values(gender),gender)”创建其对应的组成片段update values Segment。具体过程为:从on duplicate key update字面量的下一个字符开始, 以预设字符“,”作为分割依据,分割每一个update项,并将每一个update 项添加在update values数组中,从而解析insert SQL语句中的update values 部分,具体实现可参见下述伪代码:
Figure BDA0003132128490000201
通过该部分伪代码,可以从on duplicate key update字面量的下一个字符 开始,以预设字符“,”作为分割依据,分割每一个update项,并将每一个 update项添加在update values数组中,从而解析insert SQL语句中的update values部分。
在解析得到insert SQL语句中的update values部分后,创建update valuesSegment,将该update values Segment的类型记为UpdateValuesSegment,再将 updatevalues Segment添加至预先创建的对象insertStatement中。
需要说明的是,在update values Segment创建过程中,可以将每一个 updatevalues拆分成为Column部分和Express部分,其中,Column部分为等 号左边的部分,Express部分为等号右边的部分,具体实现可参见下述伪代码:
UpdateValuesSegment(updateValues){//构造UpdateValuesSegment,使用 解析出的updateValues数组
for(对于updateValues每一个值updateValue){
查找updateValue中第一个'='号;
提取'='号左边部分为columnName,并添加到updateColumnNames数组;
提起'='号右边部分为expression,将columnName和expression构造成一个pair并添加到updateValuesPair中;
}
}
结合上述步骤1-7,可以完成对insert SQL语句:insert into customer(customer_code,name,age,gender)values(‘1’,‘张三’,20,‘male’)on duplicate keyupdate name=COALESCE(values(name),name),age= COALESCE(values(age),age),gender=COALESCE(values(gender),gender)的解 析,经过解析后,可以得到该insertSQL语句包括的7个组成片段,可参见 图6所示,图6为本申请实施例提供的一种insert SQL语句解析结果的示意 图,7个组成片段分别为:LiteralSegment、TableSegment、InsertColumnsSegment、LiteralSegment、InsertValuesSegment、LiteralSegment、 以及UpdateValuesSegment。
其中,第一个LiteralSegment对应的目标字符串为“insert into”,TableSegment对应的目标字符串为“customer”,InsertColumnsSegment对应 的目标字符串为“customer_code,name,age,gender”,第二个LiteralSegment 对应的目标字符串为“values”,InsertValuesSegment对应的目标字符串为“‘1’, ‘张三’,20,‘male’”,第三个LiteralSegment对应的目标字符串为“on duplicate key update name”,UpdateValuesSegment对应的目标字符串为“name= COALESCE(values(name),name),age=COALESCE(values(age),age),gender= COALESCE(values(gender),gender)”。
解析得到对象insertStatement后,可以基于对象insertStatement和拦截器 对象,例如Mybatis对象,共同创建结果构造器finalResultBuider,并使用对 象insertStatement中的insert into Segment初始化结果构造器finalResultBuider 中的insert into Segment,使用对象insertStatement中的table Segment初始化 结果构造器finalResultBuider中的table Segment,使用对象insertStatement中 的values Segment初始化结果构造器finalResultBuider中的values Segment, 使用对象insertStatement中的on duplicate key update Segmentt初始化结果构 造器finalResultBuider中的onduplicate key update Segment,使用对象 insertStatement中的insert columnsSegment初始化结果构造器 finalResultBuider中的insert columns Segment,使用对象insertStatement中的 insert values Segment初始化结果构造器finalResultBuider中的insert values Segment,再使用对象insertStatement中的update values Segment初始化结果 构造器finalResultBuider中的update values Segment,在通过对象insertStatement中的7个组成片段对结果构造器finalResultBuider初始化后, 若初始化Mybatis需要用到的变量newParamerMappings为空,则初始化 Mybatis需要用到的变量additionalParams变量为当前已有变量值,调用函数 handleInsertValuesSegment对insert Columns中的关键字段进行处理,即添加 关键字段对应的密文字段和对应的密文值,具体实现可参见下述伪代码:
Figure BDA0003132128490000221
Figure BDA0003132128490000231
之后,再调用函数handleUpdateValuesSegment对update values中的关键 字段进行处理,即添加关键字段对应的密文字段的update value,具体实现可 参见下述伪代码:
Figure BDA0003132128490000232
结合上述描述,可以得到结果构造器finalResultBuider中包括的7个组成 片段,可参见图7所示,图7为本申请实施例提供的一种加密后解析结果的 示意图,7个组成片段仍分别为:LiteralSegment、TableSegment、 InsertColumnsSegment、LiteralSegment、InsertValuesSegment、LiteralSegment、 以及UpdateValuesSegment。
其中,第一个LiteralSegment对应的目标字符串为“insert into”,TableSegment对应的目标字符串为“customer”,InsertColumnsSegment对应 的目标字符串为“customer_code,name,age,gender,name_enc”,第二个LiteralSegment对应的目标字符串为“values”,InsertValuesSegment对应的 目标字符串为“‘1’,‘张三’,20,‘male’,‘XXXX’”,第三个LiteralSegment 对应的目标字符串为“on duplicate key updatename”,UpdateValuesSegment 对应的目标字符串为“name=COALESCE(values(name),name),name_enc= COALESCE(values(name_enc),name_enc),age=COALESCE(values(age),age), gender=COALESCE(values(gender),gender)”。
调用finalResultBuilder的buildFinalSql对新的各个segment重新组装成一 个新的insert SQL,该新的insert SQL即为最终执行的insert SQL,其组装过 程可参见下述伪代码:
buildFinalSql(){
sql=空字符串;
sql添加insertIntoSegment;
sql添加空格;
sql添加tableSegment;
sql添加空格;
sql添加"(";
sql添加以","连接的finalInsertColumns;
sql添加"(";
sql添加空格;
sql添加valuesSegment;
sql添加空格;
sql添加以","连接的finalInsertValues;
sql添加空格;
sql添加onDuplicateKeyUpdateSegment;
sql添加空格;
sql添加以","连接的finalUpdateColumns;
返回最终sql
}
结合上述组装方法,得到最终执行的insert SQL为:
insert into customer(customer_code,name,name_enc,age,gender) values(‘1’,‘张三’,‘xxxxxxx’,20,‘male’)on duplicate key update name= COALESCE(values(name),name),name_enc=COALESCE(values(name_enc), name_enc),age=COALESCE(values(age),age),gender= COALESCE(values(gender),age);
这样通过遍历待处理的insert SQL语句中的所有字符,并基于预设字符 对insert SQL语句进行解析,提高了insert SQL语句解析的准确度,使得后 续基于解析结果生成的新的insert SQL语句时,提高了新的insert SQL语句 的准确度。
图8为本申请实施例提供的一种SQL语句的处理装置80的结构示意图, 示例的,请参见图8所示,该SQL语句的处理装置80可以包括:
处理单元801,用于遍历待处理的SQL语句中的所有字符,基于预设字 符和SQL语法规则,从SQL语句中提取多组目标字符串。
创建单元802,用于创建多组目标字符串各自对应的组成片段。
加密单元803,用于若确定多个组成片段中包括关键字段,则分别对关 键字段和关键字段对应的取值进行加密,以生成新的SQL语句。
可选的,处理单元801,具体用于遍历待处理的SQL语句中的所有字符, 基于预设字符从SQL语句中提取多个初始字符串;按照SQL语法规则对多 个初始字符串进行处理,得到多组目标字符串。
可选的,预设字符为第一预设字符,处理单元801,具体用于:
在遍历SQL语句字符的过程中,若遍历到的当前字符为首个第一预设字 符,则将SQL语句中第一个字符与当前字符之间的字符串确定为初始字符串; 若遍历到的当前字符为非首个第一预设字符,则将前一个第一预设字符与当 前字符之间的字符串确定为初始字符串。
可选的,预设字符为第二预设字符,处理单元801,具体用于:
在遍历SQL语句字符的过程中,若遍历到的当前字符为第二预设字符, 则从当前字符之后的字符中确定第一个与第二预设字符匹配的字符;将当前 字符和与第二预设字符匹配的字符之间的字符,确定为初始字符串。
可选的,处理单元801,具体用于按照SQL语法规则对当前初始字符串 进行处理;若当前初始字符串符合SQL语法规则,则将当前初始字符串确定 为一组目标字符串;若当前初始字符串不符合SQL语法规则,且当前初始字 符串和下一个初始字符串符合SQL语法规则,则将当前初始字符串和下一个 初始字符串确定为一组目标字符串;若当前初始字符串不符合SQL语法规则, 且当前初始字符串和下一个初始字符串不符合SQL语法规则,则继续查找下 一个初始字符串,以找到符合SQL语法规则的目标字符串;重复执行上述步 骤,直至遍历到最后一个初始字符串,以找出所有符合SQL语法规则的多组 目标字符串。
可选的,加密单元803,具体用于从多个组成片段中确定非字面量片段, 非字面量片段中包括至少一个栏目;将至少一个栏目与多个预设关键字段进 行匹配;若存在匹配成功的栏目,则确定非字面量片段中包括关键字段。
可选的,加密单元803,具体用于分别对关键字段和关键字段对应的取 值进行加密,得到关键字段和取值各自对应的密文字段;从多个组成片段中 分别获取关键字段所属的组成片段,以及取值所属的组成片段;将关键字段 对应的密文字段添加到关键字段所属的组成片段中,并将取值对应的密文字 段添加到取值所属的组成片段中,以生成新的SQL语句。
可选的,处理单元801,具体用于判断SQL语句的类型;若类型为查询 类型,则判断SQL语句中是否包括预设注释信息,若SQL语句中包括预设 注释信息,则遍历SQL语句中的所有字符。
可选的,加密单元803,还用于若类型为插入类型,则确定SQL语句对 应的插入文件中是否包括关键字段;若SQL语句对应的插入文件中包括关键 字段,则遍历SQL语句中的所有字符。
本申请实施例提供的SQL语句的处理装置80,可以执行上述任一实施例 中SQL语句的处理方法的技术方案,其实现原理以及有益效果与SQL语句 的处理方法的实现原理及有益效果类似,可参见SQL语句的处理方法的实现 原理及有益效果,此处不再进行赘述。
图9为本申请实施例提供的一种电子设备90的结构示意图,示例的,请 参见图9所示,该电子设备90可以包括处理器901和存储器902;其中,
所述存储器902,用于存储计算机程序。
所述处理器901,用于读取所述存储器902存储的计算机程序,并根据 所述存储器902中的计算机程序执行上述实施例中的SQL语句的处理方法。
可选地,存储器902既可以是独立的,也可以跟处理器901集成在一起。 当存储器902是独立于处理器901之外的器件时,电子设备90还可以包括: 总线,用于连接存储器902和处理器901。
可选地,本实施例还包括:通信接口,该通信接口可以通过总线与处理 器901连接。处理器901可以控制通信接口来实现上述电子设备90的获取和 发送的功能。
示例的,在本申请实施例中,电子设备90可以为终端,也可以为服务器, 具体可以根据实际需要进行设置。
本申请实施例所示的电子设备90,可以执行上述实施例中的SQL语句的 处理的技术方案,其实现原理以及有益效果与SQL语句的处理方法的实现原 理及有益效果类似,可参见SQL语句的处理方法的实现原理及有益效果,此 处不再进行赘述。
本申请实施例还提供一种计算机可读存储介质,该计算机可读存储介质 中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现上述 实施例中的SQL语句的处理方法的技术方案,其实现原理以及有益效果与 SQL语句的处理方法的实现原理及有益效果类似,可参见SQL语句的处理方 法的实现原理及有益效果,此处不再进行赘述。
本申请实施例还提供了一种计算机程序产品,包括计算机程序,该计算 机程序被处理器执行时,实现上述实施例中的SQL语句的处理方法的技术方 案,其实现原理以及有益效果与SQL语句的处理方法的实现原理及有益效果 类似,可参见SQL语句的处理方法的实现原理及有益效果,此处不再进行赘 述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法, 可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的, 例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外 的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或 一些特征可以忽略,或不执行。另一点,所展示或讨论的相互之间的耦合或 直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连 接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作 为单元展示的部件可以是或者也可以不是物理单元,即可以位于一个地方, 或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或 者全部单元来实现本实施例方案的目的。另外,在本申请各个实施例中的各 功能单元可以集成在一个加密单元中,也可以是各个单元单独物理存在,也 可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬 件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机 可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指 令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等) 或处理器(英文:processor)执行本申请各个实施例方法的部分步骤。
应理解的是,上述处理器可以是中央加密单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文: Digital SignalProcessor,简称:DSP)、专用集成电路(英文:Application Specific IntegratedCircuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理 器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体 现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM, 例如至少一个磁盘存储器,还可以为U盘、移动硬盘、只读存储器、磁盘或 光盘等。
总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总 线、外部设备互连(Peripheral Component,PCI)总线或扩展工业标准体系结 构(ExtendedIndustry Standard Architecture,EISA)总线等。总线可以分为地 址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限 定仅有一根总线或一种类型的总线。
上述计算机可读存储介质可以是由任何类型的易失性或非易失性存储设 备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编 程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程 只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁 盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对 其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通 技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改, 或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并 不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (12)

1.一种结构化查询语言SQL语句的处理方法,其特征在于,包括:
遍历待处理的SQL语句中的字符,基于预设字符和SQL语法规则,从所述SQL语句中提取多组目标字符串;
创建所述多组目标字符串各自对应的组成片段;
若确定多个组成片段中包括关键字段,则分别对所述关键字段和所述关键字段对应的取值进行加密,以生成新的SQL语句。
2.根据权利要求1所述的方法,其特征在于,所述遍历待处理的SQL语句中的字符,基于预设字符和SQL语法规则,从所述SQL语句中提取多组目标字符串,包括:
遍历待处理的SQL语句中的字符,基于预设字符从所述SQL语句中提取多个初始字符串;
按照所述SQL语法规则对所述多个初始字符串进行处理,得到所述多组目标字符串。
3.根据权利要求2所述的方法,其特征在于,所述预设字符为第一预设字符;
所述遍历待处理的SQL语句中的字符,基于预设字符从所述SQL语句中提取多个初始字符串,包括:
在遍历所述SQL语句字符的过程中,若遍历到的当前字符为首个所述第一预设字符,则将所述SQL语句中第一个字符与所述当前字符之间的字符串确定为所述初始字符串;
若遍历到的当前字符为非首个所述第一预设字符,则将前一个所述第一预设字符与所述当前字符之间的字符串确定为所述初始字符串。
4.根据权利要求2所述的方法,其特征在于,所述预设字符为第二预设字符;
所述遍历待处理的SQL语句中的所有字符,基于预设字符从所述SQL语句中提取多个初始字符串,包括:
在遍历所述SQL语句字符的过程中,若遍历到的当前字符为所述第二预设字符,则从所述当前字符之后的字符中确定第一个与所述第二预设字符匹配的字符;
将所述当前字符和所述与所述第二预设字符匹配的字符之间的字符,确定为所述初始字符串。
5.根据权利要求2-4任一项所述的方法,其特征在于,所述按照所述SQL语法规则对所述多个初始字符串进行处理,得到所述多组目标字符串,包括:
按照所述SQL语法规则对当前初始字符串进行处理;
若所述当前初始字符串符合所述SQL语法规则,则将所述当前初始字符串确定为一组目标字符串;
若所述当前初始字符串不符合所述SQL语法规则,且当前初始字符串和下一个初始字符串符合所述SQL语法规则,则将所述当前初始字符串和所述下一个初始字符串确定为一组目标字符串;
若所述当前初始字符串不符合所述SQL语法规则,且当前初始字符串和下一个初始字符串不符合所述SQL语法规则,则继续查找下一个初始字符串,以找到符合SQL语法规则的目标字符串;
重复执行上述步骤,直至遍历到最后一个初始字符串,以找出所有符合SQL语法规则的所述多组目标字符串。
6.根据权利要求1-4任一项所述的方法,其特征在于,所述确定所述多个组成片段中包括关键字段,包括:
从所述多个组成片段中确定非字面量片段,所述非字面量片段中包括至少一个栏目;
将所述至少一个栏目与多个预设关键字段进行匹配;
若存在匹配成功的栏目,则确定所述非字面量片段中包括所述关键字段。
7.根据权利要求1-4任一项所述的方法,其特征在于,所述分别对所述关键字段和所述关键字段对应的取值进行加密,以生成新的SQL语句,包括:
分别对所述关键字段和所述关键字段对应的取值进行加密,得到所述关键字段和所述取值各自对应的密文字段;
从所述多个组成片段中分别获取所述关键字段所属的组成片段,以及所述取值所属的组成片段;
将所述关键字段对应的密文字段添加到所述关键字段所属的组成片段中,并将所述取值对应的密文字段添加到所述取值所属的组成片段中,以生成所述新的SQL语句。
8.根据权利要求1-4任一项所述的方法,其特征在于,所述遍历待处理的SQL语句中的字符,包括:
判断所述SQL语句的类型;
若所述类型为查询类型,则判断所述SQL语句中是否包括预设注释信息,若所述SQL语句中包括所述预设注释信息,则遍历所述SQL语句中的字符。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
若所述类型为插入类型,则确定所述SQL语句对应的插入文件中是否包括所述关键字段;
若所述SQL语句对应的插入文件中包括所述关键字段,则遍历所述SQL语句中的字符。
10.一种结构化查询语言SQL语句的处理装置,其特征在于,包括:
处理单元,用于遍历待处理的SQL语句中的所有字符,基于预设字符获取所述SQL语句中的多个组成片段;
加密单元,用于若确定多个组成片段中包括关键字段,则分别对所述关键字段和所述关键字段对应的取值进行加密,以生成新的SQL语句;
执行单元,用于执行所述新的SQL语句。
11.一种电子设备,其特征在于,包括:存储器,处理器;
存储器;用于存储计算机程序;
所述处理器,用于读取所述存储器存储的计算机程序,并根据所述存储器中的计算机程序执行上述权利要求1-9任一项所述的结构化查询语言SQL语句的处理方法。
12.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如权利要求1-9任一项所述的结构化查询语言SQL语句的处理方法。
CN202110708041.6A 2021-06-24 2021-06-24 结构化查询语言sql语句的处理方法、装置和电子设备 Active CN113722348B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110708041.6A CN113722348B (zh) 2021-06-24 2021-06-24 结构化查询语言sql语句的处理方法、装置和电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110708041.6A CN113722348B (zh) 2021-06-24 2021-06-24 结构化查询语言sql语句的处理方法、装置和电子设备

Publications (2)

Publication Number Publication Date
CN113722348A true CN113722348A (zh) 2021-11-30
CN113722348B CN113722348B (zh) 2023-05-23

Family

ID=78672950

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110708041.6A Active CN113722348B (zh) 2021-06-24 2021-06-24 结构化查询语言sql语句的处理方法、装置和电子设备

Country Status (1)

Country Link
CN (1) CN113722348B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115237936A (zh) * 2022-09-14 2022-10-25 北京海致星图科技有限公司 检测sql语句中字段的方法、装置、存储介质和设备

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105373607A (zh) * 2015-11-13 2016-03-02 国网智能电网研究院 一种电力业务系统sql访问日志压缩方法
CN107885876A (zh) * 2017-11-29 2018-04-06 北京安华金和科技有限公司 一种基于sql语句改写的动态脱敏方法
CN111475525A (zh) * 2020-03-05 2020-07-31 平安科技(深圳)有限公司 基于结构化查询语言的脱敏方法、及其相关设备
CN112162995A (zh) * 2020-09-17 2021-01-01 北京人大金仓信息技术股份有限公司 过程化语言sql语句处理方法、装置、介质和电子设备
CN112417476A (zh) * 2020-11-24 2021-02-26 广州华熙汇控小额贷款有限公司 敏感数据的脱敏方法及数据脱敏系统
CN112560100A (zh) * 2020-12-22 2021-03-26 网易(杭州)网络有限公司 数据脱敏方法及装置、计算机可读存储介质、电子设备
CN112765658A (zh) * 2021-01-15 2021-05-07 杭州数梦工场科技有限公司 一种数据脱敏方法、装置及电子设备和存储介质

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105373607A (zh) * 2015-11-13 2016-03-02 国网智能电网研究院 一种电力业务系统sql访问日志压缩方法
CN107885876A (zh) * 2017-11-29 2018-04-06 北京安华金和科技有限公司 一种基于sql语句改写的动态脱敏方法
CN111475525A (zh) * 2020-03-05 2020-07-31 平安科技(深圳)有限公司 基于结构化查询语言的脱敏方法、及其相关设备
CN112162995A (zh) * 2020-09-17 2021-01-01 北京人大金仓信息技术股份有限公司 过程化语言sql语句处理方法、装置、介质和电子设备
CN112417476A (zh) * 2020-11-24 2021-02-26 广州华熙汇控小额贷款有限公司 敏感数据的脱敏方法及数据脱敏系统
CN112560100A (zh) * 2020-12-22 2021-03-26 网易(杭州)网络有限公司 数据脱敏方法及装置、计算机可读存储介质、电子设备
CN112765658A (zh) * 2021-01-15 2021-05-07 杭州数梦工场科技有限公司 一种数据脱敏方法、装置及电子设备和存储介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115237936A (zh) * 2022-09-14 2022-10-25 北京海致星图科技有限公司 检测sql语句中字段的方法、装置、存储介质和设备
CN115237936B (zh) * 2022-09-14 2024-04-05 北京海致星图科技有限公司 检测sql语句中字段的方法、装置、存储介质和设备

Also Published As

Publication number Publication date
CN113722348B (zh) 2023-05-23

Similar Documents

Publication Publication Date Title
CN111522816B (zh) 基于数据库引擎的数据处理方法、装置、终端及介质
US11811911B2 (en) Method and system for partitioned blockchains and enhanced privacy for permissioned blockchains
EP3482526B1 (en) Method and system for verification of identity attribute information
CN111177184A (zh) 基于自然语言的结构化查询语言转换方法、及其相关设备
EP3275115A2 (en) Database server and client for query processing on encrypted data
CN111475525A (zh) 基于结构化查询语言的脱敏方法、及其相关设备
CN112560100B (zh) 数据脱敏方法及装置、计算机可读存储介质、电子设备
CN114328574A (zh) 一种数据查询方法、装置、电子设备及计算机可读存储介质
CN114090671A (zh) 数据导入方法、装置、电子设备及存储介质
US20080195610A1 (en) Adaptive query expression builder for an on-demand data service
CN112905620B (zh) 数据查询方法及装置、电子设备、存储介质
US11222131B2 (en) Method for a secure storage of data records
CN113722348B (zh) 结构化查询语言sql语句的处理方法、装置和电子设备
CN107291851B (zh) 基于属性加密的密文索引构造方法及其查询方法
CN113900702A (zh) 游戏配置数据的调用方法及装置、存储介质、电子装置
CN113297238A (zh) 基于历史变更记录进行信息挖掘的方法和装置
CN117234517A (zh) 接口参数校验方法、装置、设备及存储介质
CN110795617A (zh) 一种搜索词的纠错方法及相关装置
CN113254470B (zh) 一种数据更改方法、装置、计算机设备及存储介质
CN115525671A (zh) 数据查询方法、装置、设备及存储介质
CN113032836B (zh) 数据脱敏方法和装置
US11481391B1 (en) Query language operations using a scalable key-item data store
US10789067B2 (en) System and method for identifying open source usage
US20150324333A1 (en) Systems and methods for automatically generating hyperlinks
CN117909389A (zh) 一种sql模糊查询方法、设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant