SQL数据库编程学习应用语句

2024-07-18

SQL数据库编程学习应用语句(共6篇)

SQL数据库编程学习应用语句 篇1

1.Select * from student查询所有原始记录

2.Select StudentID, StudentName from student 只查询学号和姓名

3.Select StudentID as 学号, StudentName as 姓名, Sex as 性别,Class as 班级,NormalScore as平时成绩,ExperimentScore as 实验成绩, ExaminationScore as 考试成绩 from student

4.Select * from student where sex=’男’只需要查看男生的成绩

5.Select * from student where NormalScore>80只需要查看平时成绩大于80分的记录

6.Select * from student where studentname like ‘陈%’查询姓陈的同学的记录

7.Select * from student order by examinationScore根据考试成绩排序

8.Select * from student order by examinationScore排序---降序

9.Select Sum(examinationScore)as 总成绩 from student求总成绩

10.Select Avg(examinationScore)as平均成绩 from student求平均成绩

11.Select count(*)as 总记录数 from student求总记录数

12.Select Max(ExaminationScore)as 最高分 from student求最高分

13.Select Min(ExaminationScore)as 最高低分 from student求最低分

14.Select Class as 班级, Avg(ExaminationScore)as平均成绩 from student group by class各班级成绩的分类汇总

Public Class frmMain

Private ObjCnn As New OleDbConnection

Private ObjCmd As OleDbCommand

Private StrDir As String = “D:MIS1025StudentMgr.accdb”

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs)Handles MyBase.Load

ObjCnn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & StrDir

ObjCnn.Open()

ObjCmd = New OleDbCommand

ObjCmd.Connection = ObjCnn

End Sub

Private Sub FindRecord(ByVal StrSQL As String)

ObjCmd.CommandText = StrSQL

Dim rd As OleDbDataReader = ObjCmd.ExecuteReader

Dim tbl As New DataTable

tbl.Load(rd)

DataGridView1.DataSource = tbl

End Sub

Private Sub CmdFind_Click(ByVal sender As System.Object,System.EventArgs)Handles CmdFind.Click

FindRecord(txtSQL.Text)

End Sub ByVal e As

SQL数据库编程学习应用语句 篇2

随着计算机技术的发展,各行各业对信息化的需求越来越强烈,信息化水平也越来越高。作为国家防洪抗旱减灾体系的重要组成部分和国民经济的重要基础设施,水库也在逐步开展信息化工作。在水库信息化过程中,经常需要在局域网范围内进行数据共享、数据集成或汇聚,这不可避免地涉及到数据交换。但由于水库的监控系统和信息系统由不同时期的不同承建商建设,导致同一水库的不同系统或不同水库的同一类型系统在数据存储上存在诸多差异,若数据交换系统仅针对特定水库,则每个水库的数据交换系统都要根据水库具体情况修改其程序代码,不仅修改工作量大,系统稳定性也得不到保证。因此,本文对数据库差异和数 据交换过 程进行研 究,提出通过 读入XML文件中SQL语句[1]实现数据交换的通用数据交换方法,并在实践中得到应用。

1数据存储差异性与交换过程

1.1数据存储差异性

现在的信息系统一般采用数据库存储数据,很少采用文件形式存储数据,故本文仅讨论采用数据库的数据存储形式。

在数据交换中,源数据库和目的数据库的数据存储差异性主要体现在以下几个方面:

(1)数据库管理系统不同。常用的数据库管理系统有SQL Server、Oracle、MySQL、Sybase、DB2等[2],早期系统有的还采用Access。

(2)实体-联系模型不同。相同一组信息,源数据库存储在两个表中,目的数据库存储在一个表中,或源数据库存储在一个表中,目的数据库存储在两个表中。

(3)字段类型不同。相同信息,源数据库以数值型存储,目的数据库以字符型存储,或源数据库以字符型存储, 目的数据库以日期型存储。

(4)字段长度不同。相同信息在源数据库和目的数据库里字符串长度、数值长度或小数位数不一样。

(5)标示符命名规则不同。表名和字段名差异较大。

(6)同一对象,如测点,其名称或编码在源数据库和目的数据库里不同。

(7)同一组信息,源数据库里存储的属性比目的数据库里少。

这些差异性要求数据交换时需进行必要的转换。

1.2数据交换过程

数据交换一般包括3个步骤:数据提取、数据转换、数据写入。数据提取先连接源数据库,然后从相关表中提取所需数据,数据提取需要知道源数据库的数据库管理系统以及源数据库表结构;数据转换是将来自源数据库的数据转换为符合目的数据库要求的数据,包括数据拆分、数据重组、数据类型及长度变换等,数据转换需要知道源数据库与目的数据库的表结构以及它们之间的对应关系;数据写入先连接目的数 据库,然后将转 换后的数 据写入相 关表,数据写入需要知道目的数据库的数据库管理系统以及目的数据库表结构。

数据写入时需考虑目的数据库中已有数据的更新问题。由于数据交换一般针对时间序列数据,即数据元组中含有时间戳,因此可以根据时间段来处理数据更新问题。 数据更新有两种方式:1先检测目的数据库是否已有该时间段数据,如果有,用更新语句更新数据,否则用插入语句插入数据;2先直接删除目的数据库中可能有的该时间段数据,然后用插入语句插入数据。后一方式操作相对简单。

2通用数据交换方法

通用数据交换方法将一次完整的数据交换分为若干个数据交换过程,每个交换过程可以针对数据库里的一个表,也可以针对数据库一个表中的特定数据。数据交换过程由保存在XML文件中的SQL语句控制,SQL语句根据源数据库和目的数据库及其对应关系编写。

控制数据交换过程的SQL语句存储格式如下:

DataExchange元素表示 一个数据 交换过程,它包含一个交换过程所需的SQL语句。

SourceConnection元素和TargetConnection元素为源数据库和目的数据库的连接字符串。连接字符串中必须包含Provider(提供程序)的值,其它值因数据库管理系统和连接方式不 同而不同,如Data Source、User ID、Password等。以OLEDB为例,典型连接字符串如下:

(1)Oracle": Provider=MSDAORA;Data Source=;User ID =myUsername;Password=myPassword"

(2)SQL Server": Provider=SQLOLEDB;Data Source= (local);Initial Catalog= mydb;User ID= myUsername;Password=myPassword"

(3)MySQL": Provider=MySQLProv;Data Source=mydb; User ID=myUsername;Password=myPassword"

(4)Access": Provider= Microsoft.Jet.OLEDB.4.0;Data Source=c:binLocalAccess40.mdb"

SelectSQL元素为从源数 据库提取 数据的Select语句。Select语句可以提取一个表里一个时间段内 全部数据,也可以提取一个表里一个时间段内的特定数据,如某个测点的数据,Select语句还可 以通过多 表连接提 取数据。同时,Select语句中的Select子句还承担数据转换工作,包括数据拆分、数据重组、数据类型及长度变换等,这些转换可能用到数据库管理系统提供的函数。Where子句中开始时间和结束时间采用保留字符串“_STTM”和“_ ENTM”的方式。由于Select语句里可能包含标点符号, 故采用CDATA段[3],即以“<![CDATA[”标记开始,以 “]]”标记结束。

DeleteSQL元素为从 目的数据 库删除数 据的Delete语句,它可以避免插入数据时违反主键约束。Delete语句中Where子句一般跟上述Select语句中Where子句存在一致性。

ColumnNum元素表示Select语句的Select子句中前ColumnNum个列的数据将传递至Insert语句。

InsertSQL元素为将数据写入目的数据库的Insert语句。其Values子句包含“_Column0”、“_Column1”、“_Column2”、“_Column3”等保留字符串,用于传递Select语句中的数据,分别对应于Select子句中第1列、第2列、第3列、第4列等。Values子句也可以承担数据转换工作。

3应用

通用数据交换系统是一个采用基于SQL语句的通用数据交换方法开发,并广泛应用于水库局域网信息共享和数据集成的数据交换系统。其集成开发环境为Microsoft Visual Studio 2010,开发语言为C#,数据库访 问采用微 软应用程序接口OLEDB,支持常用 的数据库 管理系统。 虽然OLEDB的效率比其它专用数据库接口效率低,但数据交换系统的通用性提高。

通用数据交换系统界面如图1所示。通用数据交换系统有两种交换方式:定时交换和即时交换。定时交换每隔一段时间进行一次数据交换,交换的数据时间段为上次交换截止时间至当前时间,两次交换之间的时间间隔可以是几分钟,也可以是几个小时;即时交换可任意指定本次交换的数据时间段,点击交换按钮后,立即进行交换。定时交换用于实时数据自动交换,即时交换用于历史数据交换。

通用数据交换系统的数据提取和插入代码如下:

上述代码中,字符串数 组select和insert分别存放Select语句和Insert语句,oledbConn1和oledbConn2分别连接源数据库和目的数据库,变量_STTM和_ENTM分别存储开始时间和结束时间。数据提取时,均将数据转换为字符串,写入时由Insert语句将其转换成目的数据库里的类型。

通用数据交换系统用于不同水库时,不需要对通用数据交换系统程序进行任何修改,仅需编写XML文件中的SQL语句。典型XML文件内容如下:

上述XML文件中包括两个数据交换过程,它们的源数据库和目的数据库的数据库管理系统均为Oracle,源数据库服务名分别为ORCL1和ORCL2,目的数据库均为本地数据库。由于数据库管理系统为Oracle,所以XML文件中SQL语句均遵循Oracle的SQL语法[4]。第一个交换过程是将源数据库中表MI_SPPR_M中的数据写入目的数据库中的表EGS_SPPR_R,同时将HYCNCD字段内容设置为“BFA89001782F8”,即补充字段内容。第二个交换过程是将源数据库中表MSE_WATER中仪器编号为 “'W0005”的数据写 入目的数 据库中的 表ST_RSVR_R。 除了将HYCNCD字段内容设置为“BFA89001782F8”外, 还要将MPCD字段内容设为“UPWL”,即进行编号转换。

4结语

本文介绍了 一种基于SQL语句的通 用数据交 换方法。它从XML文件中读取SQL语句,包括数据库连接字符串与Select、Delete、Insert语句,根据这些SQL语句执行数据交换过程。采用该方法开发的数据交换系统,不需要修改程序代码,仅需编写XML文件中的SQL语句,即可用于不同环境下不同系统之间的信息共享和信息集成。 基于该方法的通用数据交换系统现已广泛应用于水库局域网内信息共享和数据集成。

摘要:为了避免频繁地修改数据交换系统程序代码,提高数据交换系统的通用性,提出了基于SQL语句的通用数据交换方法。该方法根据源数据库和目的数据库结构编写SQL语句,保存至XML文件。数据交换时,数据交换系统从XML文件读入SQL语句,执行相应操作,完成数据交换。该方法已在实践中得到广泛应用。

两表连接的SQL语句数据库教程 篇3

例如:一个二表连接的SQL,有两种写法:

(1)select A.c1,A.c2,B.c1,B.c2

from table1 A,table2 B

where A.id=B.id

(2)select A.c1,A.c2,B.c1,B.c2

from table1 A join table2 B

on A.id=B.id

哪种写法好呢?现在提倡用哪一种?

你喜欢用哪一种?

我习惯用(1)

---这两个哪个好?

其中11楼的回答最为深入,其实这个问题还是有一定的历史原因的,不管你习惯什么样的写法只要知道来龙去脉就不会再被细枝末节来迷惑了。以下观点为个人认识,如有偏差欢迎指正。

简单的说,前者是ansi sql 86标准后者是ansi sql 92标准(*****) ,这个观点最容易被人接受。

什么是ansi?美国国家标准局,iso的重要成员之一,19就有了。

什么是ansi sql?就是ansi注意到了sql的生产力,于是规范化了一下。

什么是sql?他是ibm发明的,oracle发扬广大的一门语言。

为什么是两家公司?。

70年代初因为ibm内部各方利益斗争激烈,导致某大牛的研究成果只能以论文方式发表。

70年代末某小公司把此技术用在商业领域就成了oracle,直到n年后ibm db2才出来。

所以,sql不是ansi 发明的,ansi 标准也不能通吃所有数据库平台。

比如下面这个是什么数据库的语法?反正ansi 标准在他那里是报错的。

select * from(a inner join b on a.id=b.id) inner join c on a.id=c.id

那么在ansi86之前的数据库有哪些?oracle和db2是肯定的了,

另外还有一些当时的小角色:Informix,dbase系列等。

而sybase的数据库和SQLServer是86年之后出来的,而前面那个奇怪的join语法的access是90后的。

古老的sqlserver和oracle我都没有用过,反正在用oracle8i时还不支持ansi 92的inner join,他是生的。一直到本世纪发布的oacle9i 才改了过来。用多了t-sql的人会问 left join咋办,where a.id=b.id(+) 就可以了,人家没那么笨的,t-sql以前还有*=这样的表示。

那么这么看貌似ansi的规范力度不够?其实不是,国际标准化也不可能一刀切,在ansi92 当中定义了4个级别,n多条款。大意就是大家符合入门级就行了,其他高级别仅供参考,甚至iso根本不会验证其他级别..而诸如inner join和left join之类的都是过渡级的,濉

所以我前面打了5个星星的那句话并不是完全正确的,正确的应该是

前者符合ansi 86 标准和ansi 92入门级标准,后者符合ansi92 过渡级标准。

不是oracle8i不符合ansi92,而是没有符合ansi92的高级别规范,而完全实现高级别标准的数据库系统是没有的。

早在oracle7就已经完全符合ansi92了,当然是指入门级,而且他就是ansi92 的模版范例。

--回到上面的话题,这两个哪个好?

性能当然完全一样,区别只是习惯和喜好,但也因为标准级别不同而具有不同的风险。

如果想要优雅而易于维护且不容易写错的代码,当然用高标准的第二种方法。

如果必要考虑风险这个因素,比如涉及到多种平台的迁移或者整合,你应该用第一种,起码在两个表的情况下他还是比较安全的。

----

SQL数据库编程学习应用语句 篇4

从sql导出到mysql的方法很多,现介绍一种无需编程,直接利用sql和mysql里的图形界面进行导入导出的简单方法,

前提是已经安装了sqlserver客户端和mysql的图形界面管理工具phpmyadmin。

在控制台根目录下打开sqlserver企业管理器,新建sqlserver组,根据自己的情况进行选择;然后新建sqlserver 注册,进行对sqlserver的连接。准备妥当后,下面就开始了:

首先打开数据转换服务,新建包,打开DTS界面,在连接中选择数据源进行配置。再选择将要转换到的目的文件,这里我选的 Textfile(destination),选择好文件的存放位置之后,我们来新建一个任务,

这里我们只选择转换数据任务,将带有“选择源连接”“选择目的连接”的鼠标分别选中数据源和目的之后,我们对新生成的连接进行定义,在其属性中将源,目的,转换依次定义。

执行任务,提示成功。保存任务。然后在新建的任务上导出数据,有向导提示,其中一项选择“从源数据库复制表和视图”。

这一步已经把数据导出到目的文件中。

下一步在mysql中新建表,与将要导入的结构保持一致时,直接选取“从文本文件中提取数据,插入到数据表:”,将选项添好后,“发送”就可以了,浏览一下,数据已导入了。若要导入的表已经存在,且属性名也不同,这时就先建一个与要导入的数据相同结构的表并导入数据(按刚才的进行就可以了),然后在mysql中导出“数据和结构”,得到sql语句,将其在文本文件中编辑,利用文本编辑器的替换功能,将表名修改,列名加入,最后将其粘贴在要导入表的执行sql语句的地方,执行一下,数据便导入了。

SQL数据库编程学习应用语句 篇5

0961140107

SQL是市场占有率最大的数据库之一,是信息化社会的产物,是整理、查询、分析数据的强有力工具。我对于SQL数据库的学习是在实验与探索之中度过的。

下面将我本学期所学的主要知识简单总结如下:

共分四大块:

一、数据库基本原理;

二、SQL标准语言;

三、数据库设计;

四、数据库安全。

一、数据库基本原理

数据库技术是计算机领域中发展最快的技术之一。数据模型是数据库系统的核心和基础。常用的数据模型有层次模型、网状模型、关系模型、面向对象模型、对象关系模型。其中关系模型是目前最重要的一种数据模型。关系数据库是我们需要掌握的重点。

关系模型中常用的关系操作包括:查询操作和插入、删除、修改操作两大部分。关系的查询表达能力很强,是关系操作中最主要的部分。

二、SQL标准语言

SQL(Structured Query Language),即结构化查询语言,是关系数据库的标准语言。SQL标准语言从1986年公布以来随着数据库技术的发展不断发展,不断丰富。

SQL 功能动词

数 据 定 义 CREATE,DROP,ALTER

数 据 查 询 SELECT

数 据 操 纵 INSERT,UPDATE,DELETE

数 据 控 制 GRANT,REVOKE

SQL之所以能够为用户和业界所接受,并成为国际标准,是因为它是一个综合的、功能极强同时又简洁易学的语言。SQL集数据查询、数据操纵、数据定义林巧

和数据控制功能于一体。有如下特点:1)综合统一;2)高度过程化;3)面向集合的操作方式;4)以同一种语法结构提供多种使用方式;5)语言简洁,易学易用。

SQL的数据定义语句:

创建删除修改

表CREATE TABLEDROP TABLEALTER TABLE

视图 CREATE VIEWDROP VIEW

索引 CREATE INDEXDROP INDEX

数据库查询是数据库的核心操作。也是数据库学习的重点和难点。SQL提供了SELECT语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:

SELECT [ALL|DISTINCT] <目标列表达式>

FROM <表名或视图名>[,<表名或视图名> ] …

[ WHERE <条件表达式> ]

[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]

[ ORDER BY <列名2> [ ASC|DESC ] ];

SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。

(一)、单表查询

1、选择表中的若干列:

2、选择表中的若干元组;

2)查询满足条件的元组。WHERE子句常用的查询条件有

3、ORDER BY子句。

4、聚集函数。

5、ORDER BY子句

(二)、连接查询

1、等值与非等值连接查询;

2、自然连接;

3、外连接;

4、复合条件连接。

(三)、嵌套查询

1、带有IN谓语的子查询;

2、带有比较运算符的子查询;

3、带有ANY(SOME)或ALL谓语的子查询;

4、带有EXISTS谓词的子查询。

(四)、集合查询。

数据的更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。

三、数据库设计

数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求

数据库设计的基本步骤:

1、数据库设计的准备工作;

2、数据库设计的过程(六个阶段): 1)需求分析阶段;2)概念结构设计阶段;3)逻辑结构设计阶段;4)数据库物理设计阶段;5)数据库实施阶段;6)数据库运行和维护阶段.

四、数据库安全

数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏。课本中讲述了三类计算机系统安全性问题:技术安全类、管理安全类和政策法律类。

如何控制数据库的安全性? 其常用的方法有:1)用户标识和鉴定2)存取控制;3)视图;4)审计;5)密码存储.

数据库的完整性:即数据的正确性和相容性防止不合语义的数据进入数据库。例如:学生的年龄必须是整数,取值范围为14--29;学生的性别只能是男或女;学生的学号一定是唯一的; 学生所在的系必须是学校开设的系;

SQL数据库编程学习应用语句 篇6

近几年,信息泄漏事件频繁发生,用户对数据库的安全性越来越关注。由于数据库本身的复杂性,数据库的管理运行、日常维护和数据安全保护只能由专业的数据库管理员进行。但是,很多使用数据库的人并不熟悉数据库,甚至完全不了解数据库。SQL分析技术能够帮助用户快速抽取SQL语句中的字段、表、视图及对它们的操作,快速识别SQL语句的风险。同时基于SQL分析技术能够将SQL语句翻译成自然语言,使之更容易被理解,有助于实现安全控制。

早期的SQL解析使用Lex,Yacc的比较多。虽然Oracle已经将ANTLR应用在SQL Developer的IDE中,但是SQL Developer并非开源使用。因此使用ANTLR进行SQL解析的研究目前还很少,进行SQL翻译的工作还未见报道。在使用ANTLR解析SQL并且将结果进行进一步分析是一个新的尝试。本文针对数据库安全,基于LL文法,采用ANTLR工具,实现了SQL的词法和语法解析器,并进一步实现了SQL语句到自然语言的翻译。最后,将SQL解析和翻译功能应用在数据库防火墙和安全审计系统中,对于提高数据库的安全防护能力具有很大的实际意义。

1 SQL解析器

1.1 SQL词法解析器实现

SQL语言的词法主要分为标识符、数字、注释与提示、字符串、时间、区间和变量。基于ANTLR实现SQL词法解析首先要定义词法的fragment。所谓的fragment是词的一部分,而不会出现在词法解析的结果中。以数字和时间为例分析。

(1)数字Number。在SQL语言中表示数值类型。数值类型包含整数部分、小数部分、符号部分、指数部分和类型部分,其中指数部分是一个大写字母“E”或者一个小写字母“e”加一个带有符号的整数,如果不带符号默认为“+”。数值类型中,整数部分和小数部分必须包含其中之一,其他部分都是可选的,只包含小数部分时允许“.”出现在数值的最前面,例如“.5”表示“0.5”。数字的DFA表示如图1所示。

(2)时间Datetime。时间格式比较固定,必须由关键字DATE开头,后面是一个表示时间的字符串,如果不是表示时间的字符串,SQL语句认为是错误的语句。另外,时间戳也被认为是一种时间格式,必须是由关键字TIMESTAMP开头,时间戳格式包含AT TIME ZONE可选结构,表示时区。时间的DFA表示如图2所示。

根据这七种类型的自动机表示将其转换成对应的EBNF表示。使用“*”、“+”替换DFA中的循环结构,“*”表示可以跳过的循环结构,“+”表示不可跳过的循环结构。使用“|”表示DFA中的选择结构,在每个分支之间使用“|”表示选择。使用“?”表示DFA中可跳过的结构,将“?”放在可选结构的后面。在每个单元上使用“()”将不可拆分的部分包含在内,就可以使用简单的EBNF语句描述复杂的DFA。另外,对于SQL的保留字要做单独的识别。例如:select要定义成SELECT:S E L E C T;这样select无论是“Select”还是“se LECT”都能识别出来。针对不同的SQL语句它的保留字也是不一样的,需要单独定义语法文件。SQL语言中是不区分大写字母和小写字母的,在ANTLR中单独的字母应该被当作碎片来定义,不能出现在最终的解析结果中,使用“fragment”修饰。字母包含键盘上所有能够输入的符号以及键盘上不能直接输入的UNICODE字符。SQL语言中使用的数字是阿拉伯数字0~9,单独的数字也要使用“fragment”修饰。

1.2 SQL语法解析器实现

语法解析器实现过程中需要将所有的语言模式转化为EBNF描述的规则语句。SQL语言的范式使用的是EBNF描述,要将其转换成EBNF描述的规则。EBNF范式的好坏虽然不会影响到解析的效率,解析效率只与被解析的字符串的长度有关系,但是会影响到解析器生成的效率。坏的EBNF规则会导致生成的过程中出现大量的递归调用和栈操作,生成的时间和内存会成指数级增长。所以EBNF的规则还是有很多细节需要注意。规则的深度不能太深,并且需要或关系的规则尽量将K值控制到最低,因为规则生成的复杂度是(K*N)M。其中,K是向后查看的token数;N是或关系连接的多个规则;M是规则嵌套的层数。由于一个子规则经常被多个规则引用,所以子规则会影响所有引用它的规则的生成效率。降低子规则的层数和减小K值是有效的提高生成效率的方法。N值一般难以降低,除非规则本身就有冗余,但是这种情况比较少见。

使用ANTLR将语法文件编译成解析器,实现过程类似于词法分析。输入由String变成tokens,ANTLR自身的语法不变。使用全部的语法生成语法解析器,在生成过程中系统采用LL(K)分析方法。ANTLR支持预测功能,可以在特定的地方使用预测。设置回溯位置,对输入的tokens进行预测,降低解析时间和消耗的资源。解析的结果可以得到每一个token的属性、内容和值。再对生成的一维AST树做递归下降,将AST树的二维层次结构补全,得到具有层次和附属关系的二维语法树。AST树上的节点对于解析来说并不都是必须的,在生成过程中将不需要的节点删除,留下必须的结果,精简AST树对于快速提取重要信息有很大的帮助。在AST树生成的过程中直接嵌入SQL语句检查代码,同时可以在解析过程中直接根据token的类型判断输入词的意义,从而将SQL中最重要的表、视图、字段直接提取出来,同时判断出SQL的类型和操作对象的类型。更进一步,将SQL中存在的安全隐患的类似缓冲区溢出和SQL注入攻击的风险直接检测出来。

2 SQL翻译

2.1 SQL语句AST的构建

ANTLR语法解析的输出结果就是抽象语法树。将语法解析的结果设置为AST,ANTLR每一个规则解析之后就能生成AST结构。默认情况下生成一维语法树,所有的结果在同一个层次上。如果需要自定义抽象语法树的返回结果,需要在语法解析过程中加入AST构建规则。ANTLR的抽象语法树构建语法非常简单,标准语法只有三种:

(1)“^”,前面的符号作为父节点;

(2)“!”,前面的节点不出现在语法树上;

(3)“⁃>^(……)”,“⁃>”左侧是语法解析语句,右侧是抽象语法树生成语句,括号内是一棵子树,第一个符号是树的根,其他元素是第一个元素的子节点。例如:(A+B)⁃>^(+A B)。

由于SQL语言是结构化的查询语句,在构建抽象语法树上有先天的优势。构建语法树时只需要考虑SQL中查询的主体,忽略不需要的部分,其中最重要的就是表、字段、视图和在表、字段、视图上的操作。查询语句是SQL语句中最复杂的语句,可以使用嵌套和递归的方式,语法结构十分灵活。由于其他语言相比于查询语言简单很多。本节用查询语句举例说明SQL语句抽象语法树生成过程。

查询语句可以包含for update语句,但不是必须包含,for update和查询是平行关系,一个查询只能在最后包含一个for update语句,这里只需要将最后的“;”裁剪掉:

select Statment:subquery(for_update_clause)?(′;′!)?;

子查询可以有嵌套,也可以和其他子查询做交、并、异或操作,最终结果做一次排序:

查询块是最终的查询,包含查询的各个功能模块,模块在结构上是平行的:

2.2 AST转换成自然语言

SQL语句的语言结构更接近英文的语言结构,与中文的语言结构差别较大,简单的对关键字替换不考虑语义是不能达到翻译效果的,只会让结果更加匪夷所思,举例说明:

直接替换翻译结果为:

使用树解析器将抽象语法树转换成自然语言。由于抽象语法树采用递归的方式表示语法结构,在解析的过程中也使用递归的方式,并将语法习惯调整为汉语语言的语法习惯。在转换的过程中补充虚词和连接词,增加语言的连贯性。最后对翻译结果进行格式化,增加缩进便于阅读。考虑汉语的阅读习惯,可以将较长的句子翻译成子句的形式,最后,根据数据库建模表和数据库方法表,可以将翻译结果中的方法名、字段名、表名等翻译成中文,翻译时只要判断出被翻译内容的类型,然后查找相应的数据表,就能将剩下的英文部分翻译成中文,生成最终结果为:

模块1:

查询获取用户方法(user)的执行结果的返回数据

模块2:

从用户表(user)中查询姓名字段(name)的返回数据

条件1:

标识字段(id)等于条件判断方法(if)[转换成ascii编码方法(ascii)[子串方法(substr)[{模块1},1,1]的返回结果]]的返回结果等于1,1,0]的返回结果

条件2:

字串‘admin’在[{模块2}]里

模块3:

从日志表(logs)中查询满足{条件1}条件的日期字段(date)和用户字段(user)和动作字段(action)和姓名字段(name)的返回数据

模块4:

逻辑表[{模块3}]

模块5:

查询方法用户方法(user)执行结果的返回数据

模块6:

连接字符串方法(concat)[{模块5},′⁃⁃′,方法数据(data⁃base)的执行结果]的执行结果

主查询:

从{模块4}中查询满足{条件2}条件的{模块6}和姓名字段(name)的返回数据。

翻译过程中需要调整语序,语序的调整主要使用栈实现,将需要调整语序的句子放入栈中,返回时再从栈中取出。树解析器翻译的过程如下:

(1)当前指针在根节点,获取节点,判断节点类型,类型不一样,Tree Walker进入不同的解析模块,这里以SELECT语句为例;

(2)获取一个子节点,判断节点的类型;

(3)如果是SELECT语句,那么就调用se⁃lect_tree_walker,然后调整语序,执行stack.push操作,将结果先缓存。如果是FROM语句,调用from_tree_walker的结果放入output流中。如果是WHERE语句,调用where_tree_walker,调用stack.pop将SELECT语句出栈,和WHERE语句合并格式,结果放入到output流中;

(4)tree_waker是一个递归的过程,在解析过程中,将查询的条件和子模块生成独立的翻译模块;

(5)tree_waker在执行的过程中遇到需要查询建模表和函数表的情况,将查询的结果输出;

(6)重复步骤(2)~步骤(5)过程,直到input流为空。

Tree Walker对部分叶节点的翻译规则如表1所示。

3 系统实现与效果分析

本系统目前已在数据库审计和防火墙产品有所应用,数据库审计与防火墙引擎设置界面如图3所示。要对数据库进行审计或者建立防火墙,先要添加数据库引擎。审计数据获取方式有很多种,在设置界面进行设置。

规则设置界面部分截图如图4所示。规则可以设置表、字段、SQL类型等,SQL解析中能够获取的所有信息都可以在规则界面上设置。通过对SQL语句进行解析获取语句的类型,然后对不同类型的SQL语句设置不同的规则。

告警设置界面如图5所示。规则匹配上之后设置相应的告警级别,就会产生相应的告警信息。

检索界面如图6所示。可以对审计日志进行检索,获取数据库用户的操作行为。

告警界面如图7所示。SQL语句触发告警规则就会产生告警,在告警界面上可以查看告警细节。

图7中select 1 from db_queue_tables where 1=2,其中条件1=2是常量比较,判定SQL语句可能是SQL注入语句,产生高风险告警。然后通过SQL翻译将SQL语句翻译成对应的中文,select 1 from db_queue_tables where 1=2的翻译结果为“从表dba_queue_tabkes中查询满足条件1=2的值1的返回结果”。

最新流量界面如图8所示。在最新流量界面可以实时显示最新的SQL操作,随时监控SQL操作动态。基于SQL解析和翻译的数据库审计和防火墙产品可以在审计模式对操作进行溯源,起到对不法分子进行震慑的作用。防火墙模式可以通过阻断方式对风险进行控制,从而提升数据库系统的安全性。

4 结论

本文通过分析标准SQL语言的词法规则和语法规则,并基于ANTLR设计并实现了SQL词法解析器和语法解析器;使用SQL词法解析器和语法解析器实现了SQL语句辅助分析功能,实现了SQL语句的词法分析和语法树生成;通过解析语法树提取SQL信息并将SQL语句翻译成自然语言;并将SQL解析和翻译的功能应用在数据库综合审计系统中。SQL解析和翻译模块已经被应用在商业数据库防火墙和安全审计系统中,并且被部署到多个数据中心。系统可以监控数据库的所有活动,阻断危险操作和攻击,从而达到增强数据库安全的目的,为保障数据库及信息系统的安全逐步发挥作用。

本文设计了一种基于反激式直流变换器的动力电池均衡电路,给出了系统建模方法,并在PSIM环境下完了系统仿真电路,针对8种典型非均衡状态进行了全面的仿真实验,最后通过实验证明了系统建模的有效性。由于建模过程忽略了变换器磁阻、磁滞、磁饱和现象,同时简化了电路寄生参数,需要进一步完善。

摘要:信息泄漏事件不断发生使得数据库安全的重要性不断提高。基于SQL解析能够实现SQL到自然语言的翻译,帮助非专业人员分析数据库的访问活动和识别风险。通过SQL词法和语法的EBNF描述构造了可以用于LL的规则输入,使用ANTLR工具生成了SQL词法和语法解析器。进一步,SQL词法和语法解析器实现了SQL语句到抽象语法树的转换。并通过解析抽象语法树,将SQL语句翻译成自然语言。最后,将SQL解析和翻译功能应用在数据库防火墙和安全审计系统中。

关键词:SQL解析,LL解析器,ANTLR,抽象语法树,SQL翻译,数据库安全

参考文献

[1]张博,类艳春,廉小伟.数据库安全漏洞浅析[J].保密科学技术,2012(3):23-25.

[2]刘三献.基于ANTLR的Gaussian词法分析器和语法分析器的分析与设计[D].兰州:兰州大学,2009.

[3]闫红岩.SQL语句分析及数据库安全研究[J].贵阳:贵州大学,2006.

[4]侯智斌,孙彦飞,吕曹芳.基于入侵容忍技术的数据库安全策略研究[J].现代电子技术,2011,34(7):78-80.

[5]PARR T,FISHER K.LL(*):the foundation of the ANTLR parser generator[C]//Proceedings of 32nd ACM SIGPLAN Conference on Programming Language Design and Implementation.[S.l.]:ACM,2011:425-436.

[6]SALOMAA K,YU S.NFA to DFA transformation for finite languages over arbitrary alphabets[C]//Proceedings of 1996 First International Workshop on Implementing Automata.London:Springer,1996:149-158.

[7]LOUDEN K C.Compiler construction:principles and practice[M].New York:Cengage Learning,2000:21-148.

上一篇:国税局实践证明下一篇:张瑞老师在潍坊市道德公益论坛精彩语录