数据库是用来存储数据的空间,它作为存储结构的最高层次是其他一切数据库操作的基础。用户可以通过创建数据库来存储不同类别或者形式的数据。
因此,在本章用户将详细地学习针对数据库的基本操作和数据库的日常管理操作,即如何创建数据库、对数据/日志文件进行操作、生成数据库快照等日常操作。
本章学习目标:
Ø 了解数据库对象及构成
Ø 掌握创建数据库的两种方法
Ø 掌握管理数据库的方法
Ø 了解数据库快照
SQL Server中的数据库是由数据表的集合组成的,每个数据表中包含数据以及其他数据库对象,这些对象包括视图、索引、存储过程和触发器等。
数据库系统使用一组操作系统文件来映射数据库管理系统中保存的数据库,数据库中的所有数据和对象都存储在其映射的操作系统文件中。这些操作系统文件可以是数据文件或日志文件。
要熟练地理解和掌握数据库,必须对数据库的一些基本概念及构成有一个清楚的认识。
数据库中存储了表、视图、索引、存储过程、触发器等数据库对象,这些数据库对象存储在系统数据库或用户数据库中,用来保存SQL Server数据库的基本信息及用户自定义的数据操作等。
1.表与记录
表是数据库中实际存储数据的对象。由于数据库中的其他所有对象都依赖于表,因此可以将表理解为数据库的基本组件。一个数据库可以有多个行和列,并且每列包含特定类型的信息。列和行也可以称为字段与记录。字段是表中纵向元素,包含同一类型的信息,例如读者卡号(Rcert)、姓名(name)和性别(Sex)等;字段组成记录,记录是表中的横向元素,包含有单个表内所有字段所保存的信息,例如读者信息表中的一条记录可能包含一个读者的卡号、姓名和性别等。如图2-1所示为【图书管理系统(BookDateBase)】数据库中【读者信息(Reader)】数据表的内容.
图2-1 【读者信息(Reader)】数据表
2.视图
视图是从一个或多个基本(数据)表中导出的表,也被称为虚表。视图与表非常相似,也是由字段与记录组成。与表不同的是,视图不包含任何数据,它总是基于表,用来提供一种浏览数据的不同方式。视图的特点是,其本身并不存储实际数据,因此可以是连接多张数据表的虚表,还可以是使用WHERE子句限制返回行的数据查询的结果。并且它是专用的,比数据表更直接面向用户。如图2-2所示是正在创建的视图,它的结果来自【图书管理系统(BookDateBase)】数据库中的【读者信息(Reader)】表、【图书信息(Books)】表和【借阅信息(BorrowOrReturn)】表。
图2-2 【读者信息_借阅信息_图书信息表】视图
3.索引
索引是一种无须扫描整个表就能实现对数据快速访问的途径,使用索引可以快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如【读者信息(Reader)】数据表中的【员工卡号(Rcert)】列。如果要查找某一读者姓名,索引会帮助用户更快地获得所查找的信息。
4.约束
约束是SQL Server 2008实施数据一致性和完整性的方法,是数据库服务器强制的业务逻辑关系。约束限制了用户输入到指定列中值的范围,强制了引用完整性。主键和外键就是约束的一种形式。当在数据库设计器中创建约束时,约束必须符合创建和更改表的ANSI标准。
5.数据库关系图
在讲述规范化和数据库设计时会详细讲述数据库关系图,这里只要清楚数据库关系图是数据库设计的视觉表示,它包括各种表、每一张表的列名以及表之间的关系。在一个实体关系(Entity-Relationship,或者叫E-R关系图)中,数据库被分成两部分:实体(如“生产企业”和“顾客”)和关系(“提供货物”和“消费”)。
6.默认值
如果在向表中插入新数据时没有指定列的值,则默认值就是指定这些列中所的值。默认可以是任何取值为常量的对象。默认值也是SQL Server提供确保数据一致性和完整性的方法。
在SQL Server 2008中,有两种使用默认值的方法。第一种,在创建表时,指定默认值。如果使用SQL Server Management Studio,则可以在设计表时指定默认值。如果使用Transact-SQL语言,则在CREATETABLE语句中使用DEFAULT子句。第二种,使用CREATE DEFAULT语句创建默认对象,然后使用存储过程sp_binddefault将该默认对象绑定到列上。
7.规则
规则和约束都是限制插入到表中的数据类型的信息。如果更新或插入记录违反了规则,则插入或更新操作被拒绝。此外,规则可用于定义自定义数据库类型上的限制条件。与约束不同,规则不限于特定的表。它们是独立对象,可绑定到多个表,或者甚至绑定到特定数据类型(从而间接用于表中)。
8.存储过程
存储过程与其他编程语言中的过程类似,原因主要有以下几点:
l 接收输入参数并以输出参数的格式向调用过程或批处理返回多个值
l 包含用于在数据库中执行操作(包括调用其他过程)的编程语句
l 向调用过程或批处理的返回状态值,以指明成功或失败(以及失败的原因)
l 可以使用EXECUTE语句来运行存储过程。但是,存储过程与函数不同,因为存储过程不返回取代其名称的值,也不能直接在表达式中使用。
9.触发器
触发器是一种特殊类型的存储过程,这是因为触发器也包含了一组Transact-SQL语句。但是,触发器又与存储过程明显不同,例如触发器可以执行。如果希望系统自动完成某些操作,并且自动维护确定的业务逻辑和相应的数据完整,那么可以通过使用触发器来实现。
触发器可以查询其他表,而且可以包含复杂的Transact-SQL语句。他们主要用于强制服从复杂的业务规则或要求。例如,用户可以根据商品当前的库存状态,决定是否需要向供应商进货。
在SQL Server 2008中,一个重要的特性是允许用户使用熟悉的CLR语言创建存储过程和触发器。 |
10.用户和角色
用户是指对数据库有存取权限的使用者。角色是指一组数据库用户的集合,和Windows中用户组类似。数据库中的用户组可以根据需要添加,用户如果被加入到某一角色,则将具有该角色的所有权限。
在SQL Server中,用于数据存储的实用工具是数据库。而数据库从大的方面分,包括系统数据库和用户数据库。每个SQL Server数据库(无论是系统数据库还是用户数据库)在物理上都由至少一个数据文件和至少一个日志文件组成。出于分配和管理目的,可以将数据库文件分成不同的文件组。
1.系统数据库
无论SQL Server的哪一个版本,都存在一组系统数据库。系统数据库中保存的系统表用于系统的总体控制。系统数据库保存了系统运行及对用户数据的操作等基本信息。这些系统数据分别是Master、Model、Msdb和Tempdb。这些系统数据库的文件存储在SQL Server的默认安装目录的MMSQL子目录的Data文件夹中。
l master数据库
master数据库是SQL Server是最重要的数据库,它位于SQL Server的核心,如果该数据库被损坏,SQL Server将无法正常工作。master数据库中包含了所有的登录名或用户ID所属的角色;服务器中的数据库的名称及相关信息;数据库的位置;SQLServer如何初始化四方面的重要信息。
定期备份master数据库非常重要。确保备份master数据库是备份策略的一部分。 |
l model数据库
创建数据库时,总是以一套预定义的标准为模型。例如,若希望所有的数据库都有确定的初始大小,或者都有特定的信息集,那么可以把这些信息放在model数据库中,以model数据库作为其他数据库的模板数据库。如果想要使所有的数据库都有一个特定的表,可以把该表放在model数据库里。
model数据库是tempdb数据库的基础。对model数据库的任何改动都将反映在tempdb数据库中,所以,在决定对model数据库有所改变时,必须预先考虑好并多加小心。
l Msdb数据库
msdb给SQL Server代理提供必要的信息来运行作业,因而,他是SQL Server中另一个十分重要的数据库。
SQL Server代理是SQL Server中的一个Windows服务,用以运行任何已创建的计划作业(例如包含备份处理的作业)。作业是SQLServer中定义的自动运行的一系列操作,他不需要任何手工干预来启动。
l Tempdb数据库
Tempdb数据库用作系统的临时存储空间,其主要作用是存储用户建立的临时表和临时存储过程,存储用户说明的全局变量值,为数据排序创建临时表,存储用户利用游标说明所筛选出来的数据。
因为tempdb的大小是有限的,所以在使用他时必须当心,不要让tempdb被来自不好的存储过程(对于创建有太多记录的表没有明确限制)的表中的记录所填满。如果发生了这种情况,不仅当前的处理不能继续,整个服务器都可能无法工作,从而将影响到在该服务器上的所有用户。 |
使用数据库的时候要记住一点,SQL Server 2008的设计是可以在必要时自动扩展数据库的。这意味着master、model、tempdb、msdb和其他关键的数据库将不会在正常的情况下缺少空间的。如表2-1中列出了这些系统数据库在SQLServer 2008系统中的主文件、逻辑名称、物理和文件增长比例。
表2-1 系统数据库
系统数据库 |
主文件 |
逻辑名称 |
物理名称 |
文件增长 |
master |
主数据 |
master |
master.mdf |
按10%自动增长,直到磁盘已满 |
Log |
mastlog |
mastlog.ldf |
按10%自动增长,直到达到最大值2TB |
|
msdb |
主数据 |
MSDBData |
MSDBData.mdf |
按256KB自动增长,直到磁盘已满 |
Log |
MSDBLog |
MSDBLog.ldf |
按256KB自动增长,直到达到最大值2TB |
|
model |
主数据 |
modeldev |
model.mdf |
按10%自动增长,直到磁盘已满 |
Log |
modellog |
modellog.ldf |
按10%自动增长,直到达到最大值2TB |
|
tempdb |
主数据 |
tempdev |
tempdb.mdf |
按10%自动增长,直到磁盘已满 |
Log |
templog |
templog.ldf |
按10%自动增长,直到达到最大值2TB |
2.示例数据库
示例数据库是Microsoft给出的用于用户使用的数据库。示例数据库中包含了各种数据库对象,使用户可以自由地对其中的数据或者表结构进行查询、修改等操作。
在安装SQL Server 2008的过程中,可以在安装组件窗口中选择安装示例数据库,默认的示例数据库有AdventureWorks和AdventureWorksDW两个。AdventureWorks数据库相对于以前SQLServer版本的示例数据库更加健壮。虽然他对于初学者有一定的复杂性,但是该数据库具有相当完成的实例,及更接近实际的数据容量、复杂的结构和部件。AdventureWorksDW数据库是AnalysisServices(分析服务)的示例数据库。Microsoft将分析示例数据库与事务示例数据库联系在一起,以提供展示两者协同运行的完成示例数据库。
在SQL Server 2008系统中,一个数据库至少有一个数据文件和一个事务日志文件。当然,该数据库也可以有多个数据文件和多个事务日志文件。数据文件用于存放数据库的数据和各种对象,事务日志文件用于存放事务日志。
数据文件又可以分成主数据文件和辅助数据文件两种形式。主数据文件是数据库的起点,每一个数据库都有且仅有一个主数据文件。主数据文件名称的默认后缀是.mdf。辅助数据文件是可选的,用来存放不在主数据文件中的其他数据和对象。数据库可以没有辅助数据文件,也可以有多个辅助数据文件,默认后缀是.ndf。
事务是一个单元的工作,该单元的工作要么全部完成,要么全部不完成。SQL Server 2008系统具有事务功能,可以保证数据库操作的一致性和完整性。SQL Server 2008系统使用数据库的事务日志来实现事务的功能。通常情况下,事务日志记录了对数据库的所有修改操作。事务日志记录了每一个事务的开始、对数据的改变和取消修改等信息。随着对数据库的持续不断地操作,日志是连续增加的。对于一些大型操作,例如创建索引,日志只是记录该操作的事实,而不是记录所发生的数据。事务日志还记录了数据页的分配和释放,以及每一个事务的提交和回滚等信息。这样就允许SQL Server系统恢复和取消事务。当事务没有完成时,则取消该事务。事务日志以操作系统文件的形式存在,在数据库中被称为日志文件。每一个数据库都至少有一个日志文件。日志文件名称的默认后缀是.ldf。
在操作系统中,数据库是作为数据文件和日志文件而存在的,明确地指明了这些文件的位置和名称。但是,在SQL Server系统内部,例如在Transact-SQL语言中,由于物理文件名称比较长,使用起来非常不方便。为此,数据库又有逻辑文件的概念。每一个物理文件都对应一个逻辑文件。在使用Transact-SQL语句的过程中,引用逻辑文件非常快捷和方便。
文件组就是文件的逻辑集合。文件组可以把一些指定的文件组合在一起,以方便管理和分配数据。例如,在某个数据库中,3个文件(如data1.ndf、data2.ndf和data3.ndf)分别创建在3个不同的磁盘驱动器中,并且为他们指定了一个文件组group1。以后,所创建的表可以明确指定存放在文件组group1中。对该表中数据的查询将分布在这3个磁盘上同时进行,因此可以通过执行并行访问而提高查询性能。在创建表时,不能指定将表放在某个文件中,只能指定将表放在某个文件组中。因此,如果希望将某个表放在特定的文件中,必须通过创建文件组来实现。使用文件和文件组时,应该考虑下列因素:
l 一个文件或者文件组只能用于一个数据库,不能用于多个数据库。
l 一个文件只能是某一个文件组的成员,不能是多个文件组的成员。
l 数据库的数据信息和日志信息不能放在同一个文件或文件组中,数据文件和日志文件总是分开的。
l 日志文件永远也不能是任何文件组的一部分。
在SQL Server 2008系统中,可管理的最小物理空间以页为单位,每一个页的大小是8KB,即8192字节。在表中,每一行数据都不能跨页存储。这样,表中每一行的字节数不能超过8192个字节。在每一个页上,由于系统占用了一部分空间用来记录与该页有关的系统信息,所以每一个页可用的空间是8060个字节。但是,包含了varhcar、nvarchar、varbinary等数据类型的列的表则不受这种规则限制。每8个连续页称为一个区,即区的大小是64KB。这意味着1MB的数据库有16个区。区用于控制表、索引的存储。
通过理解数据库的空间管理,可以估算数据库的设计尺寸。数据库的大小等于所有表大小与索引大小之和。假设某个数据库只有一个表,该表的数据行字节是800Byte。这时,一个数据页上最多只能放10行数据。如果该表大约有100万行的数据,那么该表占用10万个数据页的空间。因此,该数据库的大小估计为:100000×8KB=800000KB=781.25MB。根据数据库大小的估计值,再考虑其他的因素,就可以得到数据库的设计值。
SQL Server不强制这主数据文件、辅助数据文件和日志文件类型的文件必须带mdf、ndf和ldf扩展名,但使用扩展名指出文件类型是个良好的文件命名习惯。 |
创建数据库就是为数据库确定名称、大小、存放位置、文件名和所在文件组的过程。在一个SQL Server 2008实例中,最多可以创建32767个数据库,数据库的名称必须满足系统的标识符规则。在命名数据库时,一定要使数据库名称简短并有一定的含义。
在SQL Server 2008中创建数据库的方法主要有两种:一是在SQL Server Management Studio窗口中使用现有命令和功能,通过方便的图形化向导创建;二是通过编写Transact-SQL语句创建。
SQL ServerManagement Studio是SQL Server系统运行的核心窗口,它提供了用于数据库管理的图形工具和功能丰富的开发环境,方便数据库管理员及用户进行操作。
首先来介绍如何使用SQL Server Management Studio来创建自己的用户数据库。在SQL Server 2008中,通过SQL ServerManagement Studio创建数据库是最容易的方法,对初学者来说简单易用。下面以创建本书的示例数据库【图书管理系统(BookDateBase)】数据库为例,对这种方法作详细介绍。具体的操作步骤如下所示:
(1)从【开始】菜单中选择【程序】|Microsoft SQL Server 2008|SQL Server Management Studio命令,打开Microsoft SQL Server ManagementStudio窗口,并使用Windows或SQL Server身份验证建立连接。如图2-3所示。
图2-3 连接服务器身份验证
(2)在【对象资源管理器】窗格中展开服务器,然后选择【数据库】节点。
(3)在【数据库】节点上右击,从弹出的快捷菜单中选择【新建数据库】命令,如图2-4所示。
图2-4 选择【新建数据库】命令
(4)执行上述操作后,会弹出【新建数据库】对话框,如图2-5所示。
在这个对话框中有三个页,分别是【常规】、【选项】和【文件组】页。完成这三个选项中的内容之后,就完成了数据库的创建工作。
图2-5 【新建数据库】对话框
(5)在【数据库名称】文本框中输入要新建数据库的名称,例如这里输入“工资管理系统”。
(6)在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。
(7)在【数据库文件】列表中,包括两行:一行是数据文件,而另一行是日志文件。通过单击下面相应按钮,可以添加或者删除相应的数据文件。该列表中各字段值的含义如下:
l 逻辑名称 指定该文件的文件名,其中数据文件与SQL Server 2000不同,在默认情况下不再为用户输入的文件名添加下划线和Data字样,相应的文件扩展名并未改变。
l 文件类型 用于区别当前文件是数据文件还是日志文件。
l 文件组 显示当前数据库文件所属的文件组。一个数据库文件只能存在于一个文件组里。
在创建数据库时,系统自动将model数据库中的所有用户自定义的对象都复制到新建的数据库中。用户可以在model系统数据库中创建希望自动添加到所有新建数据库中的对象,例如表、视图、数据类型、存储过程等。 |
l 初始大小 制定该文件的初始容量,在SQL Server 2008中数据文件的默认值为3MB,日志文件的默认值为1MB.
l 自动增长 用于设置在文件的容量不够用时,文件根据何种增长方式自动增长。通过单击【自动增长】列中的省略号按钮,打开【更改自动增长设置】窗口进行设置。如图2-6和图2-7所示分别为数据文件、日志文件的自动增长设置窗口。
图2-6 数据文件自动增长设置
图2-7 日志文件自动增长设置
l 路径 指定存放该文件的目录。在默认情况下,SQL Server 2008将存放路径设置为SQL Server 2008安装目录下的data子目录。单击该列中的按钮可以打开【定位文件夹】对话框更改数据库的存放路径。
(8)单击【选项】按钮,设置数据库的排序规则、恢复模式、兼容级别和其他需要设置的内容,如图2-8所示。
图2-8 新建数据库【选项】页
(9)单击【文件组】可以设置数据库文件所属的文件组,还可以通过【添加】或者【删除】按钮更改数据库文件所属的文件组。如图2-9所示。
图2-9 新建数据库【文件组】页
(10)完成以上操作后,就可以单击【确定】关闭【新建数据库】对话框。至此,成功创建了一个数据库,可以通过【对象资源管理器】窗格查看新建的数据库。
在SQL Server 2008中创建新的对象时,他可能不会立即出现在【对象资源管理器】窗格中,可右击对象所在位置的上一层,并选择【刷新】命令,即可强制SQL Server 2008重新读取系统表并显示数据中的所有新对象。 |
使用SQL Server Management Studio创建数据库可以方便应用程序对数据的直接调用。但是,有些情况下,不能使用图形化方式创建数据库。比如,在设计一个应用程序时,开发人员会直接使用Transact-SQL在程序代码中创建数据库及其他数据库对象,而不用在制作应用程序安装包时再放置数据库或让用户自行创建。
SQL Server 2008使用的Transact-SQL是标准SQL(结构化查询语言)的增强版本,使用他提供的CREATE DATABASE语句同样可以完成新建数据库操作。下面同样以创建【图书管理系统(BookDateBase)】数据库为例来介绍如何使用Transact-SQL语句创建一个数据库。
使用CREATE DATABASE语句创建数据库最简单的方式如下所示:
CREATEDATABASE databaseName
按照方式只需指定databaseName参数即可,他表示要创建的数据库的名称,其他与数据库有关的选项都采用系统的默认值。例如,创建【图书管理系统(BookDateBase)】数据库,则语句为:
CREATEDATABASE BookDateBase
1.CREATE DATABASE语法格式
如果希望在创建数据库时明确的指定数据库的文件和这些文件的大小以及增长的方式。首先就需要了解CREATE DATABASE语句的语法,其完整的格式如下:
CREATEDATABASE database_name
[ON[PRIMARY]
[
[,
]
[
[LOG ON{
[COLLATEcollation_name]
[FOR{ATTACH [WITH
[WITH
]
[;]
{
[PRIMARY]
(
[NAME=logical_file_name,]
FILENAME='os_file_name'
[,SIZE=size[KB|MB|GB|TB]]
[,MAXSIZE={max_size[KB|MB|GB|TB]|UNLIMITED}]
[,FILEGROWTH=growth_increment[KB|MB|%]]
)[1,…n]
}
{
FILEGROUPfilegroup_name
}
{
DB_CHAINING{ON|OFF}|TRUSTWORTHY{ON|OFF}
}
{
ENABLE_BROKE|NEW_BROKE|ERROR_BROKER_CONVERSATIONS
}
2.CREATE DATABASE语法格式说明
在语法格式中,每一种特定的符号都表示有特殊的含义,其中:
l 方括号[]中的内容表示可以省略的选项或参数,[1,…n]表示同样的选项可以重复1到n遍。
l 如果某项的内容太多需要额外的说明,可以用<>括起来,如句法中的
l 大括号{}通常会与符号|连用,表示{}中的选项或参数必选其中之一,不可省略。
例如,MAXSIZE ={ max_size [ KB | MB | GB | TB ] | UNLIMITED }表示定义数据库文件的最大容量,或者指定一个具体的容量max_size [KB | MB | GB | TB ],或者指定容量没有限制UNLIMITED,但是不能空缺。下面表2-2列出了关于语法中主要参数的说明。
表2-2 语法参数说明
参数 |
说明 |
database_name |
数据库名称 |
Logical_file_name |
逻辑文件名称 |
os_file_name |
操作系统下的文件名和路径 |
size |
文件初始容量 |
max_size |
文件最大容量 |
growth_increment |
自动增长值或比例 |
filegroup_name |
文件组名 |
3.CREATE DATABASE关键字和参数说明
l CREATE DATABASE database_name 用于设置数据库的名称,可长达128个字符,需要将database_name替换为需要的数据库名称,如【工资管理系统】数据库。在同一个数据库中,数据库名必须具有惟一性,并符合标识命名标准。
l NAME=logical_file_name 用来定义数据库的逻辑名称,这个逻辑名称将用来在Transact_SQL代码中引用数据库。该名称在数据库中应保持惟一,并符合标识符的命名规则。这个选项在使用了FORATTACH时不是必须的。
l FILENAME=os_file_name 用于定义数据库文件在硬盘上的存放路径与文件名称。这必须是本地目录(不能是网络目录),并且不能是压缩目录。
l SIZE=size[KB|MB|GB|TB] 用来定义数据文件的初始大小,可以使用KB、MB、GB或TB为计量单位。如果没有为主数据文件指定大小,那么SQL Server将创建与model系统数据库相同大小的文件。如果没有为辅助数据库文件指定大小,那么SQL Server将自动为该文件指定1MB大小。
l MAXSIZE={max_size[KB|MB|GB|TB]UNLIMITED} 用于设置数据库允许达到的最大大小,可以使用KB、MB、GB、TB为计量单位,也可以为UNLIMTED,或者省略整个子句,使文件可以无限制增长。
l FILEGROWTH=growth_increment[KB|MB|%] 用来定义文件增长所采用的递增量或递增方式。他可以使用KB、MB或百分比(%)为计量单位。如果没有指定这些符号之中的任一符号,则默认MB为计量单位。
l FILEGROUP filegroup_name 用来为正在创建的文件所基于的文件组指定逻辑名称。
4.使用CREATE DATABASE创建数据库
在掌握了上述内容后,接下来介绍如何使用CREATE DATABASE语句创建【工资管理系统】数据库。
(1)打开MicrosoftSQL Server Management Studio窗口,并连接到服务器。
(2)选择【文件】|【新建】|【数据库引擎查询】命令或者单击标准工具栏上的【新建查询】按钮(),创建一个查询输入窗口。
通过选择【文件】|【新建】|【数据库引擎查询】命令创建查询输入窗口会弹出【连接到数据库引擎】对话框需要身份验证连接到服务器,而通过单击【新建查询】按钮( |
(3)在窗口内输入语句,创建【图书管理系统(BookDateBase)】数据库,保存位置为“E:\张帅\zs SQL2008shugao\SQL2008\第3章 管理数据库 代码”。CREATE DATABASE语句如下所示:
CREATEDATABASE BookDateBase
ON
(
NAME=BookDateBase_DAT,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章管理数据库 代码\BookDateBase_DAT.mdf',
SIZE=3MB,
MAXSIZE=50MB,
FILEGROWTH=10%
)
LOGON
(
NAME=BookDateBase_LOG,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章管理数据库 代码\BookDateBase_LOG.ldf',
SIZE=1MB,
MAXSIZE=10MB,
FILEGROWTH=10%
)
GO
(4)单击【执行】按钮()执行语句。如果执行成功,在查询窗口内的【查询】窗格中,可以看到一条“命令已成功完成。”的消息。然后在【对象资源管理器】窗格中刷新,展开数据库节点就能看到刚创建的【图书管理系统】数据库。如图2-10所示。
图2-10 CREATE DATABASE创建数据库
在上述的例子中,创建了【图书管理系统(BookDateBase)】数据库,其中NAME关键字指定了数据文件的逻辑名称是“BookDateBase_DAT”,日志文件的逻辑名称是“BookDateBase_LOG”,而他的数据文件的物理名称是通过FILENAME关键字指定的。在【工资管理系统(BookDateBase)】数据库中,通过SIZE关键字把数据文件的大小设置为3MB,最大值为50MB,按10%的比例增长,日志文件的大小设置为1MB,最大值为10MB,按10%的方式增长。整个数据库的大小为:数据文件大小(3MB)+日志文件大小(1MB)=4MB。
如果感觉以后数据库会不断增长,那么就指定其自动增长方式。反之,最好不要指定其自动增长,以提高数据的使用效率。 |
5.创建文件组的【图书管理系统(BookDateBase)】数据库
如果数据库中的数据文件或日志文件多于1个,则文件之间使用逗号隔开。当数据库有两个或两个以上的数据文件时,需要指定哪一个数据文件是主数据文件。默认情况下,第一个数据文件就是主数据文件,也可以使用PRIMARY关键字来指定主数据文件。
下面重新创建【图书管理系统(BookDateBase)】数据库,让该数据库包含3个数据文件和2个日志文件。并将后两个数据文件存储在名称为group1的文件组中。代码如下所示:
CREATE DATABASE BookDateBase
ON PRIMARY
(
NAME= BookDateBase _DAT,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库 代码\ BookDateBase _DAT.mdf',
SIZE=3MB,
MAXSIZE=50MB,
FILEGROWTH=10%
),
FILEGROUP group1
(
NAME= BookDateBase _DAT1,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库 代码\ BookDateBase _DAT1.ndf',
SIZE=2MB,
MAXSIZE=10MB,
FILEGROWTH=5%
),
(
NAME= BookDateBase _DAT2,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库 代码\ BookDateBase _DAT2.ndf',
SIZE=2MB,
MAXSIZE=20MB,
FILEGROWTH=15%
)
LOG ON
(
NAME= BookDateBase _LOG,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库 代码\ BookDateBase _LOG.ldf',
SIZE=1MB,
MAXSIZE=10MB,
FILEGROWTH=10%
),
(
NAME= BookDateBase _LOG1,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库 代码\ BookDateBase _LOG1.ldf',
SIZE=1MB,
MAXSIZE=5MB,
FILEGROWTH=5%
)
重新创建【图书管理系统(BookDateBase)】数据库时必须先删除之前创建的那个【图书管理系统(BookDateBase)】数据库。右键单击要删除的数据库,选择“删除”命令,单击“确定”按钮。 |
上述代码中,创建了3个数据文件和2个日志文件分别为:BookDateBase_DAT,BookDateBase_DAT1,BookDateBase_DAT2和BookDateBase_LOG,BookDateBase_LOG1,将“BookDateBase_DAT”设为了主数据文件。创建之后,就可以在“E:\张帅\zsSQL2008shugao\SQL2008\第3章管理数据库代码”目录下看到所创建的文件。
在创建完成数据库之后,就可以对数据库进行管理操作,主要包括查看、修改和删除。查看是指可以浏览数据库的各种属性和状态;修改是指可以修改数据库的名称、大小、自动增长等;删除数据库是对不需要的数据库进行删除,以释放多余的磁盘空间。
Microsoft SQL Server2008系统中,查看数据库信息有很多种方法,例如,可以使用目录视图、函数和存储过程等查看有关数据库的基本信息。下面分别来介绍这几种查看数据库信息的基本方式。
1.使用目录视图
常见的查看数据库基本信息的操作有:
l 使用sys.databases数据库和文件目录视图查看有关数据库的基本信息
l 使用sys.database_files查看有关数据库文件的信息
l 使用sys.filegroups查看有关数据库组的信息
l 使用sys.maste_files查看数据库文件的基本信息和状态信息
2.使用函数
可以使用DATABASEPROPERTYEX函数来查看指定数据库中的指定选项的信息,该函数一次只能返回一个选项的设置。例如,要查看【图书管理系统(BookDateBase)】数据库中的Version选项的设置信息,可以使用如下语句:
select DATABASEPROPERTYEX(' BookDateBase','Version')
代码的执行结果如图2-11所示:
图2-11 查看数据库选项设置
3.使用存储过程
使用sp_spaceused存储过程可以显示数据库使用和保留的空间。下面来查看【图书管理系统(BookDateBase)】数据库的空间大小和已经使用的空间等信息。如图2-12所示。
图2-12 使用sp_spaceused存储过程
可以查看所有数据库的基本信息,仍然来查看【图书管理系统(BookDateBase)】数据库的信息,如图2-13所示。
图2-13 使用sp_helpdb存储过程
除上面介绍的几种方法外,还可以利用Microsoft SQL Server Management Studio窗口来查看数据库信息。在【对象资源管理器】窗格中右击要查看信息的数据库,选择【属性】命令,在弹出的【数据库属性】对话框中就可以查看到数据库的常规信息、文件信息、文件组信息、选项信息等,如图2-14所示。
图2-14 【数据库属性】对话框
修改数据库的大小,其实就是修改数据文件和日志文件的长度,或者增加/删除文件。修改数据库最常用的两种方法为:通过ALTER DATABASE语句和图形界面。下面分别来介绍这两种修改数据库大小的方法。
1.使用ALTER DATABASE语句
下面使用ALTER DATABASE语句将【图书管理系统(BookDateBase)】数据库扩大5MB,可以通过为该数据库添加一个大小为5MB的数据文件来实现。语句如下所示:
ALTER DATABASE BookDateBase
ADD FILE
(
NAME= BookDateBase_DAT3,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库代码\ BookDateBase _DAT3.mdf',
SIZE=5MB,
MAXSIZE=30MB,
FILEGROWTH=20%
)
上述语句代码将添加一个名称为工资管理系统_DAT3,大小为5MB的数据文件,最大值为30MB,并可按20%自动增长。
如果要增加日志文件,可以使用ADD LOG FILE子句,在一个ALTER DATABASE语句中,一次可以增加多个数据文件或日志文件,多个文件之间需要使用,分开。 |
2.使用图形界面
下面来介绍如何在图形界面下修改数据库的大小:
(1)在【对象资源管理器】窗格中,右击要修改大小的数据库(如图书管理系统数据库BookDateBase),选择【属性】命令。
(2)在【数据库属性】对话框的【选择页】下选择【文件】选项。
(3)在【工资管理系统】数据文件行的【初始大小】列中,输入要修改的值。同样在日志文件行的【初始大小】列中,输入要修改的值。
(4)单击【自动增长】列中的按钮(),打开【自动增长设置】窗口,可设置自动增长的方式及大小。如图2-15所示。
图2-15 【自动增长设置】窗口
(5)如果要添加文件,可以直接在【数据库属性】对话框中单击【添加】按钮,进行相应大小设置即可。
(6)完成修改后,单击【确定】按钮完成修改数据库大小的操作。
数据库在使用中,随着数据库数量的增加,系统的资源消耗越来越多,运行速度也会越来越慢。这时,就需要调整数据库,调整方法有很多种。例如,将不再需要的数据库删除,以此释放被占用的磁盘空间和系统消耗。在SQL Server 2008中,有两种删除数据库的方法:使用图形界面和DROP DATABASE语句。
1.使用图形界面
(1)在【对象资源管理器】窗格中选中要删除的数据库,右击选择【删除】命令。
(2)在弹出的【删除对象】对话框中,单击【确定】按钮确认删除。删除操作完成后会自动返回SQL Server Management Studio窗口,如图2-16所示。
图2-16 【删除对象】窗口
2.DROP DATABASE语句
使用DROP DATABASE语句删除数据库的语法如下:
DROPDATABASE database_name [,…n]
其中,database_name为要删除的数据库名,[,…n]表示可以有多于一个数据库名。例如,要删除数据库“图书管理系统(BookDateBase)”,可使用如下的DROP DATABASE语句:
DROPDATABASE BookDateBase
使用DROP DATABASE删除数据库不会出现确认信息,所以使用这种方法时要小心谨慎。此外,千万不能删除系统数据库,否则会导致SQL Server 2008服务器无法使用。 |
到目前为此,已经学习了基本的数据库操作形式,除这些操作以外,数据的操作还包括分离数据库、附加数据库和收缩数据库等。下面就分别来简单介绍一下他们是怎样操作的。
1.分离数据库
分离数据库就是指将数据库从SQL Server 2008的实例中分离出去,但是不会删除该数据库的文件和事务日志文件,这样,该数据库可以再附加到其他的SQL Server 2008的实例上去。
首先,可以使用sp_detach_db存储过程来执行分离数据库操作。例如,要分离【图书管理系统(BookDateBase)】数据库,则该执行语句如下所示:
EXECsp_detach_db BookDate
不过,并不是所有的数据库都可以分离的,如果要分离的数据库出现下列任何一种情况都将无法分离数据库:
l 已复制并发布数据库。如果进行复制,则数据库必须是未发布的。如果要分离数据库,必须先通过执行sp_replicationdboption存储过程禁用发布后再进行分离。
l 数据库中存在数据库快照。此时,必须首先删除所有数据库快照,然后才能分离数据库。
l 数据库处于未知状态。在SQLServer 2008中,无法分离可疑和未知状态的数据库,必须将数据库设置为紧急模式,才能对其进行分离操作。
当然,也可以使用图开界面来执行分离数据库的操作。步骤如下:
(1)在【对象资源管理器】窗格中右击想要分离的数据库(如,图书管理系统BookDateBase),选择【任务】|【分离】命令。
(2)在打开的【分离数据库】对话框,查看在【数据库名称】列中的数据库名称,验证这是否为要分离的数据库,如图2-17所示。
图2-17 【分离数据库】对话框
(3)在【状态】列中的是如果显示的是“未就绪”,则【消息】列将显示有关数据库的超链接信息。当数据库涉及复制时,【消息】列将显示Database replicated。
(4)数据库有一个或多个活动连接时,【消息】列将显示“<活动连接数>个活动连接”。在可以分离数据列之前,必须启用【删除连接】复选框来断开与所有活动连接的连接。
(5)分离数据库准备就绪后,单击【确定】按钮。
2.附加数据库
附加数据库是指将当前数据库以外的数据库附加到当前数据库实例中。在附加数据库时,所有数据库文件(.mdf和.ndf文件)都必须是可用的。如果任何数据文件的路径与创建数据库或上次附加数据库时的路径不同,则必须指定文件的当前路径。在附加数据库的过程中,如果没有日志文件,系统将创建一个新的日志文件。
下面就将刚分离后的【图书管理系统(BookDateBase)】数据库再附加到当前数据库实例中。可以执行下列语句进行数据库附加操作,附加时会加载该数据库所有的文件,包括主数据文件、辅助数据文件和事务日志文件。执行语句如下所示:
CREATEDATABASE BookDateBase
ON
(
NAME='BookDateBase_DATA',
FILENAME = 'E:\张帅\zs SQL2008 shugao\SQL2008\第3章管理数据库 代码\BookDateBase_DAT.mdf'
)
LOGON
(
NAME=BookDateBase_LOG,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库代码\BookDateBase_LOG.ldf'
)
FORATTACH
同样,附加数据库也可以使用图形界面窗口。具体操作步骤如下所示:
(1)在【对象资源管理器】窗格中,右击【数据库】节点并选择【附加】命令。
(2)在打开的【附加数据库】对话框中单击【添加】按钮,从弹出的【定位数据库文件】对话框中选择要附加的数据库所在的位置,再依次单击【确定】按钮返回,如图2-18所示。
图2-18 【附加数据库】对话框
(3)回到【对象资源管理器】中,展开【数据库】节点,将看到【工资管理系统(BookDateBase)】数据库已经成功附加到了当前的实例数据库。
3.收缩数据库
如果数据库的设计尺寸过大,或者删除了数据库中的大量数据,这时数据库依然会耗费大量的磁盘资源。根据用户的实际需要,可以对数据库进行收缩。在Microsoft SQL Server 2008系统中,收缩数据库有以下3种方式。
l 使用AUTO_SHRINK数据库选项设置自动收缩数据库
将AUTO_SHRINK选项设置为ON后,数据库引擎将自动收缩具有可用空间的数据库。此选项可以使用ALTER DATABASE语句来进行设置。默认情况下,此选项设置为OFF。数据库引擎会定期检查每个数据库的空间使用情况。如果某个数据库的AUTO_SHRINK选项设置为ON时,则数据库引擎将自动减小数据库中的文件。设置AUTO_SHRINK选项的语法格式如下所示:
ALTERDATABASE database_name SET AUTO_SHRINK ON
l 使用DBCC SHRINKDATABASE命令收缩数据库
使用这种方式,要求手动的来收缩数据库的大小,他是一种比自动收缩数据库更加灵活的收缩数据库的方式,可以对整个数据库进行收缩。DBCC SHRINKDATABASE命令的基本语法格式如下所示:
DBCCSHRINKDATABASE ('database_name',target_percent)
l 使用DBCC SHRINKDFILE命令收缩数据库文件
此命令可以收缩指定的数据库文件,还可以将文件收缩至小于其初始创建的大小,并且重新设置当前的大小为其初始创建的大小。DBCC SHRINKDFILE命令的基本语法形式如下所示:
DBCCSHRINKDFILE ('file_name',target_size)
数据库快照是源数据库的只读、静态视图。一个源数据库可以有多个数据库快照。数据库快照的主要作用是:维护历史数据以用于制作各种报表,可以使用数据库快照将出现错误的源数据库恢复到创建快照时的状态。例如,在财务年度结束时,通过创建数据库快照可以有效地制作各种财务报表。
简单的说,快照就是数据库在某一指定时刻的照片。顾名思义,数据库快照(Database Snapshot)就像是为数据库照了相片一样。相片实际是照相时刻被照对象的静态呈现,而数据库快照则提供了源数据库在创建快照时刻的只读、静态视图。一旦为数据库建立了快照后,这个数据库快照就是创建快照那时刻数据库的情况,虽然数据库还在不断变化,但是这个快照不会再改变。
数据库快照在数据页级别上进行。当创建了某个数据库的数据库快照后,数据库快照使用一种稀疏文件维护源数据页。如果源数据库中的数据页上的数据没有更改,那么对数据库快照的读操作实际上就是读源数据库中的这些未更改的数据页。如果源数据库中的某些数据页上的数据被更改,则更改前的源数据页已经复制到数据快照的稀疏文件中去,对这些数据的读操作实际上就是读取稀疏文件中复制过来的数据页。如果源数据库中的数据更改频繁,会导致数据库快照中稀疏文件的大小增长的很快。为了避免数据库快照中的稀疏文件过大,可以通过创建新的数据库快照来解决这一问题。
在Microsoft SQL Server 2008系统中,使用CREATE DATABASE语句创建数据库快照。创建数据库快照的基本语法格式如下所示:
CREATEDATABASE database_snapshot_name
ON
(
NAME=logical_file_name,
FILENAME='os_file_name'
)[,…n]
ASSNAPSHOT OF source_database_name
在上述语法中,database_snapshot_name参数是将要创建的数据库快照的名称,该名称必须符合数据库名称的标识符规范,并且在数据库名称中是惟一的。数据库快照的稀疏文件由NAME和FILENAME两个关键字来指定。AS SNAPSHOT OF子句用于指定该数据库快照的源数据库名称。
下面来对【图书管理系统(BookDateBase)】数据库创建一个名称“BookDAteBase_snapshot”的数据库快照。代码如下所示:
CREATEDATABASE BookDateBase_snapshot
ON
(
NAME=BookDateBase_DAT,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章管理数据库 代码\BookDateBase_snapshot.snp'
),
(
NAME=BookDateBase_DAT1,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\章 管理数据库 代码\BookDateBase_snapshot1.snp'
),
(
NAME=BookDateBase_DAT2,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\章 管理数据库 代码\BookDateBase_snapshot2.snp'
),
(
NAME=BookDateBase_DAT3,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章管理数据库 代码\BookDateBase_snapshot3.snp'
)
ASSNAPSHOT OF BookDateBAse
上述代码语句中,为【图书管理系统(BookDateBase)】数据库中的数据文件创建数据库快照,在创建数据库快照时,必须对每个数据文件建立快照,否则将提示缺少某个数据文件的快照。语句执行结果如图2-19所示。
图2-19 创建数据库快照
如图3-21所示,创建快照后在【对象资源管理器】窗格的【数据库快照】节点下即可看到刚创建的【BookDateBase_snapshot】数据库快照,展开后可以看到其内容与源数据库完全相同。数据库快照的扩展名为.snp。 |
虽然数据库快照和源数据库的内容完全相同,但他与源数据库相比,数据库快照还是存在着一些限制:
l 必须在与源数据库相同的服务器实例上创建数据库快照。
l 数据库快照捕获开始创建快照的时间点,去掉所有未提交的事务。未提交的事务将在创建数据库快照期间回滚。
l 数据库快照为只读的,不能在数据库中执行修改操作。
l 禁止对model数据库、master数据库和tempdb数据库创建快照。
l 不能从数据库快照中删除文件。
l 不能备份或还原数据库快照。
l 不能附加或分离数据库快照。
l 不能在FAT32文件系统或RAW分区中创建快照。数据库快照所用的稀疏文件由NTFS文件系统提供。
l 数据库快照不支持全文索引,不能从源数据库传播全文目录。
l 数据库快照将继承快照创建时其源数据库的安全约束。由于快照是只读的,因此无法更改继承的权限,对源数据库的更改权限将不反映在现有快照中。
l 快照始终反映创建该快照时的文件组状态,即在线文件组将保持在线状态,离线文件组将保持离线状态。
l 只读文件组和压缩文件组不支持恢复。尝试恢复到这两类文件组将失败。
当源数据库发生损坏或出错时,就可以通过数据库快照来将数据库恢复到创建数据库快照时的状态。此时恢复的数据库会覆盖原来的数据库。执行恢复操作要求对源数据库具有RESTORE DATABASE权限,恢复时的语法格式如下所示:
RESTOREDATABASE database_name FROM DATABASE_SNAPSHOT=database_snapshot_name
代码中,database_name是源数据库的名称,database_snapshot_name是对应源数据库的快照名称。例如,要将【BookDateBase_snapshot】数据库快照恢复到【图书管理系统(BookDateBase)】数据库中,其语句如下所示:
RESTOREDATABASE BookDateBase from DATABASE_SNAPSHOT=' BookDateBase_snapshot '
GO
使用上述命令时,会话中不能使用当前要恢复的数据库,否则会出错,建议在执行时使用master 数据库。也可以在工具栏上的【可用数据库】下拉框( |
接下来来介绍一下如何删除数据库快照,删除数据库快照的方法和其实和删除数据库的方法完全相同,也是使用DROP DATABASE语句。同样,不能删除当前正在使用的数据库快照。下面是删除【BookDateBase_snapshot】数据库快照的语句代码:
DROPDATABASE BookDateBase_snapshot
GO
扩展练习2-1:附加数据库
如果用户从外部获得一个SQL Server数据库,并需要将该数据库添加到现在的服务器上,然后对其进行各种操作。
(1)从【开始】菜单上选择【程序】|Microsoft SQL Server 2008 R2 | SQLServer Management Studio,打开SQL Server Management Studio,打开连接服务器窗口,登录服务器类型为“数据库引擎”,并使用Windows或SQL Server 身份验证建立连接,如图2-20所示。
图2-20 【连接到服务器】窗口
(2)连接服务器,选中【数据库】节点并右击,从弹出的快捷菜单中选择【附加】命令,找开【附加服务器】窗口。
(3)单击窗口中的【添加】按钮,在弹出的【定位数据库文件】窗口中选择要附加的数据库文件,如图2-21所示。
图2-21 【定位数据库文件】
(4)选中要附加的数据库文件,单击【确定】按钮,返回【附加数据库】窗口,如图2-22所示。
图2-22 【附加数据库】窗口
(5)另外,还可以通过【添加】按钮同时附加多个数据库。全部添加完毕后,单击【确定】按钮
(6)在【对象资源管理器】窗口中,右击【数据库】节点,然后从快捷菜单中选择【刷新】命令,就可以看到附加的数据库存在于列表中了。
(7)选中附加的数据库,通过展开数据库下的节点可以查看数据库中的关系图、表、视图等数据库对象。右击该数据库,从快捷菜单中选择【属性】命令,在弹出的【数据库属性】
扩展练习2-1:附加数据库
当有些数据库不再被使用时,可以对其进行分离操作。分离后的数据库依然存储在其物理目录下,用户还可以重新附加并使用。
(1)从【开始】菜单上选择【程序】|Microsoft SQL Server 2008 R2 | SQLServer Management Studio,打开SQL Server Management Studio,打开连接服务器窗口,登录服务器类型为“数据库引擎”,并使用Windows或SQL Server 身份验证建立连接。
(2)在保证该数据库与服务器无连接的前提下,选中要分离的数据库并右击,在弹出的快捷菜单中选择【任务】|【分离】命令,随后打开【分离数据库】窗口。
(3)在【分离数据库】窗口中,启用【删除连接】和【更新统计信息】两列选项,单击【确定】按钮即可实现数据库的分离,如图2-23所示。
图2-23 【分离数据库】窗口