韦德1946娱乐手机版 2

中的一些定义,数据库构成和管理工科具

学习SQL Server 2012编程入门经典(第4版)的笔记

关系数据库管理系统(RDBMS)

一、sql理论题

1.事务日志

  任意数据库的更改起初不进入数据库本身,而是不断地被写入到事务日志。

  日志是数据进入磁盘上的最先位置。

韦德1946娱乐手机版,系统数据库

1.master数据库

保存一种特殊的表(系统表)用于系统的总体控制。所有扩展的存储过程和系统存储过程都存储在master
数据库中。

2.model 数据库

可以基于该模型得到一个副本。也就是说,如要想要改变
新建标准数据库的样式,可以根据需要去更改model数据库。但是强烈建议不要修改。

3.msdb 数据库

是 SQL Agent (sql server 代理)进程存储任意系统任务的地方。

4.tempdb数据库

是服务器主要工作区域之一。在执行一个复杂或者大型的查询操作时,sql
server可能会需要创造一些中间表来完成,而这就是在 tempdb中进行的

只要需要临时存储数据,就很可能是把数据存储在tempdb 数据库中。

1.触发器的作用?

答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

 

2.表

  数据库中实际的数据都存在表中。表有行有列。

事务日志

数据从数据库文件中读取,但实际上,任意数据库的更改起初
不进入数据库的更改,而是被不断的写入到事务日志中的。日志是数据进入磁盘的最先位置,然后被传入实际数据库

数据库文件和事务日志一起完成数据库功能。

 

2.什么是存储过程?用什么来调用?

答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

 

 2.1索引

  
索引是在特定表或视图框架内存在的对象。索引的功能类似于目录,可以加速信息的查找。

  索引分两类:

    群集索引—每个表只能有一个。群集索引按照其索引进行物理排序。列子:如果为百科全书做索引,群集索引就是页码。

    非群集索引—每个表可以有多个。非群集索引是指用于找到数据的其他一些值。列子:为百科全书做索引,非群集索引就是百科全书后面的关键字索引。

数据库对象

 

索引  
是仅在特定表或视图架构内存在的对象。是一个或多个键的集合,每个键指向表中的一行。使用索引是快速查找数据库中实际信息的一种方法。

     分为2类
聚集索引—-聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。

            但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

      
 非聚集索引—-非聚集索引与课本中的目录类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,

             而表中的信息按另一种顺序存储  

 触发器   是在表操作时(插入、更新、删除等)自动执行的一段逻辑代码。

    理解:某个条件成立时,触发器里面所定义的语句就会被自动的执行。触发器不需要去调用,也不能调用。

 约束 
 是在任何业务中,数据通常必须符合特定限制或规则。例如,职员编号必须是
唯一的。数据库管理器提供了约束作为强制实施这种规则的方法。

 数据库关系图   是数据库设计器是一种可视化工具,它允许您对所连接的数据库进行设计和可视化处理。 

       设计数据库时,您可以使用数据库设计器创建、编辑或删除表、列、键、索引、关系和约束。 

       为使数据库可视化,您可创建一个或多个关系图,以显示数据库中的部分或全部表、列、键和关系。

 视图 
 视图是一个虚拟表,其内容由查询定义。视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。视图通常用来集中、简化和自定义每个用户对数据库的不同认识。

 存储过程   是组成一个单元的T-SQL语句的有序集合。

 

3.索引的作用?和它的优点缺点是什么?

答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

 

  2.2触发器

  触发器是在操作表的时候(CRUD)自动执行一段逻辑代码。

SQL Server 配置管理器

主要分为两个部分 : 服务管理   网络配置

 

服务管理 :安装完整的SQL Server包括9个服务,其中7个服务可以使用sql
server配置管理器这一部分来管理(另外2个 是作为后台支持的服务)

     7个包括:

韦德1946娱乐手机版 1

 网络配置 :**

  提供的NetLib包括 4个:

 VIA (硬件存储器供应商可能支持的特殊虚拟接口)

韦德1946娱乐手机版 2

 

协议:为了让客户机与服务器进行连接,服务器必须
侦听协议,而客户机使用该协议试图与服务器通信,如果是TCP/IP
协议,则要在相同端口上。

TCP/IP
在这个连接来有介绍到 

 

SQL Server 集成服务

功能很强大,可以从各种数据源取得数据,并将数据输入到SQL
Server数据表。是一种数据转换服务,数据转换本质上是指按照某种逻辑规则处理数据。

 

Bulk Copy Program

老的帮助工具。是命令行程序,其主要目的是将导入导出SQL
Server的数据全部格式化。

 

SQL Server Profiler

实质上是实时跟踪工具,跟踪细节,具有很强的过滤功能。

sqlcmd

控制台应用程序。

PowerShell

它是一个非常健壮的脚本和服务器导航引擎。可以导航服务器上所有的对象。

 

4.什么是内存泄漏?

答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

 

  2.3约束

       约束只能在表中,就是限制表中的数据满足某种条件。

5.维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?

答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

 

3.文件组 

  默认情况下,表及其他对象要存储在一个文件中,默认情况下,该文件就是文件组的主要成员。

       用户可以自己创建自定义文件组。

6.什么是事务?什么是锁?

答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

4.数据库关系图

  数据库关系图是数据库设计的可视表示。

 

5.视图

  视图是一种虚拟表(不包含数据,其它与表类似)。

7.什么叫视图?游标是什么?

答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

6.存储过程

  存储过程是SQL
Service编程功能的基础。存储过程通常是组成一个逻辑单元的Transact-SQL(SQL
Service 数据库查询语言)语句的有序集合。

     存储过程允许使用变量和参数,也可使用选择和循环结构。

 

 

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)持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注