第5章 数据库管理
本章包括
◆ 创建数据库前的准备
◆ 修改数据库设置
◆ 让数据库脱机与联机
◆ 编写数据库脚本
◆ 创建与删除数据库的方法
◆ 分离与附加数据库
◆ 收缩数据库
数据库是计算机应用系统中的一种专门管理数据资源的系统。简单地说,数据库就是一组经过计算机整理的数据,存储在一个或多个文件中。SQL Server 2008服务器中的数据库使用自己的文件来储存数据。在SQL Server 2008中,一个数据库至少包含两个文件:一个是用来储存数据的文件,包含数据和对象,例如表、索引、存储过程和视图等,称为数据文件,扩展名是mdf;另一个是用来储存日志的文件,包含恢复数据时所有事务所需的信息,称为日志文件,扩展名是ldf。为了便于分配和管理,可以将数据文件集合起来,放在一个文件组中。
在SQL Server 2008中,一个数据库实例可以支持最多32767个数据库,而且每个数据库都可以用来存储与其他数据库相关或完全不相关的数据。由于数据库在操作系统里的表现是两个或两个以上的文件,所以“创建数据库”实际上就是为数据库创建数据文件和日志文件,以及对这两个文件的一些属性进行设置。
5.1 创建数据库前的准备
SQL Server 2008可以帮助用户轻松地创建数据库,在创建数据库之前,有几件事情需要先弄清楚。
5.1.1 数据库命名规则
在SQL Server中创建数据库时,数据库的命名规则取决于数据库兼容的级别。兼容级别可以为60,65,70,80或90。一般来说,SQL Server 7.0使用的是70级别,SQL Server 2000使用的是80级别,SQL Server 2005使用的是90级别,SQL Server 2008使用的是100级别。数据库级别可以用存储过程sp_dbcmptlevel来修改。当兼容级别为100时,数据库的命名规则为:
◆ 名称长度不能超过128个字符,本地临时表的名称不能超过116个字符。
◆ 名称的第1个字符必须是英文字母、中文(或其他语言的字母)、下画线、“@”或“#”符号。
◆ 除第1个字符之外的其他字符,还可以包括数字和“$”符号。
◆ 名称中间不允许有空格或其他特殊字符。
◆ 名称不能是保留字。
注意 由于在T-SQL中,“@”表示局部变量,“@@”表示全局变量,“##”表示全局临时对象,所以不建议用这些符号作为数据库名称的开头。虽然在SQL Server 2008中,保留字区分大小写,但不建议用改过大小写的保留字来作为数据库名。
5.1.2 创建数据库需要的权限
要想创建数据库,至少要拥有Create database,Create any database或Alter any database权限。
5.1.3 数据库的所有者
创建数据库的用户将成为该数据库的所有者。任何可以访问SQL Server连接的用户(SQL Server登录账户或Windows用户)都可成为数据库的所有者。
5.1.4 数据库的上限
在同一个实例中,最多可以创建32767个数据库,超过这个数量的数据库创建操作将会失败。
5.1.5 数据库文件和文件组
每个SQL Server 2008数据库至少包含两个文件:一个数据文件和一个日志文件。数据文件里包含的是数据库的数据和对象,例如表、视图和索引等;日志文件里包含的是用于恢复数据库所需的信息。
事实上,SQL Server 2008数据库的数据文件可以分为主要数据文件和次要数据文件两种。主要数据文件的扩展名为mdf,它包含数据库的启动信息,每个数据库必须有一个主要数据文件。次要数据文件是可选的,一般由用户自定义,扩展名一般为ndf。用户数据和对象可以存储在主要数据文件和次要数据文件中。使用次要数据文件可以将数据分散在多个磁盘上以提高读取速度。如果数据库很大,大到单个数据文件大小超过单个Windows文件的最大限制时,就必须使用次要数据文件,以便允许数据库继续增长。
数据库日志文件的扩展名为ldf,每个数据库至少有一个日志文件。日志文件也分主要日志文件和次要日志文件,但每个日志文件的扩展名都为ldf。
技巧 在默认情况下,数据库的数据文件和日志文件都保存在同一个目录下,但这并不是最佳的方案,为了提高存储速度,建议将数据文件和日志文件保存在不同的驱动器上。
为了方便对数据库文件进行管理,可以将数据库文件集中起来放在文件组中。每个数据库都有一个主要文件组。该文件组包含主要数据文件和未放入其他文件组的所有次要文件。用户也可以自定义不同的文件组。
5.1.6 记录数据库操作的事务日志
事务日志用于记录对数据库操作的所有事务以及每个事务对数据库所做的修改,一旦数据库系统出现故障,事务日志是恢复数据的唯一源泉。
5.1.7 数据库状态
SQL Server 2008的数据库永远处于一个特定的状态中,这些状态包括ONLINE(在线)、OFFLINE(离线)、RESTORING(还原)、RECOVERING(恢复)、RECOVERY PENDING(恢复待定)、SUSPECT(可疑)和EMERGENCY(紧急)7种。
◆ 数据库处于ONLINE状态时,可以对数据进行访问。
◆ 数据库处于OFFLINE状态时,数据库无法使用。
◆ 数据库处于RESTORING状态时,表示正在还原主文件组的一个或多个文件,或正在离线还原一个或多个辅助文件,此时数据库不可用。
◆ 数据库处于RECOVERING状态时,表示正在恢复数据库。该状态是个暂时性的状态,恢复成功后,数据库会自动回到在线状态。
◆ 一般来说,SQL Server在恢复过程中遇到了与资源相关的错误时才会产生RECOVERY PENDING状态,此时数据库并未损坏,但很有可能缺少文件。此时数据库不可用,并等待用户执行操作来完成恢复工作。
◆ 数据库处于SUSPECT状态时,表示数据库里的文件组(至少是主文件组)可疑或已经损坏,SQL Server 2008启动过程无法恢复数据库,此时数据不能使用。
◆ 数据库处于EMERGENCY状态时,一般用于故障排除。此时数据库处于单用户模式,可以修复或还原。数据库标记为只读,并禁用日志记录,只有具备sysadmin服务器角色的成员才能访问。
5.2 在SQL Server Management Studio中创建数据库
在SQL Server Management Studio中创建数据库的步骤如下。
step 1 启动SQL Server Management Studio,在【对象资源管理器】窗格中选择【数据库实例】→【数据库】选项,并右击【数据库】选项,在弹出的快捷菜单里选择【新建数据库】选项。
step 2 打开【新建数据库】对话框的【常规】选项页,如图5.1所示,有以下几个可选项。
图5.1 【常规】选项页
◆ 【数据库名称】文本框:本例中输入“test”作为数据库名。
◆ 【所有者】文本框:可以通过列表来选择和指定数据库的所有者,所有者是对该数据库具有完全操作权限的用户。所有者默认为创建该数据库的用户。
◆ 【使用全文索引】复选框:是否创建全文索引。
◆ 【数据库文件】列表框:在输入数据库名称时,在此处就已经自动输入了两个文件名,如图5.1所示。数据文件的文件名和数据库文件名相同,都是“test”,如果加上扩展名就是“test.mdf”;而日志文件名为“test_log”,如果加上扩展名就是“test_log.ldf”。如果对这两个文件的文件名不满意,可以在【逻辑名称】栏中修改。单击【添加】按钮可以添加数据文件和日志文件。
◆ 【文件组】栏:在该栏中可以选择数据库文件所属的文件组。在本例中,test.mdf属于这个主要文件组,它不能被修改。可以在添加数据库文件的同时新建文件组,也可以在【文件组】选项页中创建新的文件组。
◆ 【初始大小】栏:在该栏中可以修改文件的初始大小,单位为MB。默认情况下,数据文件的初始大小为3MB,日志文件的初始大小为1MB。
◆ 【自动增长】栏:在该栏中可以看到数据库文件的自动增长属性。单击后面的【…】按钮,弹出如图5.2所示的对话框。在该对话框中,可以启用或禁止自动增长,如果禁止自动增长,数据库文件为固定大小;可以设置增长的方式,设置一次增长多少MB,或者增长的百分比;还可以限制最大文件大小,例如设置文件增长的上限,或者不限制增长的上限。
图5.2 设置自动增长的属性
技巧 设置为数据库文件的大小自动增长虽然很省事,但是由于不定时地增长,会让增长后的文件在磁盘中不连续存放,从而降低数据库的工作效率。另外,如果数据库所需要的空间比较大,而增长属性设置得太小,会造成数据库频繁增长,这样也会影响数据库的工作效率。但也不宜将数据库文件设置得过大,以免造成磁盘空间浪费。
◆ 【路径】栏:可以设置文件的存放位置。
◆ 【文件名】栏:显示文件的完整名称,包括文件名和扩展名。该栏内容要在创建完数据库后,查看数据库属性时才能看到。
step 3 切换到【新建数据库】对话框的【选项】选项页,如图5.3所示。在此可以配置的参数很多,下面介绍其中的一部分。
图5.3 【选项】选项页
◆ 【排序规则】下拉列表框:在此列表框中可以选择数据库的排序规则。
◆ 【恢复模式】下拉列表框:在此列表框中可以选择数据库的恢复模式。一共有三种恢复模式。完整恢复,是将整个数据库恢复到一个特定的时间点。这个时间点可以是最近一次可用的备份、一个特定的日期和时间,或标记的事务。大容量日志,是对完整恢复模式的补充。它只对大容量操作进行最小记录,在保护大容量操作不受媒体故障的危害下,提供最佳性能并占用最小日志空间。例如,一次在数据库中插入数十万条记录时,按正常的办法是每一个插入记录的动作都会记录在日志中,那么数十万条记录将会使日志文件变得非常大。在大容量日志模式下,只记录必要的操作,不记录所有日志,这么一来,可以大大提高数据的性能,但是由于日志不完整,一旦出现问题,数据将有可能无法恢复。简单恢复,在此模式下,每个数据备份后事务日志将自动截断。换句话说,就是把不活动的日志删除。此模式简化了备份的还原,但是因为没有事务日志备份,所以不能恢复到失败的时间点。
◆ 【兼容级别】下拉列表框:该列表框用于设置与指定数据库所支持的SQL Server早期版本。
◆ 【页验证】选项:指定的选项用于发现和报告由磁盘I/O错误导致的不完整I/O事务,一共有三个选项。Checksum,检验和,该项是让SQL Server在将数据写入磁盘时,计算整个页的内容,产生一个检验和,并写入页的头部。在读取该页数据时,SQL Server将重新计算该页的检验和,并和页头部的检验和比较,以确保数据没有出错。TornPageDetection,分割页检验。SQL Server的存储页的大小为8KB,如果一条记录的大小大于8KB,SQL Server将自动再分配新页,直到完全写入数据为止,这就叫做“分割页”。选用该项,也就是让SQL Server验证是否有分割页存在。None,该项指定SQL Server不进行检测。
◆ 【默认游标】选项:设置默认游标的类型是全局游标还是本地游标。
◆ 【提交时关闭游标功能已启用】选项:该项用来指定在提交了打开游标的事务之后是否关闭游标。如果设置为True,则会关闭在提交或回滚事务时打开的游标。如果设置为False,则这些游标在提交事务时保持打开状态。
◆ 【ANSI NULL默认值】选项:指定与Null一起使用等于或不等于两种比较运算符的默认行为。如果设置为True,任何数与Null的比较都会返回Unknown,例如“select* table1 where abc=null”与“select * table1 where abc<>null”返回结果都是一样的,都会返回零条记录;如果设置为False,两个非空的值比较会返回真,例如“select* table1 where abc=null”就会返回所有abc字段为空的记录。
◆ 【ANSI NULLS已启用】选项:设置是否启用ANSI NULL。
◆ 【ANSI警告已启用】选项:设置是否启用ANSI警告。如果设置为True,在聚合函数(例如SUM, AVG, MIN和COUNT等)中出现空值时生成一条警告消息;如果设置为False,则不发出任何警告。
◆ 【ANSI填充已启用】选项:设置ANSI填充状态是开还是关。例如,一个字段设置的类型为char(10),如果在这个字段列里只插入两个字符,系统自动在这个字符的后面加上8个空格,这种行为就是ANSI填充。进行填充时,char列用空格填充,binary列用0填充。
◆ 【参数化】选项:在SQL Server 2008中,在T-SQL语句中使用参数或参数标志可以提高关系引擎将新的SQL语句与现有的、以前编译的执行计划相匹配的能力。可选项为【简单】和【强制】两种。设置为简单参数化,如果执行不带参数的T-SQL语句,SQL Server 2008将在内部对该语句进行参数化,以增加将其与现在执行计划相匹配的可能性。设置为强制参数化,数据库中的所有Select, Insert, Update和Delete语句将被参数化。如果设置为【简单】,则基于数据库的默认行为使查询参数化;如果设置为【强制】,则SQL Server使数据库中的所有查询参数化。
◆ 【串联的Null结果为Null】选项:该项指定在与空值连接时返回的值。如果设置为True,字符串与Null相连时返回Null;如果设置为False,字符串与Null相连时还是返回该字符串。
◆ 【递归触发器已启用】选项:指定触发器是否可以由其他触发器激活。如果设置为True,启用对触发器的递归激活;如果设置为False,禁止直接递归。
◆ 【日期相关性优化已启用】选项:如果设置为True,则SQL Server维护数据库中由FOREIGN KEY约束所链接并包含datetime列的任意两个表之间的相关统计信息。如果设置为False,则不维护相关统计信息。
◆ 【数值舍入中止】选项:该项用于设置数据库处理舍入错误的方式。如果设置为True,当表达式出现精度降低的情况时会出现错误;如果设置为False,在发生精度降低的时候不出现错误,并按存储结果的列或变量的精度对结果进行四舍五入。
◆ 【算术中止已启用】选项:该项指定是否启用数据库中的算术中止。如果该值设置为True,当出现溢出错误或被0除错误时,会导致查询或批处理终止,但如果错误发生在事务内,则回滚事务。如果该值设置为False,出错时会显示一条警告消息,但还是会继续执行查询、批处理或事务。
◆ 【允许带引号的标识符】选项:该项用来指定是否可以将SQL Server的关键字作为标识符来用。当设置为True时,可以将关键字作为标识符来使用,但必须要用引号引起来。如果设置为False,则不能将关键字作为标识符来使用。
◆ 【数据库只读】选项:该项用来指定数据库是否是只读的,如果设置为True,用户只能读取数据库中的数据,不能对数据库中的数据和对象进行修改。
◆ 【限制访问】选项:该项用来指定哪些用户可以访问该数据库。设置为Multiple时,允许多个用户同时访问;设置为Single时,一次只能有一个用户访问数据库,一般用于维护操作;设置为Restricted时,只有db_owner, dbcreator或sysadmin角色的成员才能使用数据库。
◆ 【自动创建统计信息】选项:该项用于指定数据库是否自动创建缺少的优化统计信息。如果设置为True,则将在优化过程中自动生成优化查询所需要但是缺少的所有统计信息;如果设置为False,则不生成这些统计信息。
◆ 【自动更新统计信息】选项:该项用于指定数据库是否自动更新过期的统计信息。如果设置为True,则将在优化过程自动生成优化查询所需要的但已过期的所有统计信息;如果设置为False,则不生成这些统计信息。
◆ 【自动关闭】选项:该项用于指定在最后一个用户退出后,数据库是否完全关闭并释放资源。
◆ 【自动收缩】选项:该项用于指定数据库文件是否定期收缩。
◆ 【自动异步更新统计信息】选项:如果设置为True,则启动过期统计信息的自动更新查询在编译前不会等待统计信息被更新,后续查询将使用可用的已更新统计信息。如果设置为False,启动过期统计信息的自动更新查询将等待,直到更新的统计信息可在查询优化计划中使用。将该选项设置为True不会产生任何影响,除非【自动更新统计信息】选项也设置为True。
注意 当数据库操作者使用T-SQL语句对数据库进行操作时,数据库会自动对SQL语句进行优化,以便得到比较好的执行性能和效果。在优化的时候,数据库依据的就是数据库的统计信息。所以,如果没有统计信息或统计信息没能及时更新,将会影响SQL Server对SQL语句的优化效果。
step 4 切换到【新建数据库】对话框的【文件组】选项页,如图5.4所示,该选项页的主要作用是添加文件组。单击【添加】按钮,就可以添加一个文件组,图5.4中的files文件组就是新添加的文件组。
图5.4 新添加的文件组
step 5 在新添加了文件组之后,返回到【新建数据库】对话框的【常规】选项页,如果再添加一个文件,就可以通过【文件组】下拉列表框选择所属的文件组了,如图5.5所示。所有设置完毕后,单击【确定】按钮,创建新的新数据库。
图5.5 通过【文件组】下拉列表框选择所属的文件组
数据库创建完毕后,可通过SQL Server Management Studio进行查看。
说明 虽然新创建的数据库里可以选择的参数设置很多,但是如果没有特殊的要求,使用SQL Server 2008默认的设置就行了。这样,创建数据库的方法就很简单了,一共只要三步。第一步,打开SQL Server Management Studio,在要创建数据库的实例树下右击【数据库】选项,在弹出的快捷菜单里选择【新建数据库】选项。第二步,在打开的对话框里输入数据库名称。第三步,单击【确定】按钮。
5.3 使用Create database语句创建数据库
使用Create database语句可以创建数据库,其创建效果同使用SQL Server Management Studio创建的数据库一样,但该语句包含很多参数。本节就来学习使用Create database语句创建数据库,并学习语句中包含的常用参数。
5.3.1 基本语法
先从简单的入手,在SQL Server Management Studio里,打开查询编辑器窗格,输入“create database测试用数据库”语句。然后单击【执行】按钮,运行效果如图5.6所示,此条语句建立一个名为“测试用数据库”的数据库。
图5.6 用T-SQL语句创建数据库
由于创建数据库后,【对象资源管理器】窗格不会自动刷新,所以必须手动刷新后,才可以看到已经创建好的数据库。上面示例使用的是Create database语句最简单的用法,所有设置都使用的是默认值。完整的Create database语句如下:
CREATE DATABASE database_name --设置新建数据库的名称 [ ON --设置新建数据库的数据文件 [ PRIMARY ] [ <filespec> [ , ...n ] --设置文件 [ , <filegroup> [ , ...n ] ] --设置文件组 [ LOG ON { <filespec> [ , ...n ] } ] --设置新建数据库的日志文件 ] [ COLLATE collation_name ] --设置数据库的排序规则名称 [ WITH <external_access_option> ] --设置外部与数据库之间的双向访问 ] [; ] To attach a database --附加数据库的语法 CREATE DATABASE database_name ON <filespec> [ , ...n ] --指定附加的文件 FOR { ATTACH [ WITH <service_broker_option> ] | ATTACH_REBUILD_LOG } --指定附加的文件,只限于读/写数据库 [; ] <filespec> ::= --<filespec>的语法内容 { ( 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 | GB | TB | % ] ] ) [ , ...n ] } <filegroup> ::= --< filegroup>的语法内容 { FILEGROUP filegroup_name [ DEFAULT ] <filespec> [ , ...n ] } <external_access_option> ::= --< external_access_option>的语法内容 { DB_CHAINING { ON | OFF } | TRUSTWORTHY { ON | OFF } } <service_broker_option> ::= --< service_broker_option >的语法内容 { ENABLE_BROKER | NEW_BROKER | ERROR_BROKER_CONVERSATIONS }
5.3.2 T-SQL中的语法约定
相信第一次看到以上代码的读者都会感觉有点不明白,下面简单介绍T-SQL的语法约定。知道了语法约定之后,再仔细看看代码,就会发现它们并没有想象中那么可怕。
◆ 文字大写:说明该文字是T-SQL的关键字。例如上述代码中的“CREATE DATABASE database_name”,其中的“CREATE DATABASE”就是关键字。
◆ 文字小写或斜体:说明该文字是用户提供的T-SQL语法参数。
◆ 文字粗体:说明该文字是数据库名、表名、列名、索引名、存储过程、实用工具、数据类型名以及必须按所显示的原样键入的文本。
◆ 下画线(_):指示当语句中省略了包含带下画线的值的子句时应用的默认值。例如上述代码中的“[ , SIZE=size [ KB | MB | GB | TB ] ]”,说明SIZE的单位默认是MB。
◆ 竖线(|):分隔括号或大括号中的语法项,只能选择其中一项。例如上述代码中的“[ , SIZE=size [ KB | MB | GB | TB ] ]”,说明KB, MB, GB和TB是可选的单位,但只能选其中的一项。
◆ 方括号([ ]):可选语法项,使用时不要键入方括号。还是以“[ , SIZE=size [ KB | MB | GB| TB ] ]”为例,说明SIZE是可选项,如果不写这一项,就使用默认的参数。
◆ 大括号({ }):必选语法项,使用时不要键入大括号。例如上述代码中的“LOG ON{ <filespec> [ , ...n ] }”,说明要用LOG ON设置日志文件,一定要输入文件名。
◆ [, ...n]:指示前面的项可以重复n次,每一项由逗号分隔。例如上述代码中的“LOG ON{ <filespec> [ , ...n ] }”,说明日志文件可以是多个,每个之间用逗号隔开。
◆ [...n]:与上面类似,用来指示前面的项可以重复n次,每一项由空格分隔。
◆ [; ]:可选的T-SQL语句终止符。使用时不要输入方括号。
◆ <label> ::=:语法块的名称。此约定用于对可在语句中的多个位置使用的过长语法段或语法单元进行分组和标记。可使用的语法块的每个位置由括在尖括号内的标签指示。
5.3.3 参数讲解
知道了T-SQL的语法约定后,下面对Create database语句的参数进行讲解。
◆ database_name:数据库名,这个数据库名在当前实例中必须唯一。
◆ ON:用来定义数据库的数据文件。PRIMARY指出其后所定义的文件是主数据文件,如果省略,则第一个定义的文件是主数据文件。<filespec>定义的是文件名,具体的写法在“<filespec> ::=”块里定义。<filegroup>定义的是文件组。
◆ LOG ON:用来定义数据库的日志文件。如果没有指定LOG ON, SQL Server将自动创建一个日志文件,其大小为该数据库的所有数据文件大小总和的25%或512KB,取两者之中的较大者。
注意 不能对数据库快照指定LOG ON。
◆ COLLATE:用来定义数据库的默认排序规则。如果没有指定排序规则,则以SQL Server实例的默认排序规则作为该数据库的排序规则。
注意 不能对数据库快照指定排序规则名称。
◆ WITH:用来控制外部与数据库之间的双向访问。
◆ FOR ATTACH:用来设置附加数据库的选项,必须指定一个主文件的<filespec>项。至于其他<filespec>项,只需要指定与第一次创建数据库或上一次附加数据库时路径不同的文件的那些项即可。必须有一个<filespec>项指定这些文件。
注意 此项要求所有的文件都可用,包括数据文件、日志文件和自定义的文件。
◆ ATTACH_REBUILD_LOG:用来设置附加数据库的选项。该选项只限于读/写数据库。如果缺少一个或多个事务日志文件,将重新生成日志文件。必须有一个指定主文件的<filespec>项。
◆ <filespec>块:用来指定文件格式。
说明 如果该项值为0,表示不允许增加空间。
◆ <filegroup>块:用来控制文件组。FILEGROUP filegroup_name表示文件组的逻辑名。DEFAULT指定文件组为数据库中的默认文件组。
◆ <external_access_option>块:用来控制外部与数据库之间的双向访问。
◆ <service_broker_option>块:用来控制数据库上的Service Broker选项(只有在附加数据库时才使用这个块)。
5.3.4 Create database语句需要注意的功能
在SQL Server 2008中,创建数据库的语句有一些值得注意的功能:
◆ ATTACH_REBUILD_LOG子句用于附加数据库。
◆ DB_CHAINING选项用于指定数据库是否可以为跨数据库所有权链的源或目标。
◆ Service Broker选项用于控制数据库上的Service Broker选项。
◆ TRUSTWORTHY选项用于设置外部与数据库之间的双向访问。
◆ 数据文件的FILEGROWTH默认增量为1MB。
◆ 创建完数据库后立即进行文件初始化。
5.3.5 举例说明
上面的代码和参数讲解可能有些枯燥,其实在实际运用过程中,并不需要记住上述所有的代码,只要多动手就清楚了。下面举几个例子。在创建数据库之前,先在D盘根目录里创建一个名为“DBtest”的文件夹,下面示例里的数据库文件将都放在这个文件夹里。
例一:创建一个数据库,所有的设置都采用默认值。
CREATE DATABASE测试数据库
注意 所有设置都采用默认值,数据库文件会存放在图4.46所示的【数据库默认位置】选项所指定的路径。
例二:创建一个数据库,指定数据库的数据文件所在位置。
CREATE DATABASE例二数据库 ON ( NAME=’例二数据库’, FILENAME=' D:\DBtest\例二数据库.mdf' )
说明 创建完数据库之后,可以在D:\DBtest下看到“例二数据库.mdf”和“例二数据库_log.LDF”两个文件。
例三:创建一个数据库,指定数据库的数据文件所在位置、初始容量、最大容量和文件增长的数量。
CREATE DATABASE例三数据库 ON ( NAME=’例三数据库’, FILENAME=' D:\DBtest\例三数据库.mdf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% )
例四:创建一个数据库,指定数据库的数据文件和日志文件所在位置。
CREATE DATABASE例四数据库 ON ( NAME=’例四数据库数据文件’, FILENAME=' D:\DBtest\例四数据库数据文件.mdf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ) LOG ON ( NAME=’例四数据库日志文件’, FILENAME=' D:\DBtest\例四数据库日志文件.ldf' )
说明 创建完数据库后,可以在D:\DBtest下看到“例四数据库数据文件.mdf”和“例四数据库日志文件.LDF”两个文件。逻辑文件名可以和物理文件名不同,例四中的代码也可以改为下面这样。
CREATE DATABASE例四数据库 ON ( NAME=’例四数据库逻辑数据文件’, FILENAME=' D:\DBtest\例四数据库数据文件.mdf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ) LOG ON ( NAME=’例四数据库逻辑日志文件’, FILENAME=' D:\DBtest\例四数据库日志文件.ldf' )
例五:创建一个数据库,它总共包含五个数据文件和两个自定义的文件组。
CREATE DATABASE例五数据库 ON ( NAME=’例五数据库数据文件1' , FILENAME=' D:\DBtest\例五数据库数据文件1.mdf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ), ( NAME=’例五数据库数据文件2' , FILENAME=' D:\DBtest\例五数据库数据文件2.ndf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ), FILEGROUP例五数据库数据文件组1 ( NAME=’例五数据库数据文件组1的数据文件’, FILENAME=' D:\DBtest\例五数据库数据文件组1的数据文件.ndf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ), FILEGROUP例五数据库数据文件组2 ( NAME=’例五数据库数据文件组2的数据文件1' , FILENAME=' D:\DBtest\例五数据库数据文件组2的数据文件1.ndf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ), ( NAME=’例五数据库数据文件组2的数据文件2' , FILENAME=' D:\DBtest\例五数据库数据文件组2的数据文件2.ndf' , SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ) LOG ON ( NAME=’例五数据库日志’, FILENAME=' D:\DBtest\例五数据库日志文件.ldf' )
说明 一般来说,主要数据文件的扩展名为mdf,次要数据文件的扩展名为ndf,日志文件的扩展名为ldf,但是SQL Server 2008并不对扩展名进行强制要求。
例六:创建一个数据库,并指定排序规则。
CREATE DATABASE例六数据库 ON ( NAME=’例六数据库’, FILENAME=' D:\DBtest\例六数据库.mdf' ) COLLATE Chinese_PRC_CI_AS
在使用COLLATE指定排序规则之前,一定要先知道排序规则名。要知道排序规则名,可以用以下的SQL语句查询到。
select * from ::fn_helpcollations ()
5.3.6 使用模板
使用模板建立数据库,在本书的3.3.7节中已经介绍过一次,下次再详细介绍一下使用模板建立数据库的方法:
step 1 启动SQL Server Management Studio,在菜单栏上选择【视图】→【模板资源管理器】选项,调出【模板资源管理器】窗格,如图5.7所示。
图5.7 【模板资源管理器】窗格
step 2 在【模板资源管理器】窗格里选择【SQL Server模板】→【Database】选项,可以看到,SQL Server 2008提供了多个不同的数据库创建模板。
step 3 双击【Create Database】选项,打开图5.8所示的查询编辑器窗格,此时系统已自动写入了创建数据库的代码。
图5.8 Create database模板的代码
step 4 在菜单栏上选择【查询】→【指定模板参数的值】选项,打开图5.9所示的【指定模板参数的值】对话框。在【值】栏中输入数据库名后,单击【确定】按钮。
图5.9 【指定模板参数的值】对话框
step 5 返回查询编辑器窗格,如图5.10所示,系统自动将数据库名称替换新设置的参数。
图5.10 替换参数后的代码
step 6 单击【执行】按钮,即可创建新的数据库。从图5.10所示的窗格中可以看到,使用模板创建数据库,不单单是一个“CREATE DATABASE”语句,还包括其他语句,其完整的代码如下。
--============================================= -- Create database template --============================================= USE master GO -- Drop the database if it already exists IF EXISTS ( SELECT name FROM sys.databases WHERE name=N’测试用数据库’ ) DROP DATABASE测试用数据库 GO CREATE DATABASE测试用数据库 GO
下面学习SQL Server 2008模板的代码。
模板代码里有很多“--”开头的语句。在T-SQL里,“--”开头的语句是注释,SQL Server 2008并不会去执行这些代码。一段良好的T-SQL代码中应该有丰富的注释。
在代码里用USE指定在哪个数据库里使用,这是很多数据库管理员都没有的习惯,如果不指定在哪个数据库里使用,很容易由于疏忽将T-SQL代码用在其他数据库里了。
在创建新数据库之前,先判断是否有同名的数据库存在,如果存在,先把它删除,然后再创建新的数据库。这种思维方式很严谨,如果不这样做,当存在同名数据库时,执行T-SQL代码将会报错。当然,也可以将其改为:先判断是否存在同名的数据库,如果存在,跳过创建新数据库这一步。
如果感觉使用Create database模板创建数据库比较简单,没有什么参数可选择,可以使用Create database on multiple filegroups模板,该模板的代码如下。
--============================================= -- Create database on mulitple filegroups --============================================= IF EXISTS ( SELECT * FROM sys.databases WHERE name=N' <database_name, sysname, sample_database>' ) DROP DATABASE <database_name, sysname, sample_database> GO CREATE DATABASE <database_name, sysname, sample_database> ON PRIMARY (NAME=<logical_filename1, , sample_database_file1>, FILENAME=N' <data_filename1, , C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Datasample_database_1.mdf>' , SIZE=10MB, MAXSIZE=50MB, FILEGROWTH=10%), ( NAME=<logical_filename2, , sample_database_file2>, FILENAME=N' <data_filename2, , C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Datasample_database_2.ndf>' , SIZE=10MB, MAXSIZE=50MB, FILEGROWTH=10%), FILEGROUP <filegroup_1, , sample_database_filegroup1> ( NAME=<logical_filename3, , sample_database_file3>, FILENAME=N' <data_filename3, , C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Datasample_database_3.ndf>' , SIZE=10MB, MAXSIZE=50MB, FILEGROWTH=10%), ( NAME=<logical_filename4, , sample_database_file4>, FILENAME=N' <data_filename4, , C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Datasample_database_4.ndf>' , SIZE=10MB, MAXSIZE=50MB, FILEGROWTH=10%), FILEGROUP <filegroup2, , sample_database_group_2> ( NAME=<logical_filename5, , sample_database_file5>, FILENAME=N' <data_filename5, , C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Datasample_database_5.ndf>' , SIZE=10MB, MAXSIZE=50MB, FILEGROWTH=10%) LOG ON ( NAME=<logical_log_filename1, , sample_database_log_file1>, FILENAME=N' <log_filename1, , C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Datasample_database_1.ldf>' , SIZE=10MB, MAXSIZE=50MB, FILEGROWTH=10%), ( NAME=<logical_log_filename2, , sample_database_log_file2>, FILENAME=N' <log_filename2, , C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Datasample_database_2.ldf>' , SIZE=5MB, MAXSIZE=25MB, FILEGROWTH=5MB) GO
具体用法这里就不详细介绍了,至于其他创建数据库的模板,读者可以自行研究。
5.4 修改数据库设置
在数据库创建完毕之后,有可能因为种种原因(例如创建时的设置不合理等),需要修改数据库的设置,下面介绍如何修改数据库设置。
5.4.1 使用SQL Server Management Studio修改数据库设置
在SQL Server Management Studio中修改数据库设置的方法如下:
step 1 启动SQL Server Management Studio,连接上数据库实例,展开对象资源管理器里的树形目录,定位到要修改的数据库上。
step 2 右击要修改的数据库,本例中要修改的数据库是前面创建的“例二数据库”,在弹出的快捷菜单里选择【属性】选项。
step 3 打开图5.11所示的【数据库属性】对话框的【常规】选项页,这里显示了数据库的基本信息,例如数据库备份信息、数据库的名称、状态和排序规则等,这些信息不允许修改。
图5.11 数据库的基本信息
5.4.2 查看数据库的基本信息
step 4 在【数据库属性】对话框里,还有【文件】、【文件组】、【选项】和【权限】等选项页,其中一些选项参数在创建数据库时已经介绍过了,在这里就不赘述了,本节后面介绍一些常用的数据库设置修改选项。
在【数据库属性】对话框的【常规】选项页里,可以查看数据库的基本信息。
◆ 在【备份】区域里可以查看数据库最后一次执行备份的时间。
◆ 在【数据库】区域里可以查看数据库的名称、状态、所有者、创建数据库的时间、数据库的大小、所有数据文件和日志文件剩余的可用空间大小、连接到数据库的用户数等信息。
◆ 在【维护】区域里可以查看数据库的排序规则。
5.4.3 增加、删除与修改数据库文件
在【数据库属性】对话框的【文件】选项页里,可以修改和新增数据库的数据文件和日志文件。
step 1 打开【数据库属性】对话框,切换到如图5.12所示的【文件】选项页。
图5.12 【文件】选项页
step 2 在【文件】选项页里,可以查看当前已经存在的数据库文件,包括数据文件和日志文件。如果要添加新的数据或日志文件,单击【添加】按钮,列表中会自动多出一行,而且允许输入各栏的属性值。图5.12所示的第3行就是新添加的一个文件。
注意 如果是修改数据库文件属性,不能对文件类型、所属文件组和路径三个属性进行修改。
step 3 如果要设置自动增长的属性,可以单击【自动增长】栏后的【…】按钮,弹出如图5.13所示的对话框。在此对话框中,可以设置是否启用自动增长,如果启用,可以按百分比或按MB来设置文件增长幅度,也可以设置文件的最大限制。
图5.13 设置是否启用自动增长
step 4 如果要设置数据库文件存放的位置,在图5.12所示的【文件】选项页里,单击【路径】栏后的【…】按钮,打开图5.14所示的【定位文件夹】对话框。在该对话框里选择要存放文件的路径,然后单击【确定】按钮。
图5.14 选择存放路径
step 5 要删除数据文件,在图5.12所示的【文件】选项页里,在【数据库文件】列表中选择要删除的文件,再单击【删除】按钮。
注意 主数据文件是不能删除的,日志文件必须要保留一个,当删除到只剩最后一个日志文件时,就不能删除了。
step 6 无论是修改数据库文件还是删除数据库文件,最后都要单击【数据库属性】对话框中的【确定】按钮才能生效。
5.4.4 修改数据库的所有者
在默认情况下,数据库的所有者为数据库的创建者,当然,也可以在创建完数据库后再修改数据库的所有者。
step 1 打开【数据库属性】对话框,然后切换到【文件】选项页,在该选项页里单击【所有者】文本框后面的【…】按钮。
step 2 弹出如图5.15所示的【选择数据库所有者】对话框,单击【浏览】按钮。
图5.15 选择数据库所有者
step 3 弹出如图5.16所示的【查找对象】对话框。在其中选择要更改的数据库所有者,本例选择sa为数据库所有者,然后单击【确定】按钮。
图5.16 查找对象
step 4 返回到【选择数据库所有者】对话框,如图5.17所示。在【输入要选择的对象名称】列表框中已经自动填上名为“sa”的用户,单击【确定】按钮。
图5.17 【选择数据库所有者】对话框
step 5 返回到【数据库属性】对话框,可以看到,【所有者】文本框里自动输入了“sa”。最后单击【确定】按钮完成修改。
5.4.5 设置全文索引
使用全文索引功能可以在字符串数据中进行复杂的词搜索,其搜索效率比T-SQL语句中的Like语句要快得多。在【数据库属性】对话框的【文件】选项页里,可以设置数据库是否使用全文件索引。
step 1 打开【数据库属性】对话框,然后切换到【文件】选项页。
step 2 如果要让数据库使用全文索引,选中【文件】选项页里的【使用全文索引】复选框;如果要禁止数据库使用全文索引,则取消选中此复选框。
step 3 设置完毕后,单击【确定】按钮。
5.4.6 增加、删除与修改文件组
在【数据库属性】对话框的【文件组】选项页里,可以指定默认文件组、添加新文件组、修改现有文件组和删除文件组。
step 1 打开【数据库属性】对话框,切换到如图5.18所示的【文件组】选项页。
图5.18 【文件组】选项页
step 2 在【文件组】选项页里,可以查看已存在的文件组、文件组里所包含的文件数。如果要添加新的文件组,单击【添加】按钮。
step 3 在【名称】栏里输入文件组的名称,可以设置文件组是否为只读。
注意 新建的文件组不能设置为默认文件组,因为它没有包含任何文件。
step 4 修改文件组属性时,只能修改其只读属性或设置为默认值,不能修改其文件名。
注意 PRIMARY文件组不能设置为只读。
step 5 如果要删除文件组,在图5.18所示的【文件组】选项页里单击要删除的文件组名,再单击【删除】按钮。
注意 如果文件组里包括有数据库文件,则该文件组不能被删除,必须先将包含的文件删除后才能删除。
step 6 无论是添加文件组、修改文件组属性,还是删除文件组,最后都要单击【确定】按钮完成操作。
5.4.7 修改数据库的排序规则
排序规则即根据特定语言和区域设置的标准指定对字符串数据进行排序和比较的规则。设置正确的数据库排序规则,有利于提高数据的查询速度。SQL Server 2008提供了两组排序规则:Windows排序规则和SQL排序规则。在【数据库属性】对话框的【选项】选项页里,可以设置与修改数据库的排序规则。
step 1 打开【数据库属性】对话框,切换到如图5.19所示的【选项】选项页。
图5.19 【选项】选项页
step 5 在【选项】选项页的【排序规则】下拉列表框中,显示的是当前数据库使用的排序规则名。本例中的排序规则为Chinese_PRC_CI_AS,该排序规则由两部分组成,Chinese_PRC代表排序规则所支持的字符集即简体中文,Chinese_Taiwan表示繁体中文。CI_AS也是一个组合,其中CI的意思是Case Insensitive,表示与大小写无关,AS的意思是Accent Sensitive,表示要区分含重音节符号的字符。还可以使用其他标识,BIN表示二进制排序,CS表示区分大小写,AI表示不区分含重音节符号的字符,KI表示不区分假名类型,KS表示区分假名类型,WI表示区分宽度,WS表示不区分宽度。
step 3 选择要修改的数据库排序规则,单击【确定】按钮完成操作。
5.4.8 修改数据库的兼容性
修改数据库的兼容性是为了将某些数据库行为设置为与指定的SQL Server早期版本兼容。例如,将SQL Server 2005的数据库附加到SQL Server 2008,它的兼容级别为“SQL Server 2005(90)”,但如果想在该数据库里使用XML类型的数据,其中一个解决办法就是将其兼容级别提高到“SQL Server 2008(100)”。在【数据库属性】对话框的【选项】选项页里,可以设置与修改数据库的兼容性。
step 1 打开【数据库属性】对话框,切换到【选项】选项页。
step 2 展开【兼容级别】下拉列表框,选择兼容的级别。
step 3 单击【确定】按钮完成操作。
5.4.9 限制用户的访问
在很多种情况下,例如数据库管理员要对数据库进行测试或维护时,可能希望只有自己可以访问数据库,而其他用户不能访问,这个时候就需要限制用户的访问。在【数据库属性】对话框的【选项】选项页里,可以设置什么角色能够访问数据库。
step 1 打开【数据库属性】对话框,切换到【选项】选项页。
step 2 展开【状态】区域里的【限制访问】下拉列表框,可选项为【Multiple】, 【Single】和【Restricted】,分别代表多用户访问、单一用户访问和受限用户访问(即只有数据库所有者、创建者和系统管理员才可以访问)。
step 3 根据需要进行选择,然后单击【确定】按钮。
5.4.10 设置用户及角色对数据库的使用权限
在【数据库属性】对话框的【权限】选项页里,可以查看或设置数据库安全对象的权限。
step 1 打开【数据库属性】对话框,然后切换到图5.20所示的【权限】选项页。
图5.20 【权限】选项页
step 2 单击【搜索】按钮,出现图5.21所示的【选择用户或角色】对话框。在SQL Server 2008中允许给用户或角色设置访问数据库的权限。
图5.21 选择用户或角色
说明 用户是可以访问数据库的对象,不同的用户可以拥有不同的访问权限。角色是为了方便对用户的管理而设定的。将几个用户设置为某一个角色,只要对这个角色设置对数据库的访问权限后,那么属于这个角色的所有用户都会具有这些访问权限了。同一个用户可以属于不同的角色。
step 3 在图5.21所示的【选择用户或角色】对话框中,单击【浏览】按钮,出现图5.22所示的【查找对象】对话框,在这里可以看到有哪些用户或角色可以被添加。本例选择public角色,然后单击【确定】按钮。
图5.22 查找对象
注意 每个数据库用户都属于public数据库角色。当未对某个用户赋予权限时,该用户就会使用public角色的权限。
step 4 返回到【选择用户或角色】对话框,在【输入要选择的对象名称】列表框里,已经自动填入public角色,如图5.23所示。
图5.23 【选择用户或角色】对话框
step 5 单击【确定】按钮,返回到图5.24所示的【权限】选项页。在该图中可以看到,【用户或角色】列表框里已经增加了public角色。单击public角色,下面显示了角色的显式权限列表,在此可以设置public角色拥有的权限。
图5.24 增加了角色的【权限】选项页
注意 如果在【用户或角色】列表框中有几个角色,选择不同的角色,在显式权限列表里会显示对应的权限列表。
step 6 选中权限选项后面的相应复选框,给用户或角色赋予相应的角色。完成操作后,单击【确定】按钮。
5.4.11 修改数据库名称
修改数据库名称的方法如下:
step 1 启动SQL Server Management Studio,连接上数据库实例,展开对象资源管理器里的树形目录,定位到要修改的数据库上。
step 2 右击要修改的数据库,在弹出的快捷菜单里选择【重命名】选项。
step 3 输入新数据库名,按下【Enter】键完成操作。
5.5 使用Alter database语句修改数据库
5.5.1 基本语法
修改数据库属性和文件设置的T-SQL语句为Alter database,其完整的代码为:
ALTER DATABASE database_name --要修改的数据库名 { <add_or_modify_files> --添加或修改数据库文件 | <add_or_modify_filegroups> --添加或修改数据库文件组 | <set_database_options> --设置数据库选项 | MODIFY NAME=new_database_name --重命名 | COLLATE collation_name --修改排序规则 } [;]
为了简化内容,在这里就不把每个语法块里的代码写出来了,在下面的参数讲解里再详细介绍。
5.5.2 参数说明
虽然Alter database的代码看上去很复杂,但是在实际操作中,Alter database一次只能修改一种参数,所以读者不要因为下面的代码而产生恐惧心理。如果不想看参数说明,也可以直接跳到本章的下一节阅读举例说明。
“ALTER DATABASE database_name”为要修改的数据库名称,用数据库名称代替“database_name”。
“<add_or_modify_files>”指定要添加、删除或修改的文件。<add_or_modify_files>语法块的代码如下:
<add_or_modify_files>::= { ADD FILE <filespec> [ ,...n ] [ TO FILEGROUP { filegroup_name | DEFAULT } ] | ADD LOG FILE <filespec> [ ,...n ] | REMOVE FILE logical_file_name | MODIFY FILE <filespec> }
其中:
◆ ADD FILE:将文件添加到数据库中。
◆ TO FILEGROUP:将文件添加到文件组中。如果指定了DEFAULT,则将文件添加到当前的默认文件组中。
◆ ADD LOG FILE:将日志文件添加到数据库中。
◆ REMOVE FILE:从数据库中删除逻辑文件说明并删除物理文件。文件必须为空,否则无法删除。
◆ MODIFY FILE:指定要修改的文件,一次只能修改一个属性。
◆ <filespec>:用来控制文件属性,语法块的代码如下。其中,“NAME”指定文件的逻辑名称;“NEWNAME”指定文件的新逻辑名称;“FILENAME”指定物理文件名称;“SIZE”指定文件大小,单位包括KB,MB,GB和TB,默认为MB;“MAXSIZE”指定文件的最大尺寸,如果设置为“UNLIMITED”,表示不指定文件大小,让它自动增长,直到文件增长到磁盘充满;“FILEGROWTH”指定文件的自动增量;“OFFLINE”是将文件设置为脱机并使文件组中的所有对象都不能访问。
<filespec>::= ( NAME=logical_file_name [ , NEWNAME=new_logical_name ] [ , FILENAME='os_file_name' ] [ , SIZE=size [ KB | MB | GB | TB ] ] [ , MAXSIZE={ max_size [ KB | MB | GB | TB ] | UNLIMITED } ] [ , FILEGROWTH=growth_increment [ KB | MB | GB | TB| % ] ] [ , OFFLINE ] )
注意 虽然用“UNLIMITED”可以设置为不限制数据库文件增长,但是在SQL Server 2008中日志文件的最大尺寸为2TB,而数据文件的最大尺寸为16TB。在修改数据库文件属性之前,可以先使用存储过程sp_helpfile来查看数据库目前有哪些文件及属性。
“<add_or_modify_filegroups>”指定要添加、删除或修改的文件组,其语法块的代码如下:
<add_or_modify_filegroups>::= { | ADD FILEGROUP filegroup_name | REMOVE FILEGROUP filegroup_name | MODIFY FILEGROUP filegroup_name { <filegroup_updatability_option> | DEFAULT | NAME=new_filegroup_name } }
其中:
◆ ADD FILEGROUP:将文件组添加到数据库。
◆ REMOVE FILEGROUP:从数据库中删除文件组。
注意 文件组中必须没有包含文件,否则无法删除。
◆ MODIFY FILEGROUP:其中,“DEFAULT”用来将文件组设置为数据库的默认文件组,“NAME”用来更改文件组名称,<filegroup_updatability_option>是个语法块(其代码如下所示), “READONLY”或“READ_ONLY”设置文件组为只读,“READWRITE”或“READ_WRITE”设置文件组为可读写。
注意 主文件组不能设置为只读。如果要更改文件组状态,必须对数据库拥有独占访问权限。
<filegroup_updatability_option>::= { { READONLY | READWRITE } | { READ_ONLY | READ_WRITE } }
“<set_database_options>”用于设置数据库参数,其语法块代码如下:
<set_database_options>::= SET { { <optionspec> [ ,...n ] [ WITH <termination> ] } | ALLOW_SNAPSHOT_ISOLATION {ON | OFF } | READ_COMMITTED_SNAPSHOT {ON | OFF } [ WITH <termination> ] }
其中:
◆ ALLOW_SNAPSHOT_ISOLATION:用来指定事务是否可指定快照事务隔离级别。
◆ READ_COMMITTED_SNAPSHOT:指定READ_COMMITTED隔离级别的事务是否使用锁定。
<optionspec>语法块里可设置的参数比较多,其语法代码如下:
<optionspec>::= { <db_state_option> | <db_user_access_option> | <db_update_option> | <external_access_option> | <cursor_option> | <auto_option> | <sql_option> | <recovery_option> | <database_mirroring_option> | <supplemental_logging_option> | <service_broker_option> | <date_correlation_optimization_option> | <parameterization_option> }
“MODIFY NAME=new_database_name”用于修改数据库名,需要用数据库名称代替“new_database_name”。
注意 也可以用存储过程“sp_renamedb ‘旧新数据库名’, ’新数据库名’”来修改数据库,但无论用什么方式修改数据库名,在修改之前,都应该确定没有其他用户正在使用该数据库,否则操作将会失败。
“COLLATE collation_name”修改数据库排序规则,需要用排序规则名代替“collation_name”。
5.5.3 Alter database语句的注意事项
在SQL Server 2008中,Alter database语句的一些注意事项如下:
◆ ALLOW_SNAPSHOT_ISOLATION用于指定事务是否可指定快照事务隔离级别。
◆ DB_CHAINING用于指定数据库是否可以为跨数据库所有权链的源或目标。
◆ 数据库镜像。
◆ DATE_CORRELATION_OPTIMIZATION用于指定SQL Server是否维护由FOREIGN KEY约束链接并包含datetime列的数据库中的任意两个表中的相关统计信息。
◆ EMERGENCY用于指定数据库状态选项。
◆ PAGE_VERIFY(CHECKSUM或TORN_PAGE_DETECTION)用于指定页面校验方式。
◆ PARAMETERIZATION表示查询参数化。
◆ READ_COMMITTED_SNAPSHOT指定READ_COMMITTED隔离级别的事务使用行版本控制还是锁定。
◆ Service Broker控制Service Broker选项。
◆ TRUSTWORTHY指定是否使用模拟上下文的数据库模块来访问数据库以外的资源。
◆ 数据文件的FILEGROWTH默认增量将从10%更改1MB。
◆ 添加或增长数据文件时立即进行文件初始化。
5.5.4 典型案例
例七:将名为“例二数据库”的数据库改名为“例七数据库”。
ALTER DATABASE例二数据库 MODIFY NAME=例七数据库
或者:
exec sp_renamedb '例二数据库','例七数据库'
例八:为“例六数据库”增加一个数据文件。
ALTER DATABASE例六数据库 ADD FILE (NAME=增加的数据文件, FILENAME='D:\DBtest\例六数据库增加的数据文件.ndf')
例九:为“例六数据库”增加一个日志文件。
ALTER DATABASE例六数据库 ADD LOG FILE (NAME=例九增加的日志文件, FILENAME='D:\DBtest\例九增加的日志文件.ldf', SIZE=3MB, MAXSIZE=50MB, FILEGROWTH=10%)
例十:将“例六数据库”中名为“增加的数据文件”的数据库文件改名。
ALTER DATABASE例六数据库 MODIFY FILE (NAME=增加的数据文件, NEWNAME=例十数据文件, FILENAME='D:\DBtest\例十数据文件.ndf')
例十一:修改“例六数据库”的排序规则。
ALTER DATABASE例六数据库 COLLATE Chinese_PRC_CI_AS_KS
例十二:在“例六数据库”里删除一个数据文件。
ALTER DATABASE例六数据库 REMOVE FILE例十数据文件
例十三:在“例六数据库”里添加一个文件组。
ALTER DATABASE例六数据库 ADD FILEGROUP例十三文件组
例十四:在“例六数据库”里为一个文件组改名。
ALTER DATABASE例六数据库 MODIFY FILEGROUP例十三文件组 NAME=例十四文件组
例十五:在“例六数据库”里添加一个数据文件到一个文件组,并将该文件组设置为默认文件组。因为用Alter database一次只能修改数据库的一个属性,所以在下面的代码中使用了两个Alter database语句。
ALTER DATABASE例六数据库 ADD FILE (NAME=例十五数据文件, FILENAME='D:\DBtest\例十五数据文件.ndf') TO FILEGROUP例十四文件组 GO ALTER DATABASE例六数据库 MODIFY FILEGROUP例十四文件组DEFAULT GO
例十六:在“例六数据库”里删除“例十四文件组”。由于“例十四文件组”是默认文件组,其中又包含了一个文件。所以,要从“例六数据库”中删除“例十四文件组”,必须先进行以下操作。
step 1 将其他文件组设置为默认文件组,本例中将PRIMARY文件组设置为默认文件组。由于PRIMARY是保留字,所以在使用它的时候,要用方括号括起来。
step 2 删除“例十四文件组”中包含的“例十五数据文件”。
step 3 删除“例十四文件组”。
ALTER DATABASE例六数据库 MODIFY FILEGROUP [PRIMARY] DEFAULT GO ALTER DATABASE例六数据库 REMOVE FILE例十五数据文件 GO ALTER DATABASE例六数据库 REMOVE FILEGROUP例十四文件组 GO
例十七:将“例六数据库”里的一个文件组设置为只读。
在本例中:
step 1 由于PRIMARY文件组是不能设置为只读的,所以先添加一个文件组。
step 2 由于空文件组是不能设置为只读的,所以再添加一个文件到文件组中。
step 3 将文件组设置为只读。
ALTER DATABASE例六数据库 ADD FILEGROUP例十七文件组 GO ALTER DATABASE例六数据库 ADD FILE (NAME=例十七数据文件, FILENAME='D:\DBtest\例十七数据文件.ndf') TO FILEGROUP例十七文件组 GO ALTER DATABASE例六数据库 MODIFY FILEGROUP例十七文件组READ_ONLY GO
例十八:将“例六数据库”设置为只有一个用户可访问。
ALTER DATABASE例六数据库 SET SINGLE_USER
例十九:设置“例六数据库”可自动收缩。
ALTER DATABASE例六数据库 SET AUTO_SHRINK ON
由于数据库的属性参数很多,限于篇幅,就不在此一一举例,读者可以按照上面的参数说明自行进行测试。
5.6 分离与附加数据库
数据库设计人员往往是在自己的计算机上设计数据库,设计完数据库之后,可以用分离与附加数据库的办法,先从自己计算机上将数据库分离出来,然后附加到数据库服务器上。
也可以将数据库服务器上暂时不用的数据库分离出来,减少SQL Server服务器的负担,等到要用的时候,再附加上去。下面介绍如何分离与附加数据库。
5.6.1 分离数据库
分离数据库的操作可以在SQL Server Management Studio中完成,也可以在查询编辑器里完成,下面分别介绍这两种分离数据库的方法。
5.6.1.1 使用SQL Server Management Studio分离数据库
在SQL Server Management Studio中分离数据库的方法很简单,下面以“例三数据库”为例进行分离演示。
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到【例三数据库】选项。右击【例三数据库】选项,如图5.25所示,在弹出的快捷菜单中选择【任务】→【分离】选项。
图5.25 选择快捷菜单中的选项
step 3 在图5.26所示的【分离数据库】对话框中,如果【状态】列显示“就绪”,就代表可以正常分离,单击【确定】按钮,完成分离操作。
图5.26 分离数据库
此时,刷新【对象资源管理器】窗格中的内容,会发现“例三数据库”已经不存在了,这表示分离成功。
上例是在没有任何用户与数据库连接的情况下完成的,如果有用户连接到数据库,选择【分离】选项后,会弹出如图5.27所示的【分离数据库】对话框。在【状态】栏里显示的是“未就绪”。
图5.27 在有连接情况下的【分离数据库】对话框
如果此时单击【确定】按钮,将会弹出如图5.28所示的“分离数据库失败”信息,分离不能正常运行下去。
图5.28 分离数据库失败
在图5.27所示的【分离数据库】对话框中,在【消息】栏中单击“1活动连接”选项,将弹出如图5.29所示的对话框,提示如何进行操作。
图5.29 分离数据库提示
5.6.1.2 使用系统存储过程分离数据库
例二十:使用系统存储过程分离数据库。
在SQL Server 2008里,已经建有一个名为“sp_detach_db”的系统存储过程,使用这个存储过程可以分离数据库。下面以分离“例四”数据库为例进行介绍。打开查询编辑器窗格,输入以下代码:
exec sp_detach_db '例四数据库'
然后单击【执行】按钮,就可以分离“例四数据库”。但是,如果有进程(用户)正在使用“例四数据库”,分离将会失败。
要解决这个问题,先要查看一下有哪些进程(用户)正在使用“例四数据库”。在查询编辑器窗格中可以输入以下代码来查看用户和进程信息:
use master exec sp_who
单击【执行】按钮后,出现图5.30所示的【结果】窗格,在【结果】窗格里可以看到正在使用“例四数据库”的进程(用户)。
图5.30 查看用户和进程
记住正在使用数据库的进程编号,然后用T-SQL语句中的KILL语句来结束进程。在没有进程使用数据库后,就可以使用存储过程sp_detach_db来分离数据库。本例中,正在使用“例四数据库”进程的编号为52和54,在查询编辑器窗格中输入以下代码:
use master kill 52 kill 54 exec sp_detach_db '例四数据库'
5.6.2 附加数据库
分离了数据库之后,需要再次使用它时,可以将它附加至SQL Server 2008上。同样,附加数据库的操作也可以分别在SQL Server Management Studio和查询编辑器里完成。
5.6.2.1 使用SQL Server Management Studio附加数据库
在SQL Server Management Studio中附加数据库的方法很简单,下面介绍如何将“例三数据库”附加到SQL Server 2008上。
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到目标数据库。右击数据库名称,在弹出的快捷菜单里选择【附加】选项,弹出如图5.31所示的【附加数据库】对话框。
图5.31 【附加数据库】对话框
step 3 单击【添加】按钮,弹出如图5.32所示的【定位数据库文件】对话框。在该对话框中默认只显示了数据库的数据文件,也就是mdf文件。选择要附加的数据文件,在本例中选择“例四数据库.mdf”,然后单击【确定】按钮。
图5.32 定位数据库文件
step 4 返回到【附加数据库】对话框,如图5.33所示。在该对话框的【要附加的数据库】列表框里,已经将数据库的数据文件添加进去了。其中,【附加为】栏中显示的是数据库名,本例中将其改为“例四”。这样,在附加数据库时,会自动将其改名为“例四”。在【“例四数据库”数据库详细信息】列表框中,可以看到原“例四数据库”包含的数据库文件,SQL Server 2008会自动关联数据文件和日志文件。
图5.33 附加数据库后的效果
step 5 单击【确定】按钮,完成附加操作。完成后,可以在【对象资源管理器】窗格中看到新附加的数据库名为“例四”。
因为在数据库的主数据文件中会存放其他文件的相关信息,所以在附加数据库时,只要指定了主数据文件,其他文件的位置也就都知道了。但是,如果在数据库分离后,这些文件被移动过位置,就会出现文件“找不到”的提示,这个时候就要自己手动查找文件。
例如,在附加“例四数据库”之前,将“例四数据库_log.LDF”文件移动到其他文件夹中。进行附加操作时,在【“例四数据库”数据库详细信息】列表框中,就会看到“例四数据库_log.LDF”文件后显示“找不到”的提示,如图5.34所示。
图5.34 找不到日志文件
这个时候,可以单击【当前文件路径】栏后面的【…】按钮,找到“例四数据库_log.LDF”文件,然后单击【确定】按钮,完成附加操作。
在本例中,“例四数据库_log.LDF”是个日志文件,如果实在找不到这个文件,在图5.34所示的【附加数据库】对话框里,选中“例四数据库_log.LDF”文件,单击【删除】按钮,可以将该日志文件删除,再单击【确定】按钮,仍然可以附加“例四数据库”。这时,SQL Server 2008会在数据文件所在目录下自动新建一个日志文件。
注意 只有日志文件才可以删除,如果数据文件缺少任何一个,都将无法完成附加操作。
5.6.2.2 使用T-SQL附加数据库
回顾一下,在使用Create database语句创建数据库时,曾经谈到for attach参数,这个参数用来附加数据库。下面以附加“例三数据库”为例,介绍用Create database语句附加数据库的方法。
例二十一:附加“例三数据库”。
打开查询编辑器窗格,然后输入以下代码:
use master CREATE DATABASE例三数据库 ON (FILENAME='D:\DBtest\例三数据库.mdf') FOR ATTACH
单击【执行】按钮,就可以附加“例三数据库”了。同样的问题,如果曾经移动过数据文件或日志文件,那么在附加数据库时,就要指定主数据文件和所有移动过位置的文件,包括日志文件。
例二十二:附加被移动了文件的数据库。
将“例三数据库”的文件都移动到D盘的test目录下,附加代码就应该这么写:
use master CREATE DATABASE例三数据库 ON (FILENAME='D:\test\例三数据库.mdf'), (FILENAME='D:\test\例三数据库_log.LDF') FOR ATTACH
另外,还可以使用系统存储过程sp_attach_db来附加数据库。还是以“例三数据库”为例,附加数据库的代码为:
use master exec sp_attach_db例三数据库,' D:\test\例三数据库.mdf'
如果移动过数据库文件,就要为主数据文件和其他所有移动过位置的文件指定位置,代码如下:
use master exec sp_attach_db例三数据库, 'D:\test\例三数据库.mdf', 'D:\test\例三数据库_log.LDF'
注意 存储过程sp_attach_db中最多只能列出16个文件,如果要列出的文件数超过16,就只能用CREATE DATABASE语句来附加数据库了。
5.7 脱机和联机数据库
数据库的脱机与分离不同,分离是将数据库从SQL Server 2008中分离出来,SQL Server 2008不再对数据库进行管理。而脱机只是让数据库处于离线状态,并没有从SQL Server 2008中分离出去,SQL Server 2008还在管理数据库,只是不再对数据库进行操作。举个例子,分离数据库,就像从单位里辞职,与单位没有什么关系了;数据库脱机,就像是停薪留职,虽然单位不再安排工作、不发工资,但是组织关系还在单位里。
当数据库处于联机状态时,不能对数据库文件进行复制操作,因为文件被SQL Server 2008使用着。如果这个时候,想将数据库文件复制到其他磁盘中,又不想将整个SQL Server 2008停止,可以先将数据库脱机,复制完毕之后再让数据库联机。
5.7.1 脱机数据库
让数据库脱机可以在SQL Server Management Studio中完成,也可以在查询编辑器里完成,下面分别介绍这两种分离数据库的方法。
5.7.1.1 使用SQL Server Management Studio脱机数据库
在SQL Server Management Studio中使数据库脱机的方法很简单,下面以“例六数据库”为例介绍脱机步骤。
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格里展开树形目录,定位到【例六数据库】选项。右击【例六数据库】选项,在弹出的快捷菜单里选择【任务】→【脱机】选项。
step 3 弹出如图5.35所示的【使数据库脱机】对话框,单击【关闭】按钮完成脱机操作。
图5.35 使数据库脱机
注意 脱机操作要求独占数据库,如果还有其他进程或用户正在使用数据库,脱机工作则一直进行下去,直到所有其他进程或用户都将连接释放为止。可以使用5.6.1.2节介绍的方法结束正在使用该数据库的其他进程。
5.7.1.2 使用T-SQL语句脱机数据库
在学习使用Alter database语句修改数据库属性时,曾经谈到OFFLINE参数,这个参数就是用来使数据库脱机的。
例二十三:使“例三数据库”脱机。
打开查询编辑器窗格,输入以下代码:
use master ALTER DATABASE例三数据库 set OFFLINE
然后单击【执行】按钮,就可以使“例三数据库”脱机。但是,如果有进程(用户)正在使用“例四数据库”,脱机工作会一直进行下去,直到所有其他进程或用户都将连接释放为止。
5.7.2 联机数据库
将数据库脱机并完成例如复制等操作后,需要再次使用数据库时,可以让数据库联机。下面介绍相关操作。
5.7.2.1 通过SQL Server Management Studio使数据库联机
下面还是以“例六数据库”为例,介绍如何在SQL Server Management Studio中将数据库联机。
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到【例六数据库】。右击【例六数据库】选项,在弹出的快捷菜单里选择【任务】→【联机】选项。
step 3 弹出如图5.36所示的【使数据库联机】对话框,单击【关闭】按钮完成联机操作。
图5.36 使数据库联机
5.7.2.2 通过T-SQL语句使数据库联机
使数据库联机的T-SQL语句与使数据库脱机的语句如出一辙,只是需要将OFFLINE改为ONLINE。
例二十四:使“例三数据库”联机。
联机代码如下:
use master ALTER DATABASE例三数据库 set ONLINE
5.8 删除数据库
当数据库不再需要使用时,可以将其删除。删除与分离、脱机不同,是彻底将相应的数据库文件从磁盘中删除,是永久性、不可恢复地删除。
5.8.1 在SQL Server Management Studio中删除数据库
下面以“例三数据库”为例,介绍如何在SQL Server Management Studio中删除数据库。
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到【例三数据库】选项。右击【例三数据库】选项,在弹出的快捷菜单里选择【删除】选项。
step 3 弹出如图5.37所示的【删除对象】对话框,单击【确定】按钮完成删除操作。
图5.37 删除对象
在图5.37所示的【删除对象】对话框的下方,如果选择【删除数据库备份和还原历史记录信息】复选框,在删除数据库的同时,系统会将该数据库的备份和还原历史记录从msdb数据中删除。
如果选择了【关闭现有连接】复选框,在删除数据库之前,SQL Server 2008会自动将所有与该数据库相连的连接关闭,然后再删除数据库。如果没有选择该项,在删除数据库时,如果还有其他活动的连接,将会出现图5.38所示的错误信息。
图5.38 删除数据库出错
说明 无论数据库处于联机、脱机还是可疑状态,都可以将其删除。
5.8.2 用Drop database语句删除数据库
Drop database是一个比较简单的T-SQL语句,只要在其后加上数据库名即可进行删除。
例二十五:删除“测试数据库”。
删除数据库的代码如下:
use master DROP DATABASE测试数据库
也可以一次删除几个数据库,只要在drop database后加上数据库名,中间用逗号隔开即可。
例二十六:同时删除两个数据库。
删除“测试用数据库”和“test”两个数据库的代码如下:
use master DROP DATABASE测试用数据库,test
注意 不能删除系统数据库。SQL Server 2008中增加了对删除数据库快照的支持。
5.9 收缩数据库
在创建新的数据库时,有一个指定数据库增长方式的变量。例如,在创建数据库时,指定日志文件的初始大小为1MB,增量为10%,在经过一段时间使用之后,日志文件达到1GB,那每次增长10%,有可能会让SQL Server 2008占有很多的多余空间。这个时候,就可以使用收缩数据的方法将多余的空间释放出来。
在SQL Server 2008中,数据库中的每个文件,包括数据文件和日志文件,都可以通过删除未使用的页的方法来减小空间占用,具体方法是从数据的末尾开始收缩。例如,SQL Server 2008为一个数据文件分配了3GB的空间,事实上这个文件里的数据只有2GB大小,最大可以收缩1GB,即释放出1GB的空间。收缩数据库的方式有两种:自动收缩和手动收缩。
5.9.1 自动收缩数据库
下面以“例六数据库”为例,介绍如何在SQL Server Management Studio中设置自动收缩:
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到【例六数据库】选项。右击【例六数据库】选项,在弹出的快捷菜单里选择【属性】选项。
step 3 在打开的【数据库属性】对话框里,单击【选项】选项页,如图5.39所示,在【自动】区域里将【自动收缩】选项设置为【True】。
图5.39 设置数据库自动收缩
step 4 单击【确定】按钮完成操作。
技巧 在创建新数据库时,也可以在相应的选项里设置数据库自动收缩。
用T-SQL语句也可以设置数据库自动收缩。
例二十七:设置数据库自动收缩。
设置“例六数据库”自动收缩的代码如下:
ALTER DATABASE例六数据库 SET AUTO_SHRINK ON
5.9.2 手动收缩数据库
下面以“例六数据库”为例,介绍如何在SQL Server Management Studio中设置手动收缩:
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到【例六数据库】选项。右击【例六数据库】选项,在弹出的快捷菜单里选择【任务】→【收缩】→【数据库】选项。
step 3 在图5.40所示的【收缩数据库】对话框中,可以看到数据库的当前大小和可用空间大小。单击【确定】按钮完成收缩数据库操作。
图5.40 【收缩数据库】对话框
在图5.40所示的对话框里,有个【在释放未使用的空间前重新组织文件……】复选框,如果选中此复选框,就要在【收缩后文件中的最大可用空间】数值框里输入百分比数值。这两个选项的意思是:执行具有指定目标百分比选项收缩数据库操作。例如在【收缩后文件中的最大可用空间】数值框里输入20%,那么收缩完后,【可用空间】文本框会显示还有20%的可用空间。
用T-SQL语句也可以收缩数据库,其代码为:
DBCC SHRINKDATABASE ( ' database_name' | database_id | 0 [ , target_percent ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ) [ WITH NO_INFOMSGS ]
其参数说明如下:
◆ ' database_name' | database_id | 0:指定要收缩的数据库的名称或ID。如果指定0,则使用当前数据库。
◆ target_percent:用于指定收缩后的数据库文件所需的剩余可用空间百分比。
◆ NOTRUNCATE:如果使用该参数,则在数据库文件中保留所释放的文件空间。如果未指定此参数,释放的文件空间由操作系统控制。
◆ TRUNCATEONLY:如果使用该参数,数据文件中任何未使用的空间将被释放给操作系统,并将文件收缩到最后分配的区,从而无需移动任何数据即可减小文件大小。
◆ WITH NO_INFOMSGS:取消严重级别从0到10的所有信息性消息。
例二十八:收缩数据库。
收缩数据库的代码为:
DBCC SHRINKDATABASE (例六数据库)
例二十九:使用带参数的T-SQL语句收缩数据库。
收缩数据库的代码为:
DBCC SHRINKDATABASE (例六数据库,10)
5.9.3 手动收缩数据库文件
SQL Server 2008除了允许手动收缩整个数据库之外,还允许手动收缩单个数据库文件,这为收缩数据库提供了更强大和自由的收缩方式。下面以“例六数据库”为例,介绍如何在SQL Server Management Studio中手动收缩数据库文件:
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到【例六数据库】选项。右击【例六数据库】选项,在弹出的快捷菜单里选择【任务】→【收缩】→【文件】选项。
step 3 在图5.41所示的【收缩文件】对话框中,在【数据库文件和文件组】区域里展开【文件类型】下拉列表框,可以选择要收缩的数据库文件类型是数据文件还是日志文件。本例选择【数据】选项。
图5.41 收缩文件
step 4 【文件组】和【文件名】两个下拉列表框与【文件类型】下拉列表框是联动的。当设置了【文件类型】下拉列表框后,【文件组】下拉列表框里就会显示符合所选文件类型的所有文件组名。在本例中,选择【例十四文件组】选项。
step 5 同时,在【文件名】下拉列表框里选择要收缩的文件。
step 6 在【收缩操作】区域中有三个选项:【释放未使用的空间】单选项表示将任何文件中未使用的空间释放给操作系统,并将文件收缩到最后分配的空间;【在释放未使用的空间前重新组织页】单选项表示按指定大小来收缩数据库文件;【通过将数据迁移到同一文件组中的其他文件来清空文件】单选项表示将指定文件中的所有数据移至同一文件组中的其他文件中,然后删除空文件。本例选择第一项。
step 7 单击【确定】按钮完成操作。重复上面的步骤,还可以收缩其他要收缩的数据库文件。
收缩数据库文件的T-SQL语法代码如下:
DBCC SHRINKFILE ( { ' file_name' | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ] } ) [ WITH NO_INFOMSGS ]
其参数说明如下:
◆ ' file_name' :指定要收缩的文件的逻辑名称。
◆ file_id:指定要收缩的文件的标识号(ID)。
◆ EMPTYFILE:使用该项可以指定文件中的所有数据迁移到同一文件组中的其他文件,然后删除空文件。
◆ target_size:该项用于指定收缩后文件的大小,单位是MB,只能为整数。如果未指定该参数,则文件大小将减少到默认文件大小。
说明 例如,数据库文件所占空间为10MB,可用空间为2MB,如果将target_size指定为9MB,那么收缩后的文件大小为9MB,但如果将target_size指定为6MB,那么收缩后的文件大小为8MB。
◆ NOTRUNCATE:将释放的文件空间保留在文件中。
◆ TRUNCATEONLY:将文件中的任何未使用空间释放给操作系统。
◆ WITH:启用要指定的选项。
◆ NO_INFOMSGS:禁止显示所有信息性消息。
例三十:收缩数据库的日志文件。
收缩“例六数据库”中的日志文件,其代码如下:
use例六数据库 go DBCC SHRINKFILE (例六数据库_log) go
例三十一:收缩数据库主文件。
将“例六数据库”中的主数据文件收缩到3MB大小:
use例六数据库 go DBCC SHRINKFILE (例六数据库,3) go
5.10 编写数据库脚本
在SQL Server 2008中,可以将现有的数据库结构生成一个T-SQL代码脚本,利用该脚本可以创建或更新数据库开发代码,或维护备份数据库脚本,或从现有的架构创建测试或开发环境。下面以“例六数据库”为例,介绍如何在SQL Server Management Studio中生成数据库脚本。
step 1 启动SQL Server Management Studio,连接到本地数据库默认实例。
step 2 在【对象资源管理器】窗格中展开树形目录,定位到【例六数据库】选项。右击【例六数据库】选项,在弹出的快捷菜单中选择【编写数据库脚本为】→【CREATE到】→【新查询编辑器对话框】选项。
step 3 打开一个新的查询编辑器窗格,系统自动生成创建“例六数据库”的T-SQL脚本代码,如下所示。
USE [master] GO /****** 对象: Database [例六数据库] 脚本日期: 07/14/2006 15:27:58 ******/ CREATE DATABASE [例六数据库] ON PRIMARY ( NAME=N’例六数据库’, FILENAME=N' D:\DBtest\例六数据库.mdf' , SIZE=1408KB , MAXSIZE =UNLIMITED, FILEGROWTH=1024KB ), FILEGROUP [例十七文件组] ( NAME=N’例十七数据文件’, FILENAME=N' D:\DBtest\例十七数据文件.ndf' , SIZE=1024KB , MAXSIZE=UNLIMITED, FILEGROWTH=1024KB ), FILEGROUP [例十四文件组] ( NAME=N’例十五数据文件’, FILENAME=N' D:\DBtest\例十五数据文件.ndf' , SIZE=1024KB , MAXSIZE=UNLIMITED, FILEGROWTH=1024KB ) LOG ON ( NAME=N’例九增加的日志文件’, FILENAME=N' D:\DBtest\例九增加的日志文件.ldf' , SIZE =3072KB , MAXSIZE=51200KB , FILEGROWTH=10%), ( NAME=N’例六数据库_log' , FILENAME=N' D:\DBtest\例六数据库_log.LDF' , SIZE=560KB , MAXSIZE=2048GB , FILEGROWTH=10%) COLLATE Chinese_PRC_CI_AS_KS GO EXEC dbo.sp_dbcmptlevel @dbname=N’例六数据库’, @new_cmptlevel=90 GO IF (1=FULLTEXTSERVICEPROPERTY(' IsFullTextInstalled' )) begin EXEC [例六数据库].[dbo].[sp_fulltext_database] @action=' enable' end GO ALTER DATABASE [例六数据库] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [例六数据库] SET ANSI_NULLS OFF GO ALTER DATABASE [例六数据库] SET ANSI_PADDING OFF GO ALTER DATABASE [例六数据库] SET ANSI_WARNINGS OFF GO ALTER DATABASE [例六数据库] SET ARITHABORT OFF GO ALTER DATABASE [例六数据库] SET AUTO_CLOSE OFF GO ALTER DATABASE [例六数据库] SET AUTO_CREATE_STATISTICS ON GO ALTER DATABASE [例六数据库] SET AUTO_SHRINK ON GO ALTER DATABASE [例六数据库] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [例六数据库] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [例六数据库] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [例六数据库] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [例六数据库] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [例六数据库] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [例六数据库] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [例六数据库] SET ENABLE_BROKER GO ALTER DATABASE [例六数据库] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [例六数据库] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [例六数据库] SET TRUSTWORTHY OFF GO ALTER DATABASE [例六数据库] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [例六数据库] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [例六数据库] SET READ_WRITE GO ALTER DATABASE [例六数据库] SET RECOVERY FULL GO ALTER DATABASE [例六数据库] SET MULTI_USER GO ALTER DATABASE [例六数据库] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [例六数据库] SET DB_CHAINING OFF
step 4 可以将该数据库脚本保存为一个SQL文件,在其他数据库服务器上执行便可生成一个相同结构的数据库。
仔细查看以上代码,可以学习如何用T-SQL语句创建数据库,以及如何配置数据库。这里限于篇幅就不详细介绍了,请读者自行学习。
注意 SQL Server Management Studio还支持直接从数据库脚本生成文件,或将数据库脚本放在剪贴板中,用此方法还可以为数据表、视图、存储过程等用户自定义的数据库对象生成脚本。
5.11 小结
本章介绍了如何创建数据库、如何配置数据库、如何分离与附加数据库、如何让数据库脱机和联机、如何删除数据库、如何收缩数据库,最后还介绍了如何使用SQL Server Management Studio为已存在的数据库结构生成SQL脚本。
在SQL Server 2008中,可以在SQL Server Management Studio里利用现成的功能和命令来完成对数据库的操作,也可以在查询编辑器中使用T-SQL语句来完成对数据库的操作,两种操作方式虽然不同,但结果是一样的。一般来说,在本地客户端使用SQL Server Management Studio操作比较方便,但在服务器端使用T-SQL操作速度会比较快一点。
数据库需要两种文件——数据文件和日志文件,创建数据库实际上就是创建这两种文件以及两种文件的属性和关系。在创建完数据库后,如果发现设置不合理,可以修改数据库的配置。由于数据库的配置项比较多,所以在配置数据库之前要明白每个配置项的作用。创建数据库和配置数据库的重点是文件和文件组,以及自动增长的属性设置。
对于暂时不用的数据库可以将其分离,等有用时再附加上去,这个方法可以减轻SQL Server 2008的负担。分离数据库之前要先清除所有与该数据的连接。如果要对数据库文件进行操作,可以先让数据库脱机,操作完毕后再让数据库联机。同样,如果有其他用户或进程正在操作数据库,则无法让数据库脱机。对于没用的数据库,可以删除。数据库使用一段时间后,可能会变得很大,这时可以收缩数据库以释放空间。收缩数据库的方法有两种,一种是自动收缩,一种是手动收缩。
使用SQL Server Management Studio可以编写数据库脚本,将脚本保存为文件,可以在其他数据库服务器上创建相同结构的数据库,也可以用于数据库结构的备份。本章主要介绍如何管理数据库,第6章将会介绍如何管理数据表。
本章包括
◆ 数据表简介
◆ 如何创建数据表
◆ 如何删除数据表
◆ 关系图简介
◆ 已分区表简介