数据库⾯试题---原理
1、触发器的作⽤?
触发器是⼀中特殊的存储过程,主要是通过事件来触发⽽被执⾏的。它可以强化约束,来维护数据的完整性和⼀致性,可以跟踪数据库内的操作从⽽不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另⼀个表的数据操作,⽽该操作⼜会导致该表触发器被触发。
2、什么是存储过程?⽤什么来调⽤?
存储过程是⼀个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建⼀次,以后在该程序中就可以调⽤多次。如果某次操作需要执⾏多次SQL,使⽤存储过程⽐单纯SQL语句执⾏要快。可以⽤⼀个命令对象来调⽤存储过程。
3、索引的作⽤?和它的优点缺点是什么?
索引就⼀种特殊的查询表,数据库的搜索引擎可以利⽤它加速对数据的检索。它很类似与现实⽣活中书的⽬录,不需要查询整本书内容就可以到想要的数据。索引可以是唯⼀的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录⼊的速度,同时也增加了数据库的尺⼨⼤⼩。
4、什么是内存泄漏?
⼀般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,⼤⼩任意的,使⽤完后要显⽰释放内存。当应⽤程序⽤关键字new等创建对象时,就从堆中为它分配⼀块内存,使⽤完后程序调⽤free或者delete释放该内存,否则就说该内存就不能被使⽤,我们就说该内存被泄漏了。
5、维护数据库的完整性和⼀致性,你喜欢⽤触发器还是⾃写业务逻辑?为什么?
我是这样做的,尽可能使⽤约束,如check,主键,外键,⾮空字段等来约束,这样做效率最⾼,也最⽅便。其次是使⽤触发器,这种⽅法可以保证,⽆论什么业务系统访问数据库都可以保证数据的完整新和⼀致性。最后考虑的是⾃写业务逻辑,但这样做⿇烦,编程复杂,效率低下。
6、什么是事务?什么是锁?
事务就是被绑定在⼀起作为⼀个逻辑⼯作单元的SQL语句分组,如果任何⼀个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执⾏,要么不执⾏,就可以使⽤事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原⼦性,⼀致性,隔离性和持久性。
锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实⽣活中锁⼀样,它可以使某些数据的拥有者,在某段时间内不能使⽤某些数据或数据结构。当然锁还分级别的。
7、什么叫视图?游标是什么?
答:视图是⼀种虚拟的表,具有和物理表相同的功能。可以对视图进⾏增,改,查,操作,试图通常是有⼀个表或者多个表的⾏或列的⼦集。对视图的修改不影响基本表。它使得我们获取数据更容易,相⽐多表查询。
游标:是对查询出来的结果集作为⼀个单元来有效的处理。游标可以定在该单元中的特定⾏,从结果集的当前⾏检索⼀⾏或多⾏。可以对结果集当前⾏做修改。⼀般不使⽤游标,但是需要逐条处理数据的时候,游标显得⼗分重要。
8、你能向我简要叙述⼀下SQL Server 中使⽤的⼀些数据库对象吗?
表、索引、视图、存储过程、触发器、⽤户定义函数、数据库关系图、全⽂索引。
9、NULL是什么意思?
NULL(空)这个值表⽰UNKNOWN(未知):它不表⽰“”(空字符串)。假设您的SQL Server数据库⾥有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何⽐较都会⽣产⼀个NULL值。您不能把任何值与⼀个 UNKNOWN值进⾏⽐较,并在逻辑上希望获得⼀个答案。您必须使⽤IS NULL操作符。
10、什么是索引?SQL Server ⾥有什么类型的索引?
简单地说,索引是⼀个数据结构,⽤来快速访问数据库表格或者视图⾥的数据。在SQL Server⾥,它们有两种形式:聚集索引和⾮聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引⾥有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格。由于存在这种排序,所以每个表格只会有⼀个聚集索引。⾮聚集索引在索引的叶级有⼀个⾏标识符。这个⾏标识符是⼀个指向磁盘上数据的指针。它允许每个表格有多个⾮聚集索引。
11、什么是主键?什么是外键?
主键是表格⾥的(⼀个或多个)字段,只⽤来定义表格⾥的⾏;主键⾥的值总是唯⼀的。外键是⼀个⽤来建⽴两个表格之间关系的约束。这种关系⼀般都涉及⼀个表格⾥的主键字段与另外⼀个表格(尽管可能是同⼀个表格)⾥的⼀系列相连的字段。那么这些相连的字段就是外键。
12、什么是触发器?SQL Server 有什么不同类型的触发器?
触发器是⼀种专⽤类型的存储过程,它被捆绑到SQL Server 的表格或者视图上。在SQL Server 2000⾥,有INSTEAD-OF和AFTER两种触发器。INSTEAD-OF触发器是替代数据操控语⾔(Data Manipulation Language,DML)语句对表格执⾏语句的存储过程。例如,如果我有⼀个⽤于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执⾏⼀个更新语句,那么INSTEAD-OF-UPDATE触发器⾥的代码会执⾏,⽽不是我执⾏的更新语句则不会执⾏操作。AFTER触发器要在DML语句在数据
库⾥使⽤之后才执⾏。这些类型的触发器对于监视发⽣在数据库表格⾥的数据变化⼗分好⽤。
13、您如何确保⼀个带有名为Fld1字段的TableB表格⾥只具有Fld1字段⾥的那些值,⽽这些值同时在名为TableA 的表格的Fld1字段⾥?
这个与关系相关的问题有两个可能的答案。
第⼀个答案是使⽤外键限制。外键限制⽤来维护引⽤的完整性。它被⽤来确保表格⾥的字段只保存有已经在不同的(或者相同的)表格⾥的另⼀个字段⾥定义了的值。这个字段就是候选键(通常是另外⼀个表格的主键)。
另外⼀种答案是触发器。触发器可以被⽤来保证以另外⼀种⽅式实现与限制相同的作⽤,但是它⾮常难设置与维护,⽽且性能⼀般都很糟糕。由于这个原因,微软建议开发⼈员使⽤外键限制⽽不是触发器来维护引⽤的完整性。
14、对⼀个投⼊使⽤的在线事务处理表格有过多索引需要有什么样的性能考虑?
对⼀个表格的索引越多,数据库引擎⽤来更新、插⼊或者删除数据所需要的时间就越多,因为在数据操控发⽣的时候索引也必须要维护。
15、你可以⽤什么来确保表格⾥的字段只接受特定范围⾥的值?
这个问题可以⽤多种⽅式来回答,但是只有⼀个答案是“好”答案是Check限制,它在数据库表格⾥被定义,⽤来限制输⼊该列的值。
触发器也可以被⽤来限制数据库表格⾥的字段能够接受的值,但是这种办法要求触发器在表格⾥被定义,这可能会在某些情况下影响到性能。因此,微软建议使⽤Check限制⽽不是其他的⽅式来限制域的完整性。
16、使⽤存储过程的经验。
返回参数总是由存储过程返回,它⽤来表⽰存储过程是成功还是失败。返回参数总是INT数据类型。
OUTPUT参数明确要求由开发⼈员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以⽤作输出参数的数据类型是有⼀些限制的。)您可以在⼀个存储过程⾥使⽤多个OUTPUT参数,⽽您只能够使⽤⼀个返回参数。
17、什么是相关⼦查询?如何使⽤这些查询?
相关⼦查询是⼀种包含⼦查询的特殊类型的查询。查询⾥包含的⼦查询会真正请求外部查询的值,从⽽形成⼀个类似于循环的状况。
18、什么是SQL注⼊式攻击?
所谓SQL注⼊式攻击,就是攻击者把SQL命令插⼊到Web表单的输⼊域或页⾯请求的查询字符串,欺骗服务器执⾏恶意的SQL命令。在某些表单中,⽤户输⼊的内容直接⽤来构造(或者影响)动态SQL命令,或作为存储过程的输⼊参数,这类表单特别容易受到SQL注⼊式攻击。常见的SQL注⼊式攻击过程类如:
⑴ 某个ASP.NET Web应⽤有⼀个登录页⾯,这个登录页⾯控制着⽤户是否有权访问应⽤,它要求⽤户输⼊⼀个名称和密码。
⑵ 登录页⾯中输⼊的内容将直接⽤来构造动态的SQL命令,或者直接⽤作存储过程的参数。下⾯是ASP.NET应⽤构造查询的⼀个例⼦:
System.Text.StringBuilder query = new System.Text.StringBuilder(
"SELECT * from Users WHERE login = '")
.Append(txtLogin.Text).Append("' AND password='")
.Append(txtPassword.Text).Append("'");
⑶ 攻击者在⽤户名字和密码输⼊框中输⼊"'或'1'='1"之类的内容。
⑷ ⽤户输⼊的内容提交给服务器之后,服务器运⾏上⾯的ASP.NET代码构造出查询⽤户的SQL命令,但由于攻击者输⼊的内容⾮常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。
⑸ 服务器执⾏查询或存储过程,将⽤户输⼊的⾝份信息和服务器中保存的⾝份信息进⾏对⽐。
⑹ 由于SQL命令实际上已被注⼊式攻击修改,已经不能真正验证⽤户⾝份,所以系统会错误地授权给攻击者。
如果攻击者知道应⽤会将表单中输⼊的内容直接⽤于验证⾝份的查询,他就会尝试输⼊某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。
系统环境不同,攻击者可能造成的损害也不同,这主要由应⽤访问数据库的安全权限决定。如果⽤户的帐户具有管理员或其他⽐较⾼级的权限,攻击者就可能对数据库的表执⾏各种他想要做的操作,包括添加、删除或更新数据,甚⾄可能直接删除表。
19、如何防范SQL注⼊式攻击?
好在要防⽌ASP.NET应⽤被SQL注⼊式攻击闯⼊并不是⼀件特别困难的事情,只要在利⽤表单输⼊的内容构造SQL命令之前,把所有输⼊内容过滤⼀番就可以了。过滤输⼊内容可以按多种⽅式进⾏。
⑴ 对于动态构造SQL查询的场合,可以使⽤下⾯的技术:
第⼀:替换单引号,即把所有单独出现的单引号改成两个单引号,防⽌攻击者修改SQL命令的含义。再来看前⾯的例⼦,"SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'"显然会得到与"SELECT * from Users WHERE login = '' or
'1'='1' AND password = '' or '1'='1'"不同的结果。
第⼆:删除⽤户输⼊内容中的所有连字符,防⽌攻击者构造出类如"SELECT * from Users WHERE login = 'mas' -- AND password
=''"之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道⼀个合法的⽤户登录名称,根本不需要知道⽤户的密码就可以顺利获得访问权限。
第三:对于⽤来执⾏查询的数据库帐户,限制其权限。⽤不同的⽤户帐户执⾏查询、插⼊、更新、删除操作。由于隔离了不同帐户可执⾏的操作,因⽽也就防⽌了原本⽤于执⾏SELECT命令的地⽅却被⽤于执⾏INSERT、UPDATE或DELETE命令。
⑵ ⽤存储过程来执⾏所有的查询。SQL参数的传递⽅式将防⽌攻击者利⽤单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执⾏,所有的⽤户输⼊必须遵从被调⽤
的存储过程的安全上下⽂,这样就很难再发⽣注⼊式攻击了。
⑶ 限制表单或查询字符串输⼊的长度。如果⽤户的登录名字最多只有10个字符,那么不要认可表单中输⼊的10个以上的字符,这将⼤⼤增加攻击者在SQL命令中插⼊有害代码的难度。
⑷ 检查⽤户输⼊的合法性,确信输⼊的内容只包含合法的数据。数据检查应当在客户端和服务器端都执⾏——之所以要执⾏服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能获得⽹页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将⾮法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执⾏,唯⼀的办法就是在服务器端也执⾏验证。你可以使⽤许多内建的验证对象,例如RegularExpressionValidator,它们能够⾃动⽣成验证⽤的客户端脚本,当然你也可以插⼊服务器端的⽅法调⽤。如果不到现成的验证对象,你可以通过CustomValidator⾃⼰创建⼀个。
⑸ 将⽤户登录名称、密码等数据加密保存。加密⽤户输⼊的数据,然后再将它与数据库中保存的数据⽐较,这相当于对⽤户输⼊的数据进⾏了"消毒"处理,⽤户输⼊的数据不再对数据库有任何特殊的意义,从⽽也就防⽌了攻击者注⼊SQL命令。
System.Web.Security.FormsAuthentication类有⼀个HashPasswordForStoringInConfigFile,⾮常适合于对输⼊数据进⾏消毒处理。
⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回⼀个记录,但实际返回的记录却超过⼀⾏,那就当作出错处理。
20、如何实现数据库的移动?
1)分离数据库;2)把数据⽂件、⽇志⽂件移动到其他路径上去;3)在另⼀台计算机上进⾏附加。
21、默认的系统数据库有哪些?
1)master数据库(主);2)tempdb数据库(临时);3)model 数据库(模板);4)msdb数据库(计划任务);
22、默认创建⼀个数据库,会⽣成哪些⽂件?
1)主⽂件(.mdf),2)⽇志⽂件(.ldf),⽆次要⽂件(.ndf)。
23、创建数据库时,能不能把数据⽂件和⽇志⽂件分开?
可以分开,起到优化作⽤。把数据⽂件放到⾼速读写区,把⽇志⽂件放到低速读写区。
24、什么是索引覆盖(Index Covering)查询?
索引覆盖(Index Covering)查询是指数据可以只通过索引获取,⽽不⽤接触表。
25、事务是什么?
事务是作为⼀个逻辑单元执⾏的⼀系列操作,⼀个逻辑⼯作单元必须有四个属性,称为 ACID(原⼦性、⼀致性、隔离性和持久性)属性,只有这样才能成为⼀个事务:
1)原⼦性
事务必须是原⼦⼯作单元;对于其数据修改,要么全都执⾏,要么全都不执⾏。
2)⼀致性
事务在完成时,必须使所有的数据都保持⼀致状态。在相关数据库中,所有规则都必须应⽤于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
3)隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,
要么是另⼀并发事务修改它之前的状态,要么是另⼀事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串⾏性,因为它能够重新装载起始数据,并且重播⼀系列事务,以使数据结束时的状态与原始事务执⾏的状态相同。
4)持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将⼀直保持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论