代码改变世界

要在数据库级别设置它,可使用下列命令: ALTER DATABASE AdventureWorks2008 SET PARAMETERIZATION SIMPLE ALTER DATABASE AdventureWorks2008 SET PARAMETERIZATION FORCED 允许带引号的标识符 默认情况下,SQL Server使用方5.SQL Server 2008 新建数据库配置参数

2018-07-07 16:01  笑一笑十年少!!!  阅读(404)  评论(0编辑  收藏  举报

SQL Server 2008 数据库
数据库是SQL Server 2008的核心,它可以用于为后面的检索操作存储用户信息,也可 以 作为SQL Server操作的临时存储区域。前面几章介绍了 SQL Server的安装过程和组成 SQL Server 2008数据库的文件的内部结构。本章将详细介绍创建数据库的过程和可配置的 各种选项。

5 .1 系统数据库
如 第 1章所述,在 安 装 SQL Server 2008时,创建了 5 个系统数据库来存储系统信息和 支持数据库操作。在普通的数据库操作中,我们可以看到4 个系统数据库(master、model、 msdb和 tempdb),但 是 看 不 到 第 5 个(Resource数据库,第 4 章对它做了介绍)。如 果 SQL Server实例被配置为用于SQL Server复制的分发服务器,就可以创建分发数据库。
5 .2 用户数据库
用户数据库由具有适当权限的任意服务器登录名创建。在之前版本的SQL Server中, 可以选择安装第1 章中做过简单介绍的AdventureWorks2008示例数据库,但这一功能已从
新 版 本 中 删 除 。可从位于 www.codeplex.com/sqlserversamples 上的 Microsoft SQL Server Community Projects and Samples 中卜载 AdventureWorks2008 示例数据库和代码示例。
5 .3 数据库规划
数据库管理员的主要职责之一是管理数据库的创建。通常,公司从供应商那里购买一
个 需 要 SQL Server后端但并没有对数据层支持进行全面规划的应用程序。很多时候,供应 商也非常乐意上门安装SQLServer实例,并创建必要的数据库来支持该应用程序。而有时, 应用程序供应商会创建一个自动安装和配S 数据库的安装程序。但是很多此类安装的支持
数据库的配置不是效率低下就是根本错误的,只有很少一部分例外。
这并不是说软件供应商公司的应用程序开发人员不知道他们在做什么。实际上问题要

复杂得多。首先,开发人员几乎不可能准确地为每个数据库应用程序组合的安装预测硬件
平台、数据库的使用以及存储的数据量,因此默认值几乎总是错误的。其次,大量经验表
明,许多应用程序开发人员完全不知道SQL Server究竟是如何工作的。他们认为这只是一 个存放数据的地方。很多应用程序开发人员根本不知道利用或者优化数据层。
数据库管理员应考虑为什么数据库像现在这样运行和如何运行。管理数据库的最好时
机就是在其安装之前。无论是内部开发还是从软件供应商那里购买数据应用程序,数据库
管理员都必须深入规划和创建支持数据库。在记住这一点后,让我们仔细看一下数据库创
建过程以及可在此过程中使用的配置选项。

容量规划
规划一个新数据库时必须决定的第一件事是需要多大的磁盘空间来支持该数据库。做
出这个决定时,一方面要确保数据扩展有足够的磁盘空间可用;另一方面减少因数据扩展
而增长的数据和日志文件的数量,以提髙数据库效率。
如果数据库用于支持从供应商处购买的应用程序,那么该数据库的容量规划相当简
单。然而,简单与否取决于软件供应商是否提供详细的文档。该文档必须描述在支持定义
的用户和事务数后数据库的平均大小。如果供应商提供了文档,您就可以详细了解数据库
的功能,从而进行相应的配置。如果供应商没有提供相关信息,数据库管理员的任务就会
变得比较复杂,可能还需要猜测。然而,猜测必须是有根据的,是基于能搜集到的尽可能
多的信息做出的。其难处常在于您可能不知道供应商是如何存储和检索数据的,所以必须
监控数据库的增长趋势,从而恰当预测存储空间的大小。
如果数据库是内部设计并创建的,那么就可以使用已有的技术来确定数据文件的大
小。这些方法之所以起作用,是因为您知道对于每个事务将添加多少数据;但在供应商提
供的数据库中,无法获知这一信息。
下面是其中一种经常采用的技术:通过计算表的大小来计算数据库的大小要求。具体
步骤如下所述:
(1) 合计表中定长列使用的总字节数。
(2) 算出表中变长列使用的总字节数的平均值。
(3) 将第(1)步和第(2)步得到的值相加。
(4) 用 8060(—页中数据字节的最大量)除以第(3)步中算出的值,然后向下舍入到最接近
的整数。该值就是单个数据页中能放下的行数。行不能跨页,所以需要向下舍入。
(5) 把估计的总行数除以第(4)步中算出的每页行数。结果即是预计的支持表的数据
页总数。
(6) 把第(5)步中算出的值乘以8192(数据页的大小)。得出的结果就是表需要的总字节数。
(7) 对数据库中的每个表重复上述过程。
这听起来很有趣,但是不建议这样做。这种算法得出的结果是误导人的,因为这种计
算方法没有考虑影响存储空间的变量,例如是否启用压缩、索引数、索引中使用的填充因
子以及数据碎片等。那么为什么还要介绍这种方法呢?因为它确实有助于了解如何计算大
小,而且您很有可能碰到这个方法,所以需要知道它的局限性。

确定数据文件人小还有一个更为现实的方法。这种方法是先取得数据库原型(数据库的
测试或开发版本),然后在其中填充适量的测试数据。之后,检查磁盘上数据文件的大小,
然后将其乘以1.5。其结果应该足够容纳新数据库的初始数据量,而且还会有空间剩余。这
个方法并不是完美的,但与上一个方法相比要简单得多,也准确得多。
一旦数据库投入生产环境,监控数据库文件大小就相当重要,因为这样可以分析增长
趋势。我个人喜欢配置为当数据库中填充的数据景达到75%时发出警报。这样可以在需要
时增加文件的大小,但同时又能以足够的百分比增长它们,从而避免经常执行增长。
规划事务日志文件的大小更加复杂。要想精确地规划日志大小,必须知道数据库中执
行的事务的平均大小、发生的频率以及被修改的表的物理结构。例如,如果在存储在堆上
的一个表(其行大小为800字节,并且在整数列上有一个非聚集索引)上执行插入操作,会
使事务日志中的数据量增加约820字节。这是因为新行连同新的索引行一起记录在事务口
志中。事务日志的大小也取决于数据库的恢复模式,以及数据库事务日志的备份频率。本
章稍后将介绍恢复模式。第 6 章将对索引做完整介绍。事务日忐备份及其对事务日志的影
响将在第9 章介绍。

 

5 .4 创建数据库
一般通过编写和执行T-SQL代码或使用图形化用户界面来创建数据库。无论使用哪一
种方法,数据库创建过程中唯一需要的信息就是新数据库的名称,下列代码将创建一个名
为 SampleDB的数据库:
CREATE DATABASE SampleDB
执行这条T-SQL语句将使SQL Server创建一个数据文件和一个事务日志文件,这些文
件都被放在安装SQL Server 2008时所指定的默认位置。对于SQL Server 2008的默认实例
的典型安装来说,执行这一代码将会创建下列文件系统对象:
C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\ MSSQL\DATA\SampleDB.mdf C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\ MSSQL\DATA\SampleDB_log.ldf
第一个文件是数据库数据文件,第二个是数据库事务日志文件。虽然这种默认行为很
方便,但一般最好还是不要使用它,因为创建的数据库各有不同,而且一般不推荐在系统
分区上放置数据和日志文件。在数据库创建的过程中,可以指定数据文件、事务日志文件
以及数据库选项。
5 .4 .1 开始
在创建数据库之前,需要了解所有可用的设置和选项。本节将介绍使用图形化用户界
面创建数据库的过程,并且讨论每个配置设置和选项,以及它们如何影响数据库创建过程。
在了解了整个过程后,本节将介绍如何利用这些内容生成一个脚本。通过为数据库名称、

文件名和文件位置指定不同的值,可以重复运行该脚本。
5 .4 .2 创建一个新数据库
使用SQL Server Management Studio以图形化的方式创建数据库是相当简单和直观的。 首先通过“开始”菜单打开SQL Server Management Studio,然后连接到SQL Server的数据
库引擎。
右击“数据库”节点,然后单击“新建数据库”命令。弹出的“新建数据库”界面如
图 5-1所示。

在 “数据库名称”字段中,输入新数据库的名称。当指定数据库名称时,要记住它最
多可以包含128个字符。SQL Server联机丛书中还指出,数据库名称必须以字母或下划线 开头,后续字符可以是字母、数字以及一些特殊字符的组合,不过这不是强制要求。然而,
如果名称不符合公认的标准,数据应用程序可能无法连接至数据库,所以最好不要背离这
个标准。最佳实践是使数据库名称尽可能具有描述性,并尽可能短。对象名称中含有空格
也可能导致问题,因为在以编程方式访问数据库时,它们可能会导致不可预料的问题。
所有者”字段一般应指定为S A ,这是一个内置的SQLServer系统管理员帐户。当 在图形化用户界面中创建新数据库时,该字段采用的值为“<默认值>”,这是创建数据库
时使用的登录帐户。数据库的所有者可以完全控制该数据库。要修改数据库所有权,可以
使用T-SQL语句ALTER AUTHORIZATION指定任意有效的登录名,如下面的代码所示。
ALTER AUTHORIZATION ON DATABASE::SampleDB TO SA
GO

检索数据库信息(例如所有者是谁)有两种不同的方法。sp_helpdb存储过程可用于检 索所有数据库或特定数据库的信息,非常易于用作快速查看。要检索所有数据库,执行
存储过程时不使用参数。对于特定数据库,将数据库名称传递给该存储过程,如下面的
代码所示:
USE Master GO
EXEC sp_helpdb AdventureWorks2008
单独执行和使用数据库名称执行的存储过程的结果分别如图5-2和图5-3所示。

检索数据库信息的另一种方法是使用SQL Server 2005中引入的目录视图。它们提供的 信息比相应的存储过程多,且允许使用标准的T-SQL命令,如 WHERE和 GROUP BY。
下列T-SQL语句演示了如何将sys.database目录视图与sys.server_principals目录视图联接
起来,以查看服务器上所有数据库的基本信息(如图5-4所示)。
SELECT db.name AS database_name,
sp.name AS owner, db.create_date,
db.compatibility_level, db.recovery一model一desc FROM sys.databases db INNER JOIN sys.server_principals sp ON db.owner_sid = sp.sid
数据库所有者应总是为S A ,这样可以避免任何可能发生的问题。参见第6 章了解有
关SA帐户的更多信息。

与 T-SQL相比,全文索引允许使用更灵活的字符串匹配査询。在新版本中,全文引擎
己移至SQL Server 2008进程中,从而可以更好地优化混合査询和提高索引本身的性能。

1 .数据库文件
在 “新建数据库”对话框中的“数据库文件”部分中,注意第一个数据文件的逻辑名
称和第一个日志文件的逻辑名称都已被自动命名。第一个数据文件的名称与数据库的名称
一样,而第一个日志文件的名称是在数据库的名称后面加一个“Jog”。逻辑名称用于在 T-SQL脚本中以编程方式引用文件。在创建过程中可以指定多个文件,每个文件都可以具
有自己的配置设置(例如初始大小和增长行为)。
单击“新建数据库”对话框底部的“添加”按钮,就会向“数据库文件”部分中添加
一个新的文件行。新文件的默认文件类型为“行数据”,但也可通过从下拉列表中选择选项
来将其改为“日志”或 “文件流数据”。一旦创建好数据库,文件类型不可改变。
这里采用默认的文件类型“行数据”。为新的数据文件输入•个逻辑名称,然后在“文件组”
列中单击下拉列表,选择<新文件组〉选项。“新建文件组”对话框将会显示,如图5-5所示。

2 .文件组
数据库是基于组织在文件组中的文件创建的。文件组是用来存放为数据库定义的所有
数据和数据库对象的数据文件的逻辑分组。通过使用按比例填充策略,数据被条带化到文

件组的所有文件中。这就允许同时填满所有数据文件。
唯一必需的文件组是主文件组。主文件组由主数据文件和其他用户定义的数据文件组
成。主数据文件的作用是存储针对数据库的所有系统引用,包括指向Resource数据库中定 义的对象的指针。如果作为默认文件组,则主文件组包含用户定义的对象以及系统创建的
对象的所有对象定义。除了主文件组之外,如有需要,还可以创建更多的用户定义文件组。
使用用户定义文件组的一个最大好处可 以 归 结 为 一 个词:控制。通过用户定义文件组,
数据库管理员可以完全控制哪些数据应该存放在什么地方。如果没有用户定义文件组,那
么所有数据都会存储在主文件组中,这样数据库的灵活性和可扩展性都将大大削弱。虽然
对于较小数据库来说,这可以接受,但是数据库一旦变大,把所有的用户和系统数据组织
到同一个文件组中的做法就会变得越来越不可接受。
那么什么时候有必要分离数据?和大多数技术问题一样,答案是“视情况而定”。需
要做出的决定取决于运行SQL Server的硬件和数据库的访问方式,并不存在严格的规则。 要想了解更多有关数据分离和文件组使用的信息,请参阅清华大学出版社引进并出版的
Brian Knight、Ketan Patel等 著 的 《SQL Server 2008管理专家指南》一书。
输入新文件组的名称,选 中 “默认值”复选框,然后单击“确定”按钮。这会把新的
用户定义的文件组设置为默认文件组,用户创建的所有对象都会放在这个新的文件组中。
这实际上就把系统数据和用户数据分离开来,从而获得对数据库结构的更多控制。
使用文件组的一个不错的功能是可以将该文件组中的所有数据标记为“只读”。方法
是选择“新建文件组”对话框中的“只读”复选框。当在一个数据库中组织不同的对象时,
这个选项相当有用。要改变的对象可以放在一个可更新的文件组中,而那些不会(或很少)
改变的对象则放在一个只读的文件组中。分离对象可以减少需要备份和还原的数据量,对
于大型数据库来说是一个很有用的选项。
3 .优化维护还是优化性能
实现文件组是为了优化性能还是优化维护任务?其实两个任务都可以完成。通过将数
据分隔到表组中的多个物理文件中,文件组可以提升数据库的性能和可维护性。
在维护方面具有优势的原因在于文件组可以备份和还原单独文件和文件组,而不必备
份整个数据库。(第 9 章将介绍文件和文件组备份)。这种能力对于分隔成多个文件组的大
型数据库很有用,而且在某些文件组被标记为只读时更加有用。将读写数据与只读数据分
离可以让数据库管理员仅备份要修改的数据,从而可以最小化大型数据库所需的备份和还
原时间。然而这也是有代价的。文件和文件组的备份策略可能变得特别复杂。维护计划的
复杂性可能很快超出所获得的灵活性。
文件组所带来的性能优势主要有3 个方面。第一个方面是可以并行读写,这是通过将
数据文件分隔到多个物理设备实现的。然而,如果把多个物理文件放到单个文件组中,也
可以获得同样的性能。第二个方面则是将非聚集索引和大型对象数据移出作为常规数据空
间而保留的文件组。将非聚集索引与数据分离可以让数据库引擎同时使用独立的线程从索
引中搜寻行位S 和从表中检索行。将不经常访问的大型对象数据和事务密集的关系数据分
离还可以提升一些实例中的扫描性能。第三个方面,也是最显著的方面,是可以跨多个文
件组物理分区大型表(本章稍后会介绍索引和物理表分区)。

对于大多数数据库来说,文件组只能提升它们的一点性能,但是能够完全利用物理表
分区的大型数据库除外。提升磁盘数据访问的最佳方式是实现一个健壮的廉价磁盘冗余阵
列(RAID)环境。对大多数数据库管理员来说,使用文件组的最主要原因是它可以控制数据
存储以及分隔系统数据和用户数据,这和维护考虑的问题一样。
4. 文件大小
在 “初始大小(MB)” 列中(如图5-1所示),应根据对开始几周(甚至几个月)的文件大小
的预计,指派一个值。在寻找房子并规划一个大家庭时,购买一个只有一间卧室的房子,
然后每生一个孩子就重新改造房子的做法显然是不可取的。而购买较大的房子来容纳一个
大家庭(包括未来出生的孩子)才更合理。数据库文件也是如此。如果一个文件在初始几个
月中可能要保存1GB的数据,那只有为其分配1GB的空间才有意义。作为最佳实践,文
件大小修改次数应该控制在最少,所以应该分配足够的连续磁盘空间来容纳所有预计的数
据,同时还要有一定百分比的空间供数据增长使用。
5. 自动増长
单击Primary文件组的“自动增长”列(如图5-1所示)右边的省略号按钮。弹出的“更 改自动增长设置”对话框如图5-6所示。该对话框可以为每个单独的文件配置最大文件大
小和文件增长设置。确保选中“启用自动增长”复选框。取消选择该复选框会将filegrowth 属性设置为0。

可以将文件增长设置为一个固定的分配大小,或者现有文件大小的一定百分比。作为
最佳实践,应将自动增长选项设置为足够大,以最小化容纳数据增长所需的文件增长数。
微量地增长文件会导致文件碎片,这对于数据和日志文件性能都是有害的。
可以限制数据和日志文件的大小,以另一种方式对文件大小进行控制。方法就是选择
“限制文件增长(MB)” 选项按钮,然后指定一个最大大小。自动或手动的文件增长操作都
不能超过这个大小。通常,设置一个最大文件大小可以防止任何不恰当的进程插入数以百
万计的行,同时还能保持对数据库增长的控制。记住,如果数据库达到最大大小,任何数
据修改事务都会失败。如果出现这种情况,可以更改最大文件大小属性,分配额外的空间。
选择的大小应是预期文件在一定时间中具有的最大数据量。应对数据库中的每个文件执行
该操作。

6 . 路径
要改变数据和日志文件所在的路径,可 单 击 “新建数据库”对话框中每个文件的“路
径”列右侧的省略号按钮并选择目标文件夹,或 是 在 “路径”列中输入正确路径。放置文
件时,记住数据文件和日志文件绝不应该存储在同一个物理磁盘上,否则很可能会使数据
因为磁盘或控制器出现故障而丢失。査看第3 章可了解有关文件位置的更多信息。
在完成新数据库的所有常规设置后,接下来将配置数据库选项。
7 . 数据库选项
单 击 “新建数据库”对话框左上 方 的 “选择页”部 分 中 的 “选项”,将 显 示 “选项”
页,如 图 5-7所示,在这里可以设置几个数据库选项。

排序规则
单 击 “排序规则”下拉列表,查看可用的不同排序规则设置,但保持这一设置为“<
服务器默认值> ”。
如 第 2 章所述,SQL Servei•的实例会被指派一个默认服务器排序规则,该排序规则决 定服务器默认支持什么字符,以及如何搜索和排序这些字符。排序规则设置也可以指派给
数据库。因此,一 个 SQL Servei■实例被配置为使用拉丁字符集并不意味着就不能在同样的 实例上创建支持韩文字符的数据库。然而,同样如前所述,如果数据库排序规则与SQL
Server实例排序规则不同,在 tempdb数据库中可能发生排序规则不兼容的情况
恢复模式
单 击 “恢复模式”下拉列表并査看可用选项。可以设定的模式有:“完整”、“大容量

日志”和 “简单”。如果未以其他方式设置model数据库,那么新数据库的默认恢复模式是 完整模式。第 9 章将详细介绍恢复模式,这里略加解释即可。
实际上恢复模式只有两个,完整和简单。人容量日志模式附厲于完整恢复模式,在大
容量操作时使用。这是因为在完整恢复模式下,对数据库做出的所有修改是完全记录的。
虽然这种恢复模式对数据丢失提供了最人程度的保护,但这种保护也是有代价的。由于对
数据库的所有修改都需要完全记录,在特定操作(如大容景加载数据或表索引维护操作)中,
事务日志的大小会增加得非常快。大容量日志恢复模式也称为最小日志记录模式,在有可
能导致事务日志迅速增大的操作中,可以将该数据库暂时设置为大容量日志恢复模式,在
这些操作完成之后,可以再设置为完整恢复模式。
在简单恢复模式下,每次发出检査点之后,都会清除事务日志中的所有不活动内容。
第4 章中介绍了检査点。简单恢复模式的反应是,事务日志不能备份或用于数据库恢复操
作。事务日志只是用来保证事务的一致性,而不会维护长期的事务历史记录存储。
兼容级别
单击“兼容级别”下拉列表并査看可用选项。除非有特别的理由需要改变兼容级别,
一般应当将其设置为SQL Server 2008(100)o “兼容级别”选项会改变一些数据库操作的行 为,只有在SQL Server 2008的实例和前一个版本的SQL Server共同承担数据库责任时才 有必要使用这个选项。SQL Server 2008仅允许选择80、90和 100的兼容级别,如下拉列
表所示,这些数字分别对应SQL Server 2000、SQL Server 2005和 SQL Server 2008。在以
前的版本中,可使用系统存储过程sp_dbCmptlevel 以编程的方式更改兼容级别。这个系统
存储过程已被正式废弃了,取而代之的是Transact-SQL命令ALTER DATABASE。下列代 码将把AdventureWorks2008的兼容级别设置为SQL 2000:
ALTER DATABASE AdventureWorks2008 SET COMPATIBILITY_LEVEL =80
提示:
想要完全了解各个兼容级别间的所有区别,请参阅SQL Server联机丛书中的“ALTER
DATABASE兼容级别(Transact-SQL)” 主题。从 SQL Server 2000或 2005升级的数据库的
兼容模式会被设置为对应各自原有的版本。例如,从 SQL Server 2000升级到SQL Server 2008的数据库,其兼容级别将是80。
8 .其他选项
默认情况下,“新建数据库”屏幕屮的“其他选项”会按类别组织其选项。对于本次
讨论来说,我们将按字母顺序排列选项。对于这次练习,保留所有选项的默认配置。下面
逐个介紹这些选项。一些数据库选项同时也是连接选项。如果是这样,设置数据库选项的
命令和连接级别选项的命令都会显示。重要的是要知道,如果指定了连接级别选项,则它
会覆盖数据库级别选项。若未指定,则数据库选项将会生效。
单 击 “字母顺序”按钮(该按钮图标显示为字母A 和 Z 以及一个垂直向下的箭头)。可
用的选项将以字母顺序排列,如图5-7所示。

ANSI NULL默认值
“ANSI NULL默汄值”设置指定在CREATE TABLE或 ALTER TABLE操作中添加至
表中的列是否允许空值。如 果 “ANSI NULL默认值”设置被设为False,那么除非有显式
抱定,否则添加的列不允许空值。当使用SQL Server Management Studio连接到SQL Server
时,新査询的连接设置默认为ANSI NULLS O N ,该设置会覆盖数据库设置。要在连接级
别或数据库级别设置它,可以使用下列命令:
--Connection Settings SET ANSI_NULL_DFLT_ON OFF — ANSI NULL Default False SET ANSI_NULL_DFLT_ON ON --ANSI NULL Default True
—— Database Options ALTER DATABASE AdventureWorks2008 SET ANSI_NULL_DEFAULT OFF ALTER DATABASE AdventureWorks2008 SET ANSI_NULL_DEFAULT ON

ANSI NULLS已启用
“ANSI NULLS已启用”设置控制与NULL值进行比较的行为。当设置为True时, 与空值的任何比较所得的值均为未知。当设定为False时,如果值为空,那么和NULL比 较的结果就为True。要在连接级别或数据库级别设置它,可以使用下列命令:
--Connection Settings SET ANSI一NULLS OFF
SET ANSI_NULLS ON
—— Database Options ALTER DATABASE AdventureWorks2008 SET ANSI_NULLS OFF ALTER DATABASE AdventureWorks2008 SET ANSI_NULLS ON
提示:
“ANSI NULLS”选项将在SQL Server 2008版后被废弃。在 SQL Server的未来版本中,
该选项将被设置为O N ,并且不允许更改。如果应用程序试图将其值改为O FF,则将产生
错误。建议在新的开发工作中避免使用该选项,并着手更新当前使用该选项的应用程序。
ANSI填充已启用
如果此选项设置为True,那么将在定长的字符列和二进制列的末尾为字符数据添加尾 部空格,为二进制数据添加尾部零。变长的字符和二进制列不会被填充,但尾部空格或尾
部零也不会被剪裁。当把此选项设置为False时,设置为NOT NULL的定长的二进制和字 符列的行为和“ANSI填充已启用”设置为True时是一样的。然而,允许空值的定长的字 符列和二进制列不会被填充,任何尾部空格或尾部零也不会被剪裁。当 “ANSI填充已启
用”设置为False时,变长列和允许空值的定长列的行为是一样的。要在连接级别或数据 库级别设置该选项,可以使用下列命令:
--Connection Settings SET ANSI_PADDING OFF
SET ANSI_PADDING ON

--Database Options ALTER DATABASE AdventureWorks2008 SET ANSI_PADDING OFF ALTER DATABASE AdventureWorks2008 SET ANSI PADDING ON
提示:
“ANSI填充”选项将在SQL Server 2008版后被废弃.在 SQL Server的未来版本中,
该选项将被设置为O N ,并且不允许更改。如果应用程序试图将値改为OFF,将产生错误。
建议在新的开发工作中避免使用该选项,并着手更新当前使用该选项的应用程序。
ANSI警告已启用
当 “ANSI膂告已启用”选项设置为True时,只要聚合函数中出现空值,数据库引擎 就会发出聱告。当设定为False时,则不会发出警告。要在连接级别或数据库级别设置它, 可以使用下列命令:
--Connection Settings SET ANSI_WARNINGS OFF
SET ANSI_WARNINGS ON
--Database Options ALTER DATABASE AdventureWorks2008 SET ANSI_WARNINGS OFF ALTER DATABASE AdventureWorks2008 SET ANSI_WARNING$ ON
算术中止已启用
当该选项设置为True时,任何语句或事务在遇到算术溢出或被零除错误后都将终止。 当设定为False时,会给出一个警告,但是语句或事务不会终止。要使该选项达到想要的 结果,必须将“ANSI警告”选项也设H 为 False。要在连接级别或数据库级别设置它,可 以使用下列命令:
--Connection Settings SET ARITHABORT OFF
SET ARITHABORT ON
--Database Options ALTER DATABASE AdventureWorks2008 SET ARITHABORT OFF ALTER DATABASE AdventureWorks2008 SET ARITHABORT ON
自动关闭
当首次访问某个数据库时,SQL Server会打幵和锁定所有与数据库相关联的文件。若 Auto Close值为T rue,当最后一个用户断开与数据库的连接时,数据库将关闭并释放所有 文件锁定。此设置默认为O FF,因为在一个服务器平台上没有必要执行数据库的打开和关
闭操作,而且这也会产生不必要的开销。不过SQL Server速成版是个例外,因为SQL速 成版被设计为在桌面系统上运行,这种系统中资源较为有限,而打开的数据库会消耗大量
资源。如果没有用户连接,可以把这些资源返还给系统。要在数据库级别设置它,可使用
F列命令:

ALTER DATABASE AdventureWorks2008 SET AUTO_CLOSE OFF ALTER DATABASE AdventureWorks2008 SET AUTO_CLOSE ON
自动创建统计信息
若该选项被设置为T rue,数据库引擎将为那些在JOIN操作的WHERE子句或ON子 句中引用的、缺少统计信息的非索引列生成统计信息。数据库引擎使用统计信息确定列中
数据的选择性和分布情况。若设置为False,则由数据库管理员在需要时手动创建统计信息。 要在数据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET AUTO_CREATE_STATISTICS OFF ALTER DATABASE AdventureWorks2008 SET AUTO_CREATE_STATISTICS ON
自动收缩
若该选项被设置为True,数据库引擎将定期检査所有数据库文件的总大小,并把它与 存储的数据量进行比较。如果有超过25%的总剩余空间,数据库引擎将对数据库文件执行
文件收缩操作,将总的可用空间减少至25%。除 SQL Server速成版之外,这个选项默认设 置 为 False。另外除数据库会愈来愈小这样极少见的情况外,它都应该设为False。要在数 据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET AUTO^SHRINK OFF ALTER DATABASE AdventureWorks2008 SET AUTO_SHRINK ON
自动更新统计信息
当该选项设置为True时,数据库引笨会自动更新列的统计信息,从而保持最有效的査 询计划。这通常是在査询执行时,査询处理器发现了过期的统计信息的情况下发生。如果
设置为False,那么就需要数据库管理员手动更新列统计信息。要在数据库级别设置它,可 使用下列命令:
ALTER DATABASE AdventureWorks2008 SET AUTO_UPDATE_STATISTICS OFF ALTER DATABASE AdventureWorks2008 SET AUTO_UPDATE_STATISTICS ON
自动异步更新统计信息
当该选项设置为True时,査询中发现的过期统计信息将被更新,但发现这些过期统计 信息时正在执行的查询不会等待新的统计信息。后续查询将利用新的统计信息。当设为False 时,只有统计信息更新之后才进行查询编译。要在数据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET AUTO UPDATE_STATISTICS一ASYNC OFF ALTER DATABASE AdventureWorks2008 SET AUTO_UPDATE_STATISTICS_ASYNC ON
Broker已启用
当该选项设置为True时,数据库被配置为参与Service Broker消息传递系统。当在一 个新数据库中启用该选项时,将在该数据库中创建并保留一个新的Service Broker标识符。
如果Service Broker被禁用,然后再启用,则将使用原标识符。要了解有关Service Broker
的更多信息,可参见第19章。要在数据库级别设置它,可使用下列命令:

ALTER DATABASE AdventureWorks2008 SET DATE_CORRELATION_OPTIMIZATION OFF ALTER DATABASE AdventureWorks2008 SET DATE_CORRELATION_OPTIMIZATION ON
默认游标
和那些作用域是基于连接的局部变量和全局变量不同,游标始终基于声明它的连接。
当这个选项设置为Global时,它指定了声明的游标可被同一连接上执行的任意批处理、存 储过程或触发器引用。如果设置为Local,游标只能在声明了它的批处理、存储过程或触发 器中引用。要在数据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET CURSOR_DEFAULT LOCAL ALTER DATABASE AdventureWorks2008 SET CURSOR_DEFAULT GLOBAL
已启用加密
如果该选项设置为True,将加密所有数据和日志文件。如果还未创建数据库加密密钥, 试图设置该选项将产生错误。可参见第6 章了解有关“透明数据加密”的更多信息。要在
数据库级别设置它,可使用T 列命令:

ALTER DATABASE AdventureWorks2008 SET ENCRYPTION OFF ALTER DATABASE AdventureWorks2008 SET ENCRYPTION ON
服从Broker优先级
该选项在SQL Server Management Studio中是不可配置的,必须通过T-SQL脚本更改。 如果打开该选项,SQL Server将服从Service Broker消息的优先级。要了解有关Service Broker
和消息优先级的更多信息,可参看第19章。要在数据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET HONOR_BROKER_PRIORITY OFF ALTER DATABASE AdventureWorks2008 SET HONOR_BROKER_PRIORITY ON
数值舍入中止
当这个选项设置为True时,这意味着任何数值舍入都将产生一个错误。例如,如果“数 值舍入中止”选项被设置为T rue,下列代码将产生一个错误:

DECLARE @Numl AS decimal(4,3) SET @Numl =7.00004 / 2.84747 SELECT @Numl AS Answer
RESULTS:
Msg 8115, Level 16, State 7, Line 2 Arithmetic overflow error converting numeric to data type numeric.
出错是因为声明十进制变量的小数位数为3。记住,小数位数指定了小数点后面保留
几位。要执行这一计算,SQL Server必须对数字进行舍入。如果将该选项设置为False,代 码将成功执行:
DECLARE @Numl AS decimal(4,3) SET @Numl =7.00004 / 2.84747

要在连接级别或数据库级别设置它,可使用下列命令:
--Connection Settings SET NUMERIC一ROUNDABORT OFF
SET NUMERIC_ROUNDABORT ON
—— Database Options ALTER DATABASE AdventureWorks2008 SET NUMERIC ROUNDABORT OFF ALTER DATABASE Adventur.eWorks2008 SET NUMERIC_ROUNDABORT ON
页验证
“页验证”选项使数据库管理员可以为写页的验证设定不同的选项。可用的选项包括
Checksum> Tom_Page_Detection和 None。对于性能来说,最佳的选择是None。但是如果
设置为None,磁盘写作中损坏的页(或页写入磁盘后由其他磁盘异常造成的损坏)就不会 被发现。
如果设置为Checksum, SQL Server将计算一个校验和值,并将它存储在页标头中。这 个校验和值与循环冗余校验(CRC)值很类似,后者由操作系统在将文件写入磁盘时创建。
当从磁盘中读取-个数据页时,SQL Server将重新计算校验和值,并和原来存储在页标头 的值进行比较。如果值匹配,那么该页是有效的。如果不匹配,那么该页就被认为是损坏
的,从而将引发823错误,数据库的状态从ONLINE变为SUSPECT。
在一个典型配置中,写入头一次只能向磁盘中写入512字节的数据。因此,写入一个
8K.B的页需要16遍。Tom Page Detection选项将SQL Server配置为在每个写循环的末尾
写一个错误位到页标头中。如果后面读取页时没有错误位,则会引发823错误,且数据库
的状态将从ONLINE变为SUSPECT。
当 SQL Server引发823错误时,将把•条记录添加到msdb数据库中的suspect_pages
表中。该记录包括发生错误的数据库、页 ID、文件ID和其他有助于从备份中还原页的信
息。当页还原时,该表将得到更新,但记录不会删除。一般由数据库管理员删除任何标记
为还原或修复的记录。
选择合适的“页验证”设置取决于可接受的风险和CPU使用情况。如前所述,对于性
能来说,最好的选择是将“页验证”设置为None,但是此设置会使数据库无法检测到数据 损坏。Checksum选项为检测损坏提供了敁好的保障,因为无论是数据写操作期间还是写操 作之后发生的对磁盘数据的任意修改都会被校验和验证检测到。不过,Checksum选项会占 用最多的CPU周期。Tom_Page_Detection选项是一种检测损坏页的低成本方法,但它只会 检测在写操作期间发生的i 损坏。推荐设置是Checksum,因为这种选项有髙度的数据完整 性验证。要在数据库级别设置它,可使用下列命令:

ALTER DATABASE AdventureWorks2008 SET PAGE_VERIFY NONE ALTER DATABASE AdventureWorks2008 SET PAGE_VERIFY TORN_PAGE_DETECTION ALTER DATABASE AdventureWorks2008 SET PAGE_VERIFY CHECKSUM
参数化
“参数化”是 SQL Server 2005中引入的一个非常有趣、但是非常高级的选项。默认情 况下,数据库引擎自动将一些查询参数化,这样即使在WHERE子句中定义了不同的值,
创建并编译的査询计划也可重用。例如,考虑下列代码:
USE AdventureWorks2008 GO
SELECT * FROM Person.Person WHERE LastName =N*Smith'
如果在査询窗口中输入此代码,然后单击“SQL编辑器”工具栏上的“显示估计的执行
计划”按钮,会发现当参数选项设 置 为 “简单”时,数据库引擎使用搜索条件LastName = N’Smith•编译查询(如图5-8所示)。这是因为当把该选项设 置 为 “简单”时,SQL Server会决 定参数化哪些查询和不参数化哪些查询。对于这个特定的查询,它确定其不值得参数化。

当该选项设置为“强制”时,SQL Server会把所有可参数化的查询参数化,而同样的 査询会得到一个参数化査询计划(如图5-9所示)。强制自动参数化有时能改善性能,但是需
要仔细监控以确保它对性能没有负面影响。

要在数据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET PARAMETERIZATION SIMPLE ALTER DATABASE AdventureWorks2008 SET PARAMETERIZATION FORCED
允许带引号的标识符
默认情况下,SQL Server使用方括号(“[]”)来界定对象。只有在对象名中包含嵌入的 空格或保留字时才需要界定对象。ANSI标准定界符是双引号。下面的例子说明了如何使用
方括号和双引号创建和引用一个包含嵌入空格的对象。
下面是采用ANSI双引号定界符的例子:
USE AdventureWorks2008 GO
CREATE TABLE "Sales.USA Customers" ( AcctNumber int IDENTITY(1,1) NOT NULL
r
"Last Name" varchar(75) NOT NULL , "First Name" varchar(75) NOT NULL) SELECT AcctNumber, "Last Name", "First Name"
FROM "Sales.USA Customers"
下面是默认的方括号定界符的例
USE AdventureWorks2008 GO
CREATE TABLE [Sales.USA Customers] ( AcctNumber int IDENTITY(1,1) NOT NULL

, [Last Name] varchar(75) NOT NULL , [First Name] varchar(75) NOT NULL) SELECT AcctNumber, [Last Name], [First Name] FROM [Sales.USA Customers]
当 “允许带引号的标识符”选项为True时,方括号和双引号都可以使用。如果该选项 设置为False,只有方括号定界符可以使用。要在连接级别或数据库级别设置它,可以使用 下列命令:
--Connection Settings SET QUOTED_IDENTIFIER OFF
SET QUOTED_IDENTIFIER ON
--Database Options ALTER DATABASE AdventureWorks2008 SET QUOTED_IDENTIFIER OFF ALTER DATABASE AdventureWorks2008 SET QUOTED_IDENTIFIER ON
注意:
我个人认为对象名称中出现嵌入式空格是错误的,绝不应该这么做。它们通常会给数
据库和应用程序设计带来问题,而自然语言名称所带来的好处却是微不足道的。
递归触发器己启用
递归触发器是一项高级编程技术,它允许同一触发器在同一事务中按顺序执行多次。
当该选项设置为False(默认配S )时,这一操作是不允许的。通常应将此选项设置为False。 递归逻辑非常难以调试,可能导致许多麻烦。递归逻辑总是可重写为非递归逻辑。要在数
据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET RECURSIVE_TRIGGERS OFF ALTER DATABASE AdventureWorks2008 SET RECURSIVE_TRIGGERS ON
限制访问
“限制访问”选项使数据库管理员可以把对数据库的访问限制为一组已定义的登录
名。该选项的默认值为MULTIUSER,允许多个无权限的用户访问数据库。此外还有其他
两个限制访问的选项:SINGLEJJSER和 RESTRICTEDJJSER。
如果设置成SINGLE_USER,那么一次就只有一个用户帐户可以访问数据库。
如果设S 成 RESTRICTED_USER,那么只有 db_owner、dbcreator 或者 sysadmin 的成
员可以连接至数据库。要在数据库级别设置它,可使用下列命令:
ALTER DATABASE AdventureWorks2008 SET MULTI_USER ALTER DATABASE AdventureWorks2008 SET RESTRICTED_USER ALTER DATABASE AdventureWorks2008 SET SINGLE_USER
Service Broker 标识符
“Service Broker标识符”选项不能在SQL Server Management Studio中配置,也不能
直接设置。在首次对数据库启用Service Broker时就会创建Service Broker标识符,它在消
息传递基础设施巾唯一标识该数据库。可参见第19章了解有关Service Broker的更多信息。

可信
“可信”选项不能通过SQL Server Management Studio设置。该选项表明SQL Server
的实例是否信任数据库访问外部或网络资源。如果该选项被设置为False,使用托管代码创 建的数据库编程组件,或需要在髙特权用户上下文中执行的数据库组件,都不能访问数据
库之外的任何资源。当需要前述两种情况之一时,可将“可信”选项设置为True。要在数 据库级别设置它,可使用下列命令:
ALTER DATABASE A d v e n tu re W o rk s 2 0 0 8 SET TRUSTWORTHY OFF ALTER DATABASE A d v e n tu re W o rk s2 0 0 8 SET TRUSTWORTHY ON
VarDecimal存储格式已启用
“VarDecimal存储格式已启用”功能在SQL Server 2005 SP2中首次引入,而在SQL
Server 2008中已被废弃。SQL Server 2008的新功能“行和页压缩”取代了它,本章后面将 讨论这种功能。在 SQL Server 2008中,它被打开并不能关闭。
9 . 生成数据库创建脚本
在了解了创建数据库所需的所有步骤和选项后,下面讨论如何创建这一过程的脚本,
以避免再次经历这个复杂的过程。
“新建数据库”对话框的顶部有一个名为“脚本”的按钮,如图5-10所示。

单击“脚本”按钮右边的下拉箭头,可用的脚本操作选项将会显示。如果按照上文的介
绍进行操作,那么单击任何脚本操作都将产生一个脚本,该脚本复制您在图形化界面中指定
的所有设置。然后通过这个脚本,可以使用同样的选项创建新的数据库,只需要改变数据库
和相关文件的逻辑及物理名称即可。脚本操作选项对于探讨创建或修改数据库对象的实际语
法也很有帮助。几乎每一个创建或修改数据库对象的配置屏幕都包括脚本操作选项。
另一种重用脚本的方法是使用变量替代对象和文件的实际名称。接下来只需更新变景
值并执行脚本。创建数据定义语言(Data Definition Language,DDL)脚本时唯一棘手的部分
是必须使用动态SQ L,因为在DDL脚本中不能直接使用变量。下面的例子演示了如何使
用动态SQL来创建一个新的数裾库,并将一个用户定义的文件组标记为默认文件组:
DECLARE @ D atab aseN am e AS n v a r c h a r (2 5 5 ) DECLARE @ F ileG ro u p N am e AS n v a r c h a r (2 5 5 )

SET @FileGroupName =N'UserData*
EXECUTE (
1 CREATE DATABASE * +@DatabaseName +• ON PRIMARY ( NAME = ,•' +@DatabaseName 十 … , FILENAME ='• S:\SQLDataFilesV +@DatabaseName + *_data.mdfM , SIZE =20MB
, MAXSIZE =100MB
, FILEGROWTH =30%)
, FILEGROUP UserData ( NAME =* ' * +@FileGroupName +•" , FILENAME ='• S:\SQLDataFiles\* +@DatabaseName + l_data.ndf* , SIZE =2048KB , FILEGROWTH =20%)
LOG ON
( NAME ="• +@DatabaseName + ,_log, ’ , FILENAME = »?T:\SQLLogFiles\* +@DatabaseName +*_log.ldf* *
r
SIZE =100MB
, FILEGROWTH =20%);
ALTER DATABASE 1 +@DatabaseName + ' MODIFY FILEGROUP * +@FileGroupName + * DEFAULT *)
提示:
这个脚本假定存在S 驱动器、T 驱动器、一个SQLDataFiles文件夹和一个SQLLogFiles
文件夹。要在您的环境中运行它,必须更改驱动器号指派和文件夹名称,