单句SQL语句的解析方案_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

单句SQL语句的解析方案

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:方案解析语句from
黑客防线网安网讯:  数据是程序处理的主要内容,它一般存储在关系型数据库中,要操作它们最终必须要通过SQL语句来完成,因此,解读分析和处理SQL语句成为程序员的基本工作内容之一,当然有时这项任务是比较...

  数据是程序处理的主要内容它一般存储在关系型数据库中要操作它们最终必须要通过SQL语句来完成,因此,解读分析和处理SQL语句成为程序员的基本工作内容之一,当然有时这项任务是比较乏味的,如果让计算机来完成一些基本的分析解读工作如找出SQL语句涉及了哪些表,字段和条件等,可以帮助程序员解放出部分精力,投入到更有挑战性和复杂性的任务中去,本文将就如何解析单句SQL语句提出自己的解决方案和大家探讨,希望大家不吝批评指正

  首先说明以下单句SQL的范畴,它是指不存在嵌套的SQL语句,包括Select,insert,delete,update四大类型(具体的解析子类还有一种insert select类型),其中以select最为复杂,下面将以它为例另关于嵌套SQL尤其是多重嵌套SQL的分析似乎比较复杂,我一时没想出好的解决方案,如果您知道请不吝赐教。

  1.关于SQL语句的预处理。

  在对sql语句进行分析之前,有必要对它进行一些预处理,这样能减轻不少后面编程的负担。

  预处理的主要工作是消除SQL语句前后的空白,将其中的连续空白字符(包括空格,TAB和回车换行)替换成单个空格;将sql语句全变成小写形式(或大写形式);在SQL语句的尾后加上结束符号,至于为什么加,这里先买个关子。具体的语句如下:

 sql=sql.trim();
 sql=sql.toLowerCase();
 sql=sql.replaceAll("s+", " ");
 sql=""+sql+" ENDOFSQL";

  2.将SQL语句分离成片段。

  经过第一步的工作,一个多行的,存在大小写混杂的SQL语句已经变成了单行的小写SQL语句,接下来我们需要把整句分离成更小的片段。以Select语句为例,其中可能存在有select子句部分,from子句部分,where子句部分,group by子句和order by子句等,如果能成功的把整句分离成这些子句,我们的分析工作又前进了一步。先让我们看看下面的SQL示例:

  select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2

  通过观察我们可以发现,select子句是select c1,c2,c3 from,它的起始标志是select,结束标志是from;from子句是from t1,t2 where,它的起始标志是from,结束标志是where;where子句是where condi3=3 or condi4=5,它的起始标志是where,结束标志是order by;order by子句是order by o1,o2其起始标志是order by,刚才我们在整句SQL尾后加上了" ENDOFSQL"字样,因此,order by子句的结束标志是" ENDOFSQL"。

  这个分析给我们解析SQL语句提供了一个思路,如果我们能找到各个子句的前后标志,在正则表达式的帮助下我们就可以轻松的获得每一种子句,下面给出一个找到from子句的完整正则表达式:

  "(from)(.+)( where | on | having | groups+by | orders+by | ENDOFSQL)"

  这句正则表示式让程序到整句SQL中查找符合这样条件的文本单元:它以from开头,结束标志是where,on,having,group by,order by或语句结束中间的一个,开始标志和结束标志之间可以是任何字符。这样,from子句的各种情况就都囊括进这个正则表达式了,它能找到以下类型的各种form子句:

  from .... where

  from .... on

  from .... having

  from .... group by

  from .... order by

  from .... ENDOFSQL(这个ENDOFSQL是预处理时加上的,如果用$符号会给程序造成麻烦)

  3.找到片段中的各个部分。

  有了表示片段的正则表达式,找到片段后从中分离出片段起始标志start,片段主体body和片段结束标志end就很容易了,请见代码:

Pattern pattern=Pattern.compile(segmentRegExp,Pattern.CASE_INSENSITIVE);
 for(int i=0;i<=sql.length();i++){
  String shortSql=sql.substring(0, i);
  //System.out.println(shortSql);
   Matcher matcher=pattern.matcher(shortSql);
   while(matcher.find()){
    start=matcher.group(1);// 片段起始标志start
  body=matcher.group(2);// 片段主体body
  end=matcher.group(3);// 片段结束标志end
  parseBody();
  return;
   }
 }

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-9785-1.html
网站维护教程更新时间:2012-03-21 02:25:31  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer