第3章
创建与管理数据库
SQL Server 2016将数据保存于数据库中,并为用户提供了访问这些数据的接口。数据库所存储的信息能否正确地反映现实世界,能否在系统运行过程中及时、准确地为各个应用程序提供所需的数据,关系到以此数据库为基础的应用系统的性能。
本章主要介绍数据库的基本概念及数据库的创建、修改、附加、分离和删除等基本操作,以及数据库快照的创建和数据库的分区管理等。
3.1数据库对象和数据库文件
3.1.1数据库的基本概念
数据库的
基本概念 SQL Server 2016将数据库映射为一组磁盘文件,并将数据与日志信息分别保存于不同的磁盘文件中,每个文件仅在与之相关的数据库中使用。因此,从物理角度看,数据库包括数据文件和日志文件。从逻辑角度看,数据库中的表、索引、触发器、视图、键、约束、默认值、规则、用户定义数据类型或存储过程及数��库本身,都可以理解为数据库对象。
1. 数据库的结构层次
SQL Server的数据库基本结构分为3个层次,反映了观察数据库的3种不同角度。以内模式为框架所组成的数据库叫做物理数据库,以概念模式为框架所组成的数据库叫做概念数据库,以外模式为框架所组成的数据库叫做用户数据库。
(1) 物理数据库。这是数据库的*内层,是物理存储设备上实际存储数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。在SQL Server中就是存储文件,即由操作系统管理的数据文件和日志文件。
(2) 概念数据库。这是数据库的中间一层,是数据库的整体逻辑表示。概念数据库指出了每个数据的逻辑定义及数据间的逻辑联系,是存储记录的集合,涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。在SQL Server中表现为由数据行和列组成的基本表。
(3) 用户数据库。这是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。数据库不同层次之间的联系是通过映射进行转换的。在SQL Server中表现为视图、报表和查询结果集等。
2. 数据库的逻辑结构
SQL Server的数据库逻辑结构可以理解为在运行SQL Server软件中观察到的数据库组成。例如,展开SQL Server 2016的示例数据库teaching,如图31所示,可以看到teaching数据库组成部分,如数据库关系图、表、视图等数据库对象。每个数据库对象完全限定的对象名称包含4部分: server.database.schema.object即服务器.数据库.架构.数据库对象 以访问teaching数据库的表student为例,即使在当前服务器中也需要写成teaching.dbo.student的形式。如果从其他服务器中访问,前面还需加上服务器名。其中,dbo表示架构; schema在SQL Server中为架构的统称。
图31数据库的逻辑结构
3. 架构
架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其内部的每个元素的名称都是**的。在SQL Server 2016中的默认架构是DBO。如果用户创建数据库时没有指定架构,系统将使用默认架构。展开一个数据库中的“**性”→“架构”文件夹,就可以观察到系统架构列表。
4. 数据库所有者
数据库所有者(DBO)就是有权限访问数据库的用户,即登录数据库的网络用户。数据库所有者是**的,拥有该数据库中的全部权限,并能够提供给其他用户访问权限和功能。
5. 数据库的物理文件
每个SQL Server 2016数据库至少具有两个操作系统文件,即一个主数据文件和一个日志文件。主数据文件包含数据和数据库对象,日志文件包含恢复数据库中的所有事务所需的信息。
SQL Server 2016数据库具有以下3种类型的文件。
(1) 主数据文件包含数据库的启动信息,并指向数据库中的其他文件。用户数据和对象可存储在此文件中,也可以存储在次要数据文件中。每个数据库有一个主要数据文件,建议文件扩展名是.mdf。
(2) 次要数据文件是可选的,由用户定义并存储用户数据。通过将每个文件放在不同的磁盘驱动器上,次要文件可用于将数据分散到多个磁盘上,建议文件扩展名是.ndf。
(3) 事务日志文件保存用于恢复数据库的日志信息。每个数据库必须至少有一个日志文件,建议文件扩展名是.ldf。
默认情况下,数据和事务日志被放在同一个驱动器的同一个路径下,这是为处理单磁盘系统而采用的方法。但是,在生产环境中建议将数据和日志文件放在不同的磁盘上。
数据库的
常用对象 3.1.2数据库的常用对象
数据库对象是数据库的组成部分,除了数据库本身外,常见的对象有表、索引、视图、数据库关系图、默认值、规则、触发器、用户、存储过程、序列等,本节简要介绍这些对象的概念,为后续学习打下基础。
(1) 表(Table)。数据库中的表与日常生活中使用的表格类似,由行(Row)和列(Column)组成。其中,列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名。行包括若干列的信息项。一行数据称为一个或一条记录,是有一定意义的信息组合。一个数据库表由一条或多条记录组成,没有记录的表称为空表。每个表中通常都有一个主关键字,用于**地确定一条记录。
(2) 索引(Index)。索引是根据指定的数据库表列建立起来的顺序。它提供了快速查询大量数据的方法。有的索引还可以限制表,使其指定的列数据不重复。
(3) 视图(View)。视图是一个虚拟的表,在数据库中实际并不存在。视图是由查询数据表产生的,可以用来控制用户对数据的访问,并能简化数据的显示,提高数据的**性管理水平。
(4) 数据库关系图(Database diagram)。这是本数据库中的表之间的关系示意图,也称图表,利用图表可以编辑表与表之间的关系以及表的行列属性。
(5) 默认值(Default)。默认值是当在表中创建列或插入数据时,对没有指定其具体值的列或列数据项赋予事先设定好的值。
(6) 规则(Rule)。规则是对数据库表中数据信息的限制,其限定的是表的列。
(7) 存储过程(Stored Procedure)。存储过程是为完成特定功能而汇集在一起的一组SQL程序语句,经编译后存储在数据库中的SQL程序。
(8) 触发器(Trigger)。触发器是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时,这组命令就会自动执行。
(9) 用户(User)。用户是有权限访问数据库的使用者,同时需要自己输入登录账号和密码。一般来说,数据库用户分为管理员用户和普通用户,前者可对数据库进行修改删除,后者只能进行阅读、查看等操作。
除了以上列出的数据库对象之外,不同的数据库管理系统也有部分自定义的对象,将在具体学习中分别介绍,此处不再赘述。
数据库的存储
3.1.3数据库的存储
SQL Server 2016数据库是以文件的方式存储到磁盘中,其中数据文件和日志文件的结构不同,存储方式也不一样,如图32所示。
图32数据的存储方式
1. 数据文件的存储结构
从SQL Server 2016数据库的物理架构上来看,SQL Server用于存储数据的基本单位是页,每页容量为8KB。也就是说,数据库对应磁盘文件在逻辑上可以被划分为多个页。通常页码是由0~n的一组连续号码组成。实际上,SQL Server 2016在执行底层的磁盘I/O时也是以页级为单位的。SQL Server将8个物理上连续的页组成一个区,以此可以更加有效地管理数据页。
(1) 数据页。SQL Server将8KB的数据划分为一页,即在SQL Server数据库中的1MB数据中包含128页。
SQL Server 2016的页类型共有包括数据页、索引页、文本/图像页等8种。每个页的开头为96B的系统信息,此信息包括页码、页类型、页的可用空间以及拥有该页的对象分配单元ID。其中,页类型用于指明该页存储的数据类型以及使用状态等信息。数据区占有8060B,页尾的行偏移数组占有36B。
(2) 扩展盘区(Extents)。数据页是SQL Server数据库读写数据的基本单位,扩展盘区就是管理存储空间的基本单位。一个扩展盘区由8个物理上连续的页(64KB)组成,即SQL Server数据库中每1MB包含16个区。
为了提高空间利用率,SQL Server 2016在为数据库中的某个数据表分配存储区时采取两种不同的策略。
① 将扩展盘区中所有8个存储页全部分配给一个数据库对象(如数据表),采用这种方法分配的区也被称为“统一区”。统一区中的所有8个存储页只能供所属对象使用。
② 允许扩展盘区中的存储页由1~8个数据对象共同使用。这种分区方式也称为“混合区”。采用这种方式的分区,区中的每一页(共8页)都可由不同的对象拥有。
2. 日志文件的存储结构
SQL Server数据库提供的日志功能可以记录数据行从数据库创建到当前时刻对数据库所做的全部更改。针对数据库中任何一行执行的操作都将被作为一个日志行,并在事务提交时写入日志文件中。SQL Server 2016中的事物日志功能一般用于恢复指定事务,还原的数据库、文件、文件组或页前滚至故障点,支持事务性复制和备份服务器解决方案,实现在SQL Server启动时恢复所有未完成的事务。
(1) SQL Server数据库日志的物理结构。日志文件并不包括在文件组内,SQL Server 2016的日志文件中包含着一系列日志行。日志行按照顺序存储到实现事务日志的物理文件集中。
(2) SQL Server数据库日志的逻辑结构。SQL Server 2016数据库中的事务日志以日志行为单位。每条日志行是由一个日志序列号(Log Sequence Num,LSN)标识。每条新日志行均写入日志的逻辑结尾处,并使用一个比前一行LSN大的LSN。LSN**标识一条日志行。每一日志行中都包含该日志行所属的事务ID。
(3) SQL Server 2016将数据库的回滚操作也放到日志中。SQL Server数据库在事务日志中为每个事务都预留了空间,以确保存有足够的日志空间行由回滚语句或错误引起的回滚操作。事务完成后将释放此保留空间。
数据库日志文件中,用于确保数据库成功回滚的首日志行与*后一条日志行之间的部分称为日志的活动部分,即“活动日志”。这是进行数据库完整恢复所需的日志部分。需要注意的是,永远不能截断活动日志的任何部分。
3.2用户数据库创建与修改
一个SQL Server实例,可以创建32000多个用户数据库。在创建数据库之前,首先用户应该清楚是否有相关的权限。要创建数据库,必须至少拥有CREATE DATABASE、CREATE ANY DATABASE或ALTER ANY DATABASE等语句的权限。其次,创建数据库的用户将成为该数据库的所有者。
3.2.1用户数据库的创建
在SQL Server中,用户要创建数据库必须确定数据库的名称、所有者、大小以及存储该数据库的文件和文件组。数据库名称必须遵循为标识符指定的规则。这些规则主要包括以下几点:
(1) 数据库名称长度为1~128个字符。
(2) 名称首字符必须是一个英文字母或“_ ”“#”和“@”中的任意字符。
(3) 在中文版SQL Server 2016中,可以直接使用汉字为数据库命名。
(4) 名称中不能出现空格,不允许使用SQL Server 2016的保留字。
每个SQL Server数据库至少具有两个操作系统文件,即一个数据文件和一个日志文件。数据文件包含数据库对象,日志文件包含恢复数据库中的所有事务所需的信息。为了便于分配和管理,可以将数据文件集合起来放到文件组中。
在SQL Server 2016中创建用户数据库主要有以下两种形式。
利用SSMS创
建用户数据库