SQL Server 2008 基础教程


SQL Server 2008 基础教程 前言 前言 本书针对那些想成为开发人员、数据库管理员或者兼为两者,但对 SQL Server 2008 还 不熟悉的读者。无论你是否拥有数据库知识,是否了解桌面数据库(如 Microsoft Access), 甚至是否具有服务器(如 Oracle)的背景,本书都能为你提供 SQL Server 2008 入门和运行 的知识。 从现在开始,本书将使你的基础知识得以扩展,让你很快从初学者成长为合格的专业开 发人员。本书面向广大开发人员,从喜欢使用图形界面的程序员,到希望成为 SQL Server 2008 编程语言 Transact SQL(T-SQL)高手的程序员。本书将尽可能贴近实际地演示、说明 和展开叙述每一种使用 SQL Server 2008 的方法,以便你能够判断哪种方式最适合自己。 本书包含大量的示例,以使你了解 SQL Server 的各个领域是如何工作的,以及怎样才 能把技术应用到自己的工作中。你将学习完成某项任务的最佳方法,你甚至能学会在面临两 个或更多的选择时,如何做出正确的决策。只要学习完本书,你就能游刃有余地设计和创建 坚实可靠的数据库解决方案。 读者对象 本书适用的对象是刚开始使用 SQL Server 2008 的开发人员,或立志成为数据库管理人 员的读者。本书在结构安排上兼顾了这两类读者。 本书的结构 本书将帮助你决定购买 SQL Server 2008 的哪种版本,为你展示如何安装和配置 SQL Server 2008,并阐释如何使用图形用户界面工具 SSMS(SQL Server Management Studio)。 你将使用该工具完成一个功能完备的数据库示例,该数据库根据本书中介绍的设计方案,利 用图形的和基于代码的练习创建而成。然后,你将学习数据库安全方面的知识,并了解如何 实施安全可靠的数据库设置。只要备份了数据库,你就可以学习如何操作数据。先从简单的 代码编写技术入手,逐渐过渡到更加复杂的技术。最后的任务是在数据库上创建和生成报表。 本书会贯穿始终地说明每一个细节,告知你正在发生什么,并确保随着对本书阅读的深入, 你将在从之前章节中获取的知识上,不断提高。你将以一种有条理、有组织的方式发展构筑 自己的专业知识。 必要准备 要学习本书,你必须有 SQL Server 2008 开发版本的完整版或评估版。此外,如果想要 为特定的 Windows 登录更改安全设置,有 Windows Vista 旗舰版或商业版将十分理想,但并 非必须如此。 代码下载 可以通过出版社网站下载本书的示例代码[ 请到图灵网站(http://www.turingbook.com)本书网页免费注册下载。——编者注]。 联系作者 可以通过发邮件到 robin@fat-belly.com 来联系 Robin Dewson,也可以通过他的网站 (http://www. fat-belly.com)与他取得联系。 致谢 这里,要再次感谢许许多多的人:感谢热心的 Damian Fisher,多谢你教我打鼓;感谢 Andrew 和 host-it Internet Solutions(我的 ISP)的所有人,谢谢你们容忍我在 SQL Server 和 DotNetNuke 上喋喋不休的争辩;感谢我的老板 Bill Cotton 和 Aubrey Lomas,以及在 Lehman Brothers 的同事 Andrew O’Donnell,还有优秀的数据库管理员 Andrew Harding;感谢我大学 时的好朋友 Robert McMillan(Toad),时隔多年,我们才又取得了联系;还要感谢 Simon Collier, 我们每周打乒乓球,你总把我打得无还手之力;感谢 Bedford Blues 橄榄球俱乐部的所有人, 你们让我每个周六都激动不已。 由于许许多多的原因,我必须感谢 Red Gate Software 的几个人,他们是 Tony Davis 和 Richard Collins。多年来,在我的 SQL Server 工作中,Tony Davis 一直是那么出色,而 Richard Collins 安排了 Apress 和 Red Gate 的合作。此外,还要感谢 SalarO 的 Salar Golestanian,他 制作了精美的皮肤,我把它们用在我的网站建设上。 同样,要感谢我的岳母 Jean,多谢她极为出色地处理需要解决的事情,并让我的妻子保 持头脑清醒。还要感谢我已故的岳父 David,对我们全家来说,他是一个十分英明的人。 当然,还要感谢 Apress 的全体人员,特别是为本书提供帮助的 Kylie Johnston 和 Jonathan Gennick,以及 Paul Carlstroem 和 Gary Cornell。 最后,还得感谢 Barr 夫妇,多谢他们配制的苏格兰另类民族饮料。 SQL Server 2008 基础教程 目录 目录 第 1 章 SQL Server 2008 概述和安装 1 1.1 为什么选择 SQL Server 20081 1.2 SQL Server 的发展 3 1.3 硬件要求 4 1.3.1 CPU4 1.3.2 内存 4 1.3.3 硬盘空间 5 1.3.4 操作系统要求 5 1.4 示例 5 1.5 安装 5 1.5.1 开始安装 6 1.5.2 选择要安装的功能 7 1.5.3 为实例命名 9 1.5.4 选择服务账户 10 1.5.5 选择身份验证模式 10 1.5.6 确定数据目录的位置 11 1.5.7 创建报表服务数据库 12 1.5.8 配置错误和使用情况报告 13 1.6 安全性 14 1.6.1 服务账户 14 1.6.2 身份验证模式 15 1.6.3 sa 登录 19 1.7 小结 20 第 2 章 SSMS21 2.1 SSMS 概览 21 2.2 SSMS 的选项 29 2.2.1 “环境”节点 29 2.2.2 “源代码管理”节点 31 2.2.3 “文本编辑器”节点 31 2.2.4 “查询执行”节点 33 2.2.5 “查询结果”节点 35 2.3 查询编辑器 41 2.4 小结 42 第 3 章 设计和创建数据库 43 3.1 数据库的定义 44 3.2 SQL Server 中的预建数据库 45 3.2.1 master45 3.2.2 tempdb46 3.2.3 model47 3.2.4 msdb47 3.2.5 AdventureWorks/Adventure-WorksDW47 3.3 选择数据库系统类型 48 3.3.1 OLTP48 3.3.2 OLAP49 3.3.3 示例系统类型选择 49 3.4 收集数据 49 3.5 确定要存储在数据库中的信息 51 3.5.1 金融产品 52 3.5.2 客户 52 3.5.3 客户地址 52 3.5.4 股票 52 3.5.5 交易 53 3.6 外部信息和忽略的信息 53 3.7 建立关系 53 3.7.1 使用键 53 3.7.2 创建关系 55 3.7.3 关于外键的更多信息 57 3.8 规范化 59 3.8.1 每一个实体都应该有唯一的标识符 59 3.8.2 只存储与实体直接有关的信息 60 3.8.3 避免重复值或重复列 60 3.8.4 范式 60 3.8.5 非规范化 62 3.9 创建示例数据库 62 3.9.1 在 SSMS 中创建数据库 62 3.9.2 在 SSMS 中删除数据库 75 3.9.3 在查询编辑器中创建数据库 77 3.10 小结 80 第 4 章 安全和遵从规范 81 4.1 登录名 81 4.2 服务器登录名和数据库用户 89 4.3 角色 90 4.3.1 固定服务器角色 90 4.3.2 数据库角色 92 4.3.3 应用程序角色 92 4.4 架构 95 4.5 在解决方案中进行下去之前 96 4.6 陈述式管理框架 99 4.7 小结 104 第 5 章 定义表 106 5.1 什么是表 106 5.2 SQL Server 数据类型 107 5.2.1 表中的数据类型 108 5.2.2 程序中的数据类型 113 5.3 列不仅仅是简单的数据存储库 113 5.3.1 默认值 113 5.3.2 生成 IDENTITY 值 113 5.3.3 NULL 值的使用 114 5.3.4 为什么要定义允许 NULL 值的列 114 5.4 在 SQL Server 中存储图像和大型文本 115 5.5 在 SSMS 中创建表 115 5.6 通过查询编辑器创建表 120 5.7 创建表:使用模板 122 5.8 创建模板和修改模板 125 5.9 ALTER TABLE 语句 126 5.10 定义其余的表 127 5.11 设置主键 128 5.12 创建关系 129 5.12.1 在创建时检查现有数据 131 5.12.2 强制外键约束 132 5.12.3 选择删除/更新规则 132 5.13 通过 T-SQL 语句建立关系 133 5.14 小结 134 第 6 章 创建索引和数据库关系图 135 6.1 什么是索引 135 6.1.1 索引类型 136 6.1.2 唯一性 137 6.2 确定是什么创建了好的索引 138 6.2.1 使用低维护列 138 6.2.2 主键和外键 139 6.2.3 找到指定记录 139 6.2.4 使用覆盖索引 139 6.2.5 查找信息范围 139 6.2.6 保持数据的排序 140 6.3 确定是什么导致了坏的索引 140 6.3.1 使用了不合适的列 140 6.3.2 选择了不合适的数据 141 6.3.3 包含了过多的列 141 6.3.4 表中包含的记录过少 141 6.4 针对性能对索引进行审查 141 6.5 创建索引 142 6.5.1 用表设计器创建索引 142 6.5.2 索引和统计信息 145 6.5.3 CREATE INDEX 语法 145 6.5.4 在查询编辑器中创建索引:模板 148 6.5.5 在查询编辑器中创建索引:SQL 代码 151 6.6 删除索引 153 6.7 在查询编辑器中修改索引 154 6.8 当索引不存在时 155 6.9 为数据库生成关系图 156 6.9.1 数据库关系图基础 156 6.9.2 SQL Server 数据库关系图工具 157 6.9.3 默认的数据库关系图 158 6.9.4 数据库关系图工具条 160 6.10 小结 162 第 7 章 数据库的备份、还原和维护 163 7.1 事务日志 164 7.2 备份策略 166 7.3 当可能发生错误时 167 7.4 让数据库脱机 168 7.5 备份数据 169 7.5.1 使用 T-SQL 备份数据库 174 7.5.2 使用 T-SQL 进行日志备份 180 7.6 还原数据库 182 7.6.1 使用 SSMS 还原数据 183 7.6.2 使用 T-SQL 进行还原 185 7.7 分离和附加数据库 189 7.7.1 使用 SSMS 进行分离和附加操作 189 7.7.2 使用 T-SQL 进行分离和附加操作 193 7.8 为数据库生成 SQL 脚本 195 7.9 维护数据库 201 7.10 创建数据库维护计划 201 7.11 设置数据库邮件 213 7.12 修改维护计划 221 7.13 小结 224 第 8 章 操作数据 225 8.1 T-SQL 的 INSERT 命令的语法 225 8.2 SQL 命令 INSERT226 8.2.1 默认值 229 8.2.2 使用 NULL 值 229 8.3 DBCC CHECKIDENT232 8.4 列约束 234 8.5 同时插入多条记录 238 8.6 检索数据 239 8.7 使用 SSMS 检索数据 240 8.8 SELECT 语句 241 8.9 指定列 243 8.10 第一批搜索 243 8.11 改变输出的显示 245 8.12 限制搜索:WHERE 的使用 247 8.12.1 SET ROWCOUNT n249 8.12.2 TOP n250 8.12.3 TOP n PERCENT251 8.13 字符串函数 251 8.14 顺序!顺序!253 8.15 LIKE 运算符 254 8.16 生成数据:SELECT INTO256 8.17 谁能添加、删除或选取数据 257 8.18 更新数据 261 8.18.1 UPDATE 命令 262 8.18.2 在查询编辑器中更新数据 263 8.19 事务 266 8.19.1 BEGIN TRAN267 8.19.2 COMMIT TRAN268 8.19.3 ROLLBACK TRAN268 8.19.4 锁定数据 268 8.19.5 更新数据:使用事务 269 8.19.6 嵌套事务 270 8.20 删除数据 272 8.20.1 DELETE 的语法 272 8.20.2 使用 DELETE 语句 272 8.21 截断表(删除表中的所有行)274 8.22 删除表 275 8.23 小结 275 第 9 章 构建视图 277 9.1 为什么要构建视图 278 9.2 针对安全而使用查询 278 9.3 加密视图定义 279 9.4 创建视图:SSMS280 9.5 使用视图来创建视图 284 9.6 CREATE VIEW 语法 289 9.7 创建视图:查询编辑器窗格 290 9.8 创建视图:SCHEMABINDING291 9.9 为视图设置索引 293 9.10 小结 295 第 10 章 存储过程和函数 297 10.1 什么是存储过程 298 10.2 CREATE PROCEDURE 语法 298 10.3 返回一系列记录 301 10.4 创建存储过程:SSMS301 10.5 执行存储过程的不同方法 305 10.5.1 不使用 EXEC305 10.5.2 使用 EXEC305 10.6 使用 RETURN305 10.7 控制流程 309 10.7.1 IF...ELSE309 10.7.2 BEGIN...END310 10.7.3 WHILE...BREAK 语句 310 10.7.4 CASE 语句 312 10.8 综合应用 314 10.9 用户定义函数 316 10.9.1 标量函数 316 10.9.2 表值函数 317 10.9.3 创建用户定义函数时要考虑的事项 317 10.10 小结 319 第 11 章 T-SQL 基础 320 11.1 使用多个表 320 11.2 变量 325 11.3 临时表 326 11.4 聚合 328 11.4.1 COUNT/COUNT_BIG329 11.4.2 SUM329 11.4.3 MAX/MIN330 11.4.4 AVG330 11.5 分组数据 331 11.6 HAVING332 11.7 独特值 333 11.8 函数 333 11.8.1 日期和时间函数 334 11.8.2 字符串函数 336 11.8.3 系统函数 340 11.9 RAISERROR343 11.10 错误处理 347 11.11 @@ERROR347 11.12 TRY...CATCH348 11.13 小结 351 第 12 章 高级 T-SQL352 12.1 子查询 352 12.1.1 IN354 12.1.2 EXISTS354 12.1.3 了结未了之事 355 12.2 APPLY 运算符 356 12.2.1 CROSS APPLY357 12.2.2 OUTER APPLY358 12.3 公用表表达式 358 12.4 透视数据 361 12.4.1 PIVOT361 12.4.2 UNPIVOT363 12.5 排名函数 363 12.5.1 ROW_NUMBER364 12.5.2 RANK366 12.5.3 DENSE_RANK366 12.5.4 NTILE367 12.6 SQL Server 中的 PowerShell367 12.7 小结 371 第 13 章 触发器 372 13.1 什么是触发器 372 13.2 DML 触发器 373 13.3 针对 DML 触发器的 CREATE TRIGGER 语法 374 13.4 为什么不使用约束 375 13.5 对逻辑表进行删除和插入 376 13.6 创建 DML FOR 触发器 377 13.7 检查特定的列 380 13.7.1 使用 UPDATE()380 13.7.2 使用 COLUMNS_UPDATED()384 13.8 DDL 触发器 387 13.8.1 DDL_DATABASE_LEVEL_EVENTS387 13.8.2 删除 DDL 触发器 389 13.8.3 EVENTDATA()389 13.9 小结 392 第 14 章 SQL Server 2008 Reporting Services393 14.1 Reporting Services 的架构 394 14.2 配置 Reporting Services395 14.3 使用报表设计器构建第一个报表 400 14.4 小结 406 1.1 为什么选择 SQL Server 2008 第 1 章 SQL Server 2008 概述和安装 欢迎阅读本书。如果你对 SQL Server 2008 尚不了解,但对使用 Microsoft SQL Server 2008创建解决方案很有兴趣,本书就是为你编写的。你可能熟悉其他一些数据库(如MySQL、 Oracle 或者 Microsoft Access),但相对于其他的数据库产品,SQL Server 无论是在界面上 还是在工作方式上都有所不同。本书旨在使读者快速达到游刃有余地使用 SQL Server 2008 进行开发的水平。本书专门针对 SQL Server 2008 的新手,以及即将开始使用 SQL Server 2008 的读者,同时,它还适用于那些曾经使用 SQL Server 2005 并想快速掌握学习 SQL Server 2008 的方法的读者。本书对于读者理解市面上其他数据库产品的基础知识也大有裨益,尤其是在 使用 T-SQL 方面。由于许多数据库都使用基于 ANSI 标准的 SQL,因此在学完本书之后, 从 SQL Server 转向 Oracle、Sybase 等数据库也更为容易。 本章包含以下主题。 为什么选择 SQL Server 2008? 怎样知道硬件是否符合要求? 是否可以确定拥有合适的操作系统? 使用 SQL Server 2008 能够做什么? 接下来关注所选定版本的安装,并介绍以下内容。 在 Windows XP 平台上安装 SQL Server 2008。 默认没有安装的选项。 SQL Server 实际上安装在何处? 一台计算机上的多个安装。 SQL Server 在机器上如何运行? 如何实现安全性? SQL Server 的登录 ID,特别是 sa(系统管理员)登录。 1.1 为什么选择 SQL Server 2008 下面的论述是我个人的观点,无疑与其他人的观点会有所不同,但讨论的基础是没有问 题的。SQL Server 面对的数据库竞争产品,不仅有同样来自微软的其他数据库(如 Microsoft Access 和 Microsoft Visual FoxPro),而且还有来自竞争对手的数据库(如 Oracle、Sybase、 DB2 和 Informix 等)。 大量的 PC 上都运行着 Microsoft Access。多年来,该数据库一直是一些版本的 Office 软件包中的一个组件,这一事实使得 Microsoft Access 的身影随处可见。事实上许多人的确 在使用这种数据库。遗憾的是,这种数据库在可扩缩性、速度以及灵活性上都有局限性。当 然对于许多小型的内部系统而言,它们不需要太强的数据库功能,因而这些方面的不足并不 算是问题。 那么,来看看与 SQL Server 真正旗鼓相当的对手:Oracle 和 Sybase。在数据库领域, Oracle 常常被认为是市场领导者,有着非常庞大的用户基础。虽然在安装和管理上,Oracle 比 SQL Server 复杂些,但不可否认,它是一个非常棒的产品,非常适宜为大公司提供大型 解决方案。Oracle 有许多部件,这使得该产品功能强大,在可扩缩性和性能方面不可小觑。 Oracle 还非常灵活,允许使用者按需要添加工具,在这一方面 Oracle 比 SQL Server 具有更 强的适应性。例如,无论用户是否需要使用新的.NET 特性,SQL Server 2008 都要求用户必 须在服务器上安装.NET Framework。然而,从开发者的角度来看,Oracle 的使用在许多方面 都不太方便,例如,专门的 SQL Query 工具、XML 和 Web 技术工具,以及建立完整数据库 解决方案的方式。Oracle 的其他一些缺点还包括它较高的价格以及在安装和高效运行上的复 杂性。尽管 SQL Server 也能同样高效地工作,但 Web 搜索引擎还是广泛地使用 Oracle。具 有新功能的 SQL Server 2008 将给 Oracle 带来压力,迫使其扩展现有的功能以迎接挑战。SQL Server 采取的向来是一次性购买的解决方案,如果购买了正确版本的 SQL Server,那么用于 分析数据或从一个数据源(如 Excel)向 SQL Server 中复制数据的所有工具都将包含于其中。 而对于 Oracle,必须额外购买所需要的每一个附加特性。 接着来看看 Sybase。Sybase 与 SQL Server 十分相似,它们之间的主要不同是:Sybase 没有图形用户界面前端。主要用于小规模安装的 Sybase iAnywhere 是有前端的,但高端的 Sybase 没有。有些人可能认为图形用户界面前端首先是为那些不懂如何写代码的人准备的 (当然,这是他们的一家之言),因而没有必要设计图形用户界面前端,但是既然指向、点 击和拖动就可以搞定,为什么还要按下 60 多个键呢? 虽然 Sybase 有用于 Windows 的版本,但它主要还是用在 UNIX 上。尽管可以通过工具 从 Windows 的机器连接到 UNIX 上的 Sybase,但依然要完全用代码来建立数据库解决方案。 Sybase 非常快也十分稳健,一年通常只需重启一两次。关于 Sybase 的另一点是,它没有 SQL Server 那样丰富的命令和特性。SQL Server 有更加强大的编程语言,功能也比 Sybase 强大。 每个数据库都有其特有的 SQL 语法,尽管它们的基本 SQL 语法是一致的,即公认的 ANSI-92 标准。这意味着用于检索数据等的语法在数据库之间是相同的,但每个数据库用于 维护的语法是其自身特有的。若试图在一个数据库中使用源自另一个数据库的独特 SQL 语 法,可能是无效的,也可能所起的作用大相径庭。 因此,SQL Server 在数据库市场中似乎是最佳的选择,而且在很多情形下也确实如此。 它可以小到只用于少量用户,也可以大到足以支持最大的企业。它没有 Oracle 或者 Sybase 那样高的价钱,但却能向上扩展并处理太字节(TB)的数据而无需太多的考虑。你将会发 现,SQL Server 易于安装,并且由于 SQL Server 的大多数功能在一个完整的包中,当需要 剩余的功能时,执行简单的安装就够了。 既然知道了为何选择 SQL Server,接下来需要了解市面上有哪些可以购买的 SQL Server 版本,每种版本针对的市场是什么,什么版本对你最合适,以及你的机器上能够运行什么版 本。 1.2 SQL Server 的发展 1.2 SQL Server 的发展 SQL Server 经历多年后发展到了今天的产品。表 1-1 概述了这一发展历程。 表 1-1 SQL Server 发展历程 年份 版本 说明 1988 SQL Server 与 Sybase 共同开发的、运行于 OS/2 上的联合应用程序 1993 SQL Server 4.2 一种桌面数据库 一种功能较少的桌面数据库,能够满足小部门数据存储和处理 的需求。数据库与 Windows 集成,界面易于使用并广受欢迎 1994 微软与 Sybase 终止合作关系 1995 SQL Server 6.05 一种小型商业数 据库 对核心数据库引擎做了重大的改写。这是首次“意义非凡”的 发布,性能得以提升,重要的特性得到增强。在性能和特性上, 尽管以后的版本还有很长的路要走,但这一版本的 SQL Server 具 备了处理小型电子商务和内联网应用程序的能力,而在花费上却 少于其他的同类产品 1996 SQL Server 6.5 SQL Server 逐渐突显实力,以至于 Oracle 推出了运行于 NT 平 台上的 7.1 版本作为直接的竞争 1998 SQL Server 7.0 一种 Web 数据库 再一次对核心数据库引擎进行了重大改写。这是相当强大的、 具有丰富特性的数据库产品的明确发布,该数据库介于基本的桌 面数据库(如 Microsoft Access)与高端企业级数据库(如 Oracle 和 DB2)之间(价格上亦如此),为中小型企业提供了切实可行 (并且还廉价)的可选方案。该版本易于使用,并提供了对于其他 竞争数据库来说需要额外附加的昂贵的重要商业工具(例如,分析 服务、数据转换服务),因此获得了良好的声誉 2000 SQL Server 2000 一种企业级数据 SQL Server 在可扩缩性和可靠性上有了很大的改进,成为企业 级数据库市场中重要的一员(支持企业的联机操作,其所支持的 企业有 NASDAQ、戴尔和巴诺等)。虽然 SQL Server 在价格上有 库 很大的上涨(尽管算起来还只是 Oracle 售价的一半左右),减缓 了其最初被接纳的进度,但它卓越的管理工具、开发工具和分析 工具赢得了新的客户。2001 年,在 Windows 数据库市场(2001 年价值 25.5 亿美元),Oracle(34%的市场份额)不敌 SQL Server (40%的市场份额),最终将其市场第一的位置让出。2002 年, 差距继续拉大,SQL Server 取得 45%的市场份额,而 Oracle 的市 场份额下滑至 27%(来源于 2003 年 5 月 21 日的 Gartner Report) 2005 SQL Server 2005 对 SQL Server 的许多地方进行了改写,例如,通过名为集成服 务(Integration Service)的工具来加载数据,不过,SQL Server 2005 最伟大的飞跃是引入了.NET Framework。引入.NET Framework 将允许构建.NET SQL Server 专有对象,从而使 SQL Server 具有灵 活的功能,正如包含 Java 的 Oracle 所拥有的那样 2008 SQL Server 2008 SQL Server 2008 以处理目前能够采用的许多种不同的数据形式为 目的,通过提供新的数据类型和使用语言集成查询(LINQ),在 SQL Server 2005 的架构的基础之上打造出了 SQL Server 2008。SQL Server 2008 同样涉及处理像 XML 这样的数据、紧凑设备(compact device)以及位于多个不同地方的数据库安装。另外,它提供了在一 个框架中设置规则的能力,以确保数据库和对象符合定义的标准,并 且,当这些对象不符合该标准时,还能够就此进行报告 1.3.1 CPU 1.3.2 内存 确认系统的处理器速度足以满足需求后,接着要检查系统中是否有足够的内存。SQL Server 需要的 RAM 至少为 512 MB。不应该打开和运行太多的应用程序,因为那样很容易 让 SQL Server 得不到足够的内存,从而使其运行变慢。微软推荐 1 GB 或者更大的内存,当 真正开始使用 SQL Server 时,实际上内存大小至少应该是推荐大小的两倍。 如果要运行企业版,特别是若想要使用更高级的特性时,则至少(最低限度)需要有 1 GB 的内存。 内存越大越好。对于任何开发人员所使用的计算机,强烈建议至少要有 1 GB 的内存, 若有 2 GB 则比较理想,这样才能够获得良好而全面的性能。如果内存足够大,那么进程就 可以保持在内存中,而不是在要运行另一个进程时,将进程交换到硬盘上或别的区域中,因 而当要从进程停止的地方继续运行时,则不必等待 SQL Server 被重新载入回内存。上面的 情形称为交换(swapping),内存越大,可能发生的交换就越少。 将 CPU 速度和内存作为一个整体来考虑,对于计算机运行速度至关重要的正是这两方 面因素。当运行速度足够快时,开发的速度也会尽可能地快。 在 SQL Server 的安装过程中,内存不足不会导致安装停止,但会发出警告,以告知你 需要更多的内存。 1.3 硬件要求 在对 SQL Server 稍有了解之后,接下来要涉及的重要问题很可能是:“我所拥有的计算 机是否足以运行所选择的 SQL Server 版本?这是否有助于我的决策?” 若根据现今的最低硬件规格标准来判断,哪怕是最低成本的方案,多数情况下对于大部 分的 SQL Server 版本,其答案都是肯定的。然而,手边可能会有较早的硬件(事物发展得 如此之迅速,即便是几个月前购买的硬件,也可能很快就被认为是低于当前最低硬件规格标 准的),因此,需要了解一下最低硬件要求是什么,并以此检查所拥有的计算机,以确定是 否具备满足需求的硬件资源。 1.3.1 CPU 对于运行 SQL Server 的 CPU,建议的最低要求是 32 位版本对应 1 GHz 的处理器,64 位版本对应 1.6 GHz 的处理器,或兼容的处理器,或具有类似处理能力的处理器,但推荐使 用 2 GHz 的处理器。然而,像这里列出的大多数最低要求一样,微软事实上推荐的是更快 的处理器。处理器越快,SQL Server 运行得就越好,由此而产生的瓶颈也越少。现在的很多 机器使用的都是 2 GHz 及以上的处理器。这将缩减开发所花费的时间。 然而,跟提升 SQL Server 的运行速度相关的硬件并非只有处理器,SQL Server 的速度 很大程度上也受当前计算机中内存空间的影响。 1.3.3 硬盘空间 SQL Server 需要比较大的硬盘空间。这不足为奇,如今主要的应用程序都是需要大量的 硬盘空间的。不考虑要添加的数据文件,SQL Server 自身将占用 1 GB 以上的硬盘空间。当 然,本章后面要用到的安装选项将决定总共所需的硬盘空间。通过选择不安装某个可选部件, 可以减少对硬盘空间的需求,例如,选择不安装联机丛书。不过,如今大多数的笔记本电脑 都至少配有 40 GB 的硬盘,配备 80 GB 的硬盘也是很平常的事。硬盘空间是廉价的,因此, 最好是购买容量远远超出当前所需容量的硬盘,而不要采用恰好满足眼下空间大小要求的硬 盘,使得将来可能不得不另行购买硬盘以满足增长的要求,这样将随之带来移动资料、整理 原先硬盘上的空间等问题。 此外,还需要在硬盘上留有备用的空间,以满足 SQL Server 和数据库的扩展。另外, 还需要为开发过程中要用到的临时文件准备硬盘空间。总之,考虑大的硬盘空间吧——多多 益善! 1.3.4 操作系统要求 SQL Server 2008 可以运行在 Windows Vista Home Basic 及更高版本上,也可以在 Windows XP 上运行。从服务器端来看,它可以运行在 Windows Server 2003 SP2 及 Windows Server 2008 上。它也可以运行在 Windows XP Professional 的 64 位操作系统上以及 Windows Server 2003 和 Windows Server 2008 的 64 位版本上。因此,可以运行 SQL Server 的操作系 统是很多的。 1.4 示例 为了充分展示 SQL Server 2008,我们将一起为一家金融公司开发一个系统,该系统具 有存款、股票购买功能。该应用程序适合大型机构,或者经过稍加修改也能够供个人记录银 行业务使用。 本书基于这种观念来开发实例,演示如何将所采纳的想法在设计中用正确的架构表达出 来。由于不想把注意力从 SQL Server 转移开,因而没有对这个例子做更多的处理,应该说 只是刚好能运行而已。通过学习本书,你将具备足够的知识和能力来根据实际金融应用程序 的需求扩展这个例子,使其细节和复杂度能够完全满足实际所需。 当然,在讲述这些之前,首先要安装 SQL Server。 1.5 安装 本章将介绍 SQL Server 开发版的安装过程,事实上在每一种版本的安装过程中所看到 的几乎都一样。微软在 http://www.microsoft.com/china/sql/2008/trial-software.aspx 提供了 180 天试用版,如果手头没有 SQL Server 2008,可以使用这种试用版来学习本书的例子。 本书要讲述的选项和特性组合可以在安装过程中完成。安装过程中包含 SQL Server 提 供的许多不同的工具。先来看看这些工具,以便对它们有基本的了解,从而决定将安装什么。 安装包含很多不同的范围: 安全问题; 不同的安装类型——是首次安装并且安装的是 SQL Server 的第一个实例,还是用于开 发、测试或生产的后续实例的安装; 自定义安装; 只安装少许有用的产品。 本章介绍的安装过程将涉及这些范围中的大多数,因此,到本章末,读者将具备足够的 自信和知识来根据自己的需要完成任何后续的安装。 本书选择使用开发版是因为该版本最符合开发者所需,它没有企业版对于操作系统的种 种要求。在光驱中插入所选择版本的 Microsoft SQL Server 2008 光盘,启动安装程序。接下 来讲述标准安装。 1.5.1 开始安装 首先,确保以管理员身份登录,从而能够在机器上创建文件和文件夹,这显然是成功安 装所必需的。 如果是使用 CD-ROM 进行安装,并且安装进程没有自动启动,就打开 Windows 资源管 理器并双击 autorun.exe(位于 CD-ROM 根目录)。如果不使用 CD-ROM 进行安装,则双击 你下载的可执行的安装程序。 如果当前没有安装 Microsoft .NET Framework 3.5 版,则会出现该版本的安装对话 框。.NET 是微软创建的一种框架,允许用不同编程语言(如 VB .NET、C#以及其他)编写 的程序有一个公共编译环境。SQL Server 2008 在其自身内部的一些工作要使用 .NET,当然, 开发人员也可以用任何微软的 .NET语言编写 .NET代码,放入SQL Server中。在SQL Server 2008 中,除了可以用 T-SQL 以外,还能够使用.NET 和 LINQ 来查询数据库。 注解 包含.NET 代码是超出本书讲述范围的高级主题。更多相关信息请参看由 Robin Dewson 和 Julian Skinner 编写的 Pro SQL Server 2005 Assemblies(Apress, 2005)。 安装完成后,会出现“SQL Server 安装中心”。如图 1-1 所示,该对话框涉及计划一个安 装,设定安装方式(包括全新安装,从以前版本的 SQL Server 升级),以及用于维护 SQL Server 安装的许多其他选项。 单击安装中心左边的“安装”条目,然后,从“安装”选项列表中选择第一个项目,即“全 新 SQL Server 独立安装或向现有安装添加功能”,这样就开始了 SQL Server 2008 的安装。 在输入产品密钥并接受 SQL Server 许可条款之前,将进行快速的系统检查。在 SQL Server 的安装过程中,要使用大量的支持文件,此外,支持文件也用来确保无瑕的和有效的 安装。在图 1-2 中,可以看到快速系统检查过程中有一个警告,但仍可以继续安装。假如检 查过程中没出现任何错误,则单击“下一步”。 (点击查看大图)图 1-1 使用“SQL Server 安装中心”开始安装 (点击查看大图)图 1-2 系统配置检查 1.5.2 选择要安装的功能 接着,来到"功能选择"界面,需要作出一些决定。如图 1-3 所示,此处的安装会安装所 有的功能,因为这将是一个开发实例,开发者将脱离所有正在进行的项目开发来测试 SQL Server 的各个方面。不过,也可以根据需要,有选择性地安装各种组件。就本书而言,需要 安装"数据库引擎服务"、"Reporting Services"、"客户端工具"以及用来创建报表的"Business Intelligence Development Studio",因此,请确保至少选中了这些功能。 (点击查看大图)图 1-3 选择安装所有的组件 下面简要说明一下图 1-3 中的大部分组件。 数据库引擎服务。这是 SQL Server 2008 的主要核心,安装 SQL Server 运行所需的主要 引擎、数据文件等。 SQL Server 复制。当你在数据库上执行数据修改时,如果你不仅想要把修改发送到该数 据库上,而且想要把修改发送到一个相似的数据库上(这个相似数据库是为了复制修改而创 建的),那么你可以使用这一选项把修改复制到那个数据库上。 全文搜索。这一选项允许对数据库中的文本进行搜索。 Analysis Services。使用该工具可以获取数据集,并对数据切块、切片,分析其中所包 含的信息。 Reporting Services。这一服务允许从 SQL Server 生成报表,而不必借助第三方工具,如 Crystal Report。该组件将在第 14 章详细讲述。 客户端工具。这些工具中,一些为客户端机器提供到 SQL Server 的图形化界面,另一 些则在客户端协同 SQL Server 一起工作。这一选项适于布置在开发人员的机器上。 Microsoft Sync Framework。当与脱机应用程序(例如,移动设备上的应用程序)一起 工作时,必须在适当的地方存在某种同步机制。这一选项允许发生这些交互。 SQL Server 联机丛书。这是一个帮助系统。如果在 SQL Server 的任何方面需要更多的 信息、说明或额外的详细资料,请求助于联机丛书。 Business Intelligence Development Studio。如果你想要使用基于分析的服务来分析数据, 那么可以使用这个图形用户界面与数据库进行交互。本书不介绍这个选项。 Integration Services。最后这个选项使你能够创建完成行动的过程,例如,从其他数据源 导入数据并使用这些数据。在第 7 章中,当我们考虑创建一个备份维护计划时,将看到 Integration Services 的实际运作。 在以上这些组件中,Analysis Services、Business Intelligence Development Studio 超出了 本书的范围,我们只简单介绍这里提到的 Integration Services。 注解 此刻,SQL Server 不再提供安装示例数据库的选项。微软也改变了示例数据库和 示例的交付方式,因而你可以在 SQL Server 网站上(http://www.microsoft.com/sql 或 http://www.codeplex.com/SqlServerSamples)找到更新的版本。 1.5.3 为实例命名 众所周知,SQL Server 是安装在计算机上的,那么在一台计算机上多次安装 SQL Server 是完全有可能的。如果服务器功能强大,有足够的资源(如内存、处理器等)运行两三个不 同的应用程序,这种情形就可能出现。这些不同的应用程序都想拥有自己的 SQL Server。每 一个安装称为一个实例(instance)。现在应该为安装的实例命名。每一个实例必须有一个 属于它的唯一的名字,就连"无名"的默认实例(default instance),其"无名"也算是一个唯一 的名字。 作为建立外部环境的第一步,为实例命名是很重要的。例如,可能有一个实例用于开发, 一个实例用于系统测试,最后还有一个实例用于用户测试。让除生产数据库之外的任何东西 与生产数据库共享生产服务器硬件,这是一种很糟糕的习惯。如果无视这种提醒,当出现不 当的开发行为并导致服务器崩溃时,将会使连续的生产停顿下来。虽然,眼下的安装过程一 开始的时候,你就应该作出决定,但是,在为实例命名时再次提醒注意,这也是有帮助的。 当没有为安装指定明确的名字时,将选定为默认实例。一旦在学习环境之外安装 SQL Server,则应避免这种情况,因为这样会导致没有命名的安装,因而关于它的使用也没有任 何提示。因为目前尚在学习阶段,而最易于理解的选项是使用默认实例,所以如图 1-4 所示, 选择"默认实例",并单击"下一步"。一旦在服务器上安装了实例, (点击查看大图)图 1-4 为安装的实例命名 就会在这里列出已安装的实例。另外,对于前一步中所选的 3 个服务,我们还可以在这里看 到每一个服务的目录的详细路径。 【责任编辑:云霞 TEL:(010)68476606】 1.5.4 选择服务账户 正如用户在使用系统前必须先登录到 Windows 一样,SQL Server 以及在"功能选择"界 面(见图 1-3)中定义的其他服务在启动前也必须先登录到 Windows。SQL Server、Reporting Services 等服务不需要任何人登录到安装 SQL Server 的计算机上就可以运行,只要计算机成 功启动即可。当 SQL Server 安装在位于远程服务器机房中的服务器上时,这种情况极为平 常。 在本章的结尾,我们会更详细地讨论这些选项。图 1-5 中所示的选择将用低级别特权安 装 SQL Server。 (点击查看大图)图 1-5 选择服务账户 以后,通过"控制面板"中的"管理工具"里的"服务"图标,你也总能对此进行更改。然而, 使用"配置工具"中的"SQL Server 配置管理器"或许会更好些。通过使用"SQL Server 配置管理 器",将会把账户添加到正确的组中,并给予恰当的权限。单击"下一步"。 如果你注意到 SQL Server Browser(即 SQL Server Management Studio 的另一个名字), 会发现它默认是被禁用的。多数的 SQL Server 安装是在服务器上,并且常常是远程服务器 上,因此,没必要让 SQL Server Browser 运行。一般来说,你会从客户端机器上连接到 SQL Server。尽管如此,这里还是假设该 SQL Server 安装并非在服务器上,而是在一台本地计算 机上,因此,将该选项更改为自动启动。 1.5.4 选择服务账户 正如用户在使用系统前必须先登录到 Windows 一样,SQL Server 以及在"功能选择"界 面(见图 1-3)中定义的其他服务在启动前也必须先登录到 Windows。SQL Server、Reporting Services 等服务不需要任何人登录到安装 SQL Server 的计算机上就可以运行,只要计算机成 功启动即可。当 SQL Server 安装在位于远程服务器机房中的服务器上时,这种情况极为平 常。 在本章的结尾,我们会更详细地讨论这些选项。图 1-5 中所示的选择将用低级别特权安 装 SQL Server。 (点击查看大图)图 1-5 选择服务账户 以后,通过"控制面板"中的"管理工具"里的"服务"图标,你也总能对此进行更改。然而, 使用"配置工具"中的"SQL Server 配置管理器"或许会更好些。通过使用"SQL Server 配置管理 器",将会把账户添加到正确的组中,并给予恰当的权限。单击"下一步"。 如果你注意到 SQL Server Browser(即 SQL Server Management Studio 的另一个名字), 会发现它默认是被禁用的。多数的 SQL Server 安装是在服务器上,并且常常是远程服务器 上,因此,没必要让 SQL Server Browser 运行。一般来说,你会从客户端机器上连接到 SQL Server。尽管如此,这里还是假设该 SQL Server 安装并非在服务器上,而是在一台本地计算 机上,因此,将该选项更改为自动启动。 Server。尽管如此,这里还是假设该 SQL Server 安装并非在服务器上,而是在一台本地 计算机上,因此,将该选项更改为自动启动。 1.5.5 选择身份验证模式 现在,将定义如何在 SQL Server 的安装中强制实施安全性。如图 1-6 所示,这里有两 个选择:Windows 身份验证模式和混合模式。在本章的后面,你将了解更多关于模式的知 识。十分简单明了,Windows 身份验证模式表明将使用 Windows 的安全机制维护 SQL Server 的登录,混合模式则或者使用 Windows 的安全机制,或者使用 SQL Server 定义的登录 ID 和密码。此外,如果使用混合模式,还需要为名为 sa 的特殊登录 ID 设置密码。关于这些, 你很快就会了解到更多,但目前必须为其输入一个有效的密码。请使用有意义的、难以猜测 的密码,同时你自己要记牢。 (点击查看大图)图 1-6 选择身份验证模式(包括 SQL Server 管理员账户) 另外,还必须指定 SQL Server 管理员账户。这是一个特殊的账户,在极其紧急的情况 下(例如,当 SQL Server 拒绝连接时),能够使用这个账户进行登录。你可以用这个特殊 的账户登录,对当前的情形进行调试,并让 SQL Server 恢复运行。通常,管理员账户是某 个服务器账户 ID,但现在,我们使用了登录到计算机上的这个当前账户。 对于 Analysis Services 也会有类似的界面,并且,也使用相同的设置。 1.5.5 选择身份验证模式 现在,将定义如何在 SQL Server 的安装中强制实施安全性。如图 1-6 所示,这里有两 个选择:Windows 身份验证模式和混合模式。在本章的后面,你将了解更多关于模式的知 识。十分简单明了,Windows 身份验证模式表明将使用 Windows 的安全机制维护 SQL Server 的登录,混合模式则或者使用 Windows 的安全机制,或者使用 SQL Server 定义的登录 ID 和密码。此外,如果使用混合模式,还需要为名为 sa 的特殊登录 ID 设置密码。关于这些, 你很快就会了解到更多,但目前必须为其输入一个有效的密码。请使用有意义的、难以猜测 的密码,同时你自己要记牢。 (点击查看大图)图 1-6 选择身份验证模式(包括 SQL Server 管理员账户) 另外,还必须指定 SQL Server 管理员账户。这是一个特殊的账户,在极其紧急的情况 下(例如,当 SQL Server 拒绝连接时),能够使用这个账户进行登录。你可以用这个特殊 的账户登录,对当前的情形进行调试,并让 SQL Server 恢复运行。通常,管理员账户是某 个服务器账户 ID,但现在,我们使用了登录到计算机上的这个当前账户。 对于 Analysis Services 也会有类似的界面,并且,也使用相同的设置。 1.5.7 创建报表服务数据库 由于我们在前面选择了安装 Reporting Services,因此,需要创建报表服务器所使用的数 据库。对 Reporting Services 而言,有 3 个不同的安装选项:"本机"、"SharePoint"和"安装但 不配置"。如果选择最后一个选项,将在服务器上安装 SQL Server Reporting Services,但不 会对其进行配置。如果只是为了报表选项而构建特定的服务器,则该选项十分理想。安装完 成后,必须创建报表数据库。 如图 1-8 所示,本机模式配置是最简单的选项,也是我们要使用的选项。选择该选项, 将在 SQL Server 中安装 Reporting Services,并创建必需的数据库。仅当你在本地实例而非 远程实例上进行安装,并且 Reporting Services 也存在于那个本地实例上时,该选项才是有 效的。对服务账户,本地实例上(即 localhost)的报表服务器的 URL、报表管理器 URL 以 及报表服务数据库的名称使用默认值。 如果部署了 SharePoint 安装,并且想要 Reporting Services 使用该体系结构,则选择这一 选项,这一选项允许你使用 SharePoint 的功能。这些内容超出本书的讲述范畴。 (点击查看大图)图 1-8 为 Reporting Services 安装本机模式配置 1.5.7 创建报表服务数据库 由于我们在前面选择了安装 Reporting Services,因此,需要创建报表服务器所使用的数 据库。对 Reporting Services 而言,有 3 个不同的安装选项:"本机"、"SharePoint"和"安装但 不配置"。如果选择最后一个选项,将在服务器上安装 SQL Server Reporting Services,但不 会对其进行配置。如果只是为了报表选项而构建特定的服务器,则该选项十分理想。安装完 成后,必须创建报表数据库。 如图 1-8 所示,本机模式配置是最简单的选项,也是我们要使用的选项。选择该选项, 将在 SQL Server 中安装 Reporting Services,并创建必需的数据库。仅当你在本地实例而非 远程实例上进行安装,并且 Reporting Services 也存在于那个本地实例上时,该选项才是有 效的。对服务账户,本地实例上(即 localhost)的报表服务器的 URL、报表管理器 URL 以 及报表服务数据库的名称使用默认值。 如果部署了 SharePoint 安装,并且想要 Reporting Services 使用该体系结构,则选择这一 选项,这一选项允许你使用 SharePoint 的功能。这些内容超出本书的讲述范畴。 (点击查看大图)图 1-8 为 Reporting Services 安装本机模式配置 1.5.8 配置错误和使用情况报告 在 SQL Server 中,可以自动报告任何错误并把错误报告发送到微软,其中包含 SQL Server 异常关闭时的致命错误。推荐启用图 1-9 中的错误设置。因为不会发送组织机构的任 何信息,所以数据依然是安全的。这与在 Excel 崩溃时发送报告是类似的。最好是使该功能 处于激活状态。发送错误报告给微软,微软将有望更快地开发出补丁修复程序,并在将来发 布更好的版本。另外,对于 SQL Server 来说,用户可以获得如何使用 SQL Server 的信息。 打开这一功能也是非常有帮助的,这样微软能够接收到有助于改进其产品的信息。不管怎样, 在与这一功能更加密切相关的生产环境中,打开这一功能将会十分有益。 (点击查看大图)图 1-9 "错误和使用情况报告"设置 点击"下一步",将会出现关于安装规则详细信息的界面。在这里没什么可处理的,只是 点击"下一步"就可以了,这时将显示最终的界面(如图 1-10 所示)。现在完成了设置收集, 已经准备好进行安装了。 (点击查看大图)图 1-10 完成设置详情 1.6.1 服务账户 http://book.51cto.com 2009-05-15 11:12 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 1 章 SQL Server 2008 概述和安装,本章介绍了 SQL Server 中的安 全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。本节为大家介 绍服务账户。  标签:服务账户 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 1.6 安全性 为了透彻地讨论安装中遇到的"服务账户"对话框,需要深入研究 Windows 安全性。 本节中,首先考查 Windows 服务(而非程序)的概念,然后讨论在安装 SQL Server 时 可以选择的不同的身份验证类型。 1.6.1 服务账户 SQL Server 是作为一种 Windows 服务来运行的。那么,什么是服务?服务的一个很好 的例子是防病毒软件,它从用户重启计算机开始到计算机关闭为止持续运行。而程序要么是 载入到内存并运行着,要么是没有启动。运行服务的优势在于:如果一项工作可以作为服务 运行,Windows 就能够对那个进程做更多的控制。可以将服务设置为在任何用户登录以前 自动启动,而所有其他程序都需要用户先登录到 Windows,进而启动服务。 此外,服务完全没有用户界面。在运行时没有需要显示的表单,也没有要处理的用户输 入。与进程之间唯一的交互,或者是通过单独的用户界面(完全隔离的工作单元)链接到服 务中来进行(例如 SSMS),或者是从那个服务自身的 Windows 管理中进行。源自服务的 任何输出都必须输出到事件日志(Event Log)中,事件日志是用来存储服务所发出的通知 的 Windows 区域。 服务没有界面意味着对整个进程的控制无需用户的干预。倘使服务的设计良好, Windows 就能独自处理所有的可能性,并且能在任何用户登录到计算机之前启动服务。 在大多数生产环境中,SQL Server 是运行在远程服务器上的,该服务器可能锁藏于安全 的、受控制的地方,唯一能进入那里的人或许就是硬件工程师。在那里,甚至可能没有安装 远程访问程序,因为这可能带来对计算机的未经授权的访问。SQL Server 将在那里顺畅地运 行着,幸运的话,完全不发生任何错误。但是,如果某天发生了错误呢?假设 SQL Server 是作为程序运行的,则不得不采取某种对策。即使 SQL Server 崩溃了,至少还有某种机制 能够重新启动它。这意味着需要运行另外一个监视进程,而监视进程自身也可能导致大量问 题。然而,当 SQL Server 作为服务运行时,是在 Windows 的控制之下的。一旦发生问题, 无论是与 SQL Server 有关,还是与 Windows 有关,或是由任何外因所致,Windows 完全能 够通过服务进程来巧妙地处理发生的问题。 如果确实登录到了计算机上,那么,还可以用这个 Windows 用户 ID 登录 SQL Server 并启动它的服务。在你学习本书时,由于 SQL Server 可以运行在家庭或本地系统上,当你 进入 SQL Server 时,多半采用的是这种方式。这就是所谓的本地系统账户(local system account)。 另一方面,也可以创建一个完全用于 SQL Server 的 Windows 登录账户。这样做有几个 理由。举例来说,在对 Windows 账户进行一番设置后,账户的密码在使用了若干天后会过 期,或者在若干次输入错误密码的登录尝试后会锁定账户。如此一来,就从许多其他事物中 保护了计算机和网络。然而,SQL Server 应该使用单独的账户,该账户的密码同样会过期, 并且具有在若干次登录尝试失败后锁定账户的能力。这种非用户特定的"一般"账户去除了 SQL Server 和组织机构中人员间的联系。在图 1-5 中,如果考虑域用户账户选项,该账户多 半是在网络环境或生产环境中。有一种选择是为每一个服务指定一个不同的账户。当迁移至 公司环境中时,由于必须应对随之而来的安全问题,这会是非常至关重要的选择。 SQL Server 为不同的工作提供了几种不同的处理过程。SQL Server 用来运行 SQL Server 自己,而 SQL Server 代理运行一些处理过程,如批处理作业。实际上,SQL Server 只应访 问其自身。因此,只应该采用严格限制特权的域登录账户。 SQL Server 代理运行批处理和复杂任务(包括与其他服务器协同工作的复杂任务),需 要功能更强大的域账户。你的网络管理员可能已经创建了这些账户,并且知道对于这些任务 来说,最好使用哪个账户或者最好创建什么账户。 现在,进一步讨论在安装过程中对于身份验证模式所做的选择。 【责任编辑:云霞 TEL:(010)68476606】 1.6.2 身份验证模式(1) http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 1 章 SQL Server 2008 概述和安装,本章介绍了 SQL Server 中的安 全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。本节为大家介 绍身份验证模式。  标签:身份验证模式 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 1.6.2 身份验证模式(1) 将要应用于服务器上的身份验证模式,或许是整个安装过程中最至关重要的信息以及要 作出的最重大的决定。正如在前面的设置过程中看到的,关于身份验证模式有两个选择: Windows 身份验证模式(Windows authentication mode)和混合模式(mixed mode)。 1. Windows 身份验证模式 要登录到 Windows 2003/XP/Vista 机器上,必须提供用户名。关于这一点,没有选择的 余地(不像 Windows 9x/ME 那样,是否要提供用户名是可选的)。因此,要登录到 Windows, 必须先验证用户名和密码。当完成这一步时,Windows 事实上是在域控制器中根据用户名 凭据验证用户;或者,如果 Windows/SQL Server 是在本地的独立机器上运行,则进行本地 验证。凭据检查用户所属的访问组(用户权限)。用户可以上至管理员,具有改变计算机中 任何事物的能力,也可以下至基本用户,只拥有极其有限的权限。于是这就给出了一种信任 连接,换句话说,在登录 Windows 之后启动的应用程序可以相信,经 Windows 验证,账户 已经通过了必要的安全检查。 当应用 Windows 身份验证模式时,一旦登录到 Windows,SQL Server 就将使用信任连 接。如前面所述,这意味着 SQL Server 相信用户名和密码已被验证过了。可是,如果用户 名不存在,那么仅基于用户 ID,你将无法登录到那台机器上。如果登录无效,那么将检查 用户所属的 Windows 组,并检查其安全性,以确定该组是否可以访问 SQL Server。如果该 用户具有管理员权限,则至少连接到 SQL Server 上是完全不成问题的。 假如其他用户可以访问你的机器,那么使用他们的用户 ID 和密码也能够登录到机器上。 虽然这些用户可以通过找到 C 驱动器上的可执行文件到达 SQL Server,但 SQL Server 首先 要检查其在 SQL Server 中是否拥有有效的登录名。 目前的情况有点进退维谷。在安装过程中,需要了解安全性,可是要充分说明它意味着 要在 SSMS 中进行工作,这是第 2 章要讲述的内容。为了使其简单,现在先看一个涉及安 全性的例子。 练习:Windows 身份验证模式 (1) 确保以管理员身份登录到机器上。如果是本地计算机,有可能当前的登录名就是管 理员 ID;如果是网络中的计算机,并且不能确定访问权限,请求助于计算机管理人员帮助 解决 ID 和密码的问题。在 Windows Vista 中,如果想避免每一步都出现一个对话框向你确 认是否要继续,你需要修改用户账户控制的设置。 (2) 单击"开始"→"控制面板",选择"用户账户"。 (3) 当出现用户和密码对话框时,在 XP 上单击"创建一个新账户",在 Vista 上单击"管 理其他账户",随后再单击"创建一个新账户"。 (4) 如图 1-11 所示,当出现"为新账户起名"对话框时,输入用户名 JThakur。 (点击查看大图)图 1-11 创建新的用户账户 (5) 确保在 XP 指定的账户类型是"受限"或在 Vista 指定的账户类型是"标准用户"。这意 味着该账户没有管理员权限。然后单击"创建账户"。 (6) 因为要添加第二个用户名,故停留在"用户账户"对话框中。重复前述的步骤,并使 用如下资料: 用户名:VMcGlynn 账户类型:计算机管理员 (7) 从 Windows 中注销,然后用刚才创建的第一个 ID(JThakur)登录。 (8) 登录后,通过选择"开始"→"所有程序"→"Microsoft SQL Server 2008"→"SQL Server Management Studio",启动 SSMS。你需要在对话框中输入安装的服务器名称。在"服务器名 称"下拉列表中单击"浏览更多",然后选择"数据库引擎",再选择安装的服务器名称。在第 2 章中,将更详细地讲述这些内容。该对话框与图 1-12 显示的类似。 (点击查看大图)图 1-12 尝试连接到 SQL Server 1.6.2 身份验证模式(2) http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 1 章 SQL Server 2008 概述和安装,本章介绍了 SQL Server 中的安 全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。本节为大家介 绍身份验证模式。  标签:身份验证模式 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 1.6.2 身份验证模式(2) (9) 查看出现的错误信息,错误信息应该与在图 1-13 中所看到的类似。JThakur 作为一 个登录名没有在 SQL Server 中明确定义,并且也不属于允许访问的组。当前唯一的组是在 Windows 的 Administrators 组中的一个用户。回想前面,JThakur 是受限用户。 (点击查看大图)图 1-13 登录到服务器失败 (10) 接下来测试刚才创建的另一个用户。关闭 SQL Server,从 Windows 中注销,使用 创建的第二个 ID(VMcGlynn)登录。登录 Windows 以后,启动 SSMS 并连接到服务器上。 这一次可以成功登录。 前面创建的两个用户名,一个具有受限的访问权限(JThakur),另一个具有管理权限 (VMcGlynn)。无论怎样,这两个用户名都不存在于 SQL Server 中(毕竟没有在 SQL Server 中输入它们,它们似乎也没有因为某种魔力而出现)。那么,何以一个能成功登录而另一个 会失败呢? Windows 安全模式确保了两个 ID 都是有效的。如果 ID 或密码不正确,根本就不能登 录到 Windows。因此,当试图连接到 SQL Server 时,唯一进行的检查是:用户是以操作系 统的组成员身份访问 SQL Server 的,还是通过特定的登录用户账户访问的。正如图 1-14 所 示,JThakur 和 VMcGlynn 都不存在于 SQL Server 中。 图 1-14 SQL Server 的对象资源管理器 但是,在 SQL Server 的对象资源管理器中,可以看到一个名为 BUILTIN\Administrators 的 Windows 组。这意味着任何属于 Administrators 组的用户名都能够登录到 SQL Server 上。 从而避免了将用户设置为他们自己计算机的管理员(如果可能的话)。 在生产环境中,如果允许用户成为管理员,则将该组从系统中移除或许是可取的。由于 VMcGlynn 是 Administrators 组的成员,因而该用户名也是 BUILTIN\Administrators 组的成 员。 2. 混合模式 如果将 SQL Server 安装为混合模式,意味着既可以使用 Windows 身份验证(如前面所 述),也可以使用 SQL Server 身份验证。 混合模式与Windows 身份验证模式有何不同?首先,需要提供用户 ID 和密码进行连接, 而不是由 SQL Server 取用登入账户的 Windows ID 或登入账户用户所属的组;其次,并不认 定提供的 ID 都是有效的。当工作中用到 ISP 时,混合模式在许多情况下都是适宜的。为阐 明这一观点,假设用户要在本地客户端机器上使用远程数据进行工作,那么远程的机器需要 知道登录凭据,因而使用 SQL Server 身份验证将是最简单的方法。不过,请不要在这里弄 混了。如果想要在 ISP 上处理数据,ISP 可能提供了某种工具,或者,可以使用 SSMS 连接 到数据上。接下来,你就能够随心所欲地进行工作了。如果网站的代码是以 ASP.NET 编写 的,将使用 Windows 账户进行登录,因此,尽管可能锁定了 SQL Server 混合模式账户,也 不会妨碍网站正常工作。 当在第 4 章谈论安全性时,将学习到如何向 SQL Server 中添加用户名(而不是添加 Windows 用户)。 关于安全性,还有一点需要讨论,这就是 sa 登录。 【责任编辑:云霞 TEL:(010)68476606】 1.7 小结 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 1 章 SQL Server 2008 概述和安装,本章介绍了 SQL Server 中的安 全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。本节为本章的 小结部分。  标签:SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 1.7 小结 至此,读者应该了解了各种版本 SQL Server 之间的细微差别,同时还应该知道怎样检 查计算机是否适合安装 SQL Server。 在前面所讲述步骤的指引下,读者应该已经在计算机上成功安装了 SQL Server 2008, 甚至可能已经完成了两次安装,从而既安装了一个开发服务器又安装了一个测试服务器。这 是个好主意,如果到目前为止只有一个安装的话,可以考虑安装另一个。无论是在大型公司 工作,还是在人数极少的小公司工作,保持生产代码和开发代码的分离将极大降低复杂性(如 果在开发时,需要为生产做准备的话)。 本章介绍了 SQL Server 中的安全性,使读者能轻松地知晓自己想要以何种方式实现安 全性,以及如何处理不同的用户名。虽然目前可能还没有什么数据,但需要确保一旦有了数 据,只有合适的人才能够查看到它们。 现在,已经做好了系统学习 SQL Server 2008 的准备。管理 SQL Server 最好的方法之一 是使用 SSMS,接下来将讨论这方面的话题。 【责任编辑:云霞 TEL:(010)68476606】 1.7 小结 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 1 章 SQL Server 2008 概述和安装,本章介绍了 SQL Server 中的安 全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。本节为本章的 小结部分。  标签:SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 1.7 小结 至此,读者应该了解了各种版本 SQL Server 之间的细微差别,同时还应该知道怎样检 查计算机是否适合安装 SQL Server。 在前面所讲述步骤的指引下,读者应该已经在计算机上成功安装了 SQL Server 2008, 甚至可能已经完成了两次安装,从而既安装了一个开发服务器又安装了一个测试服务器。这 是个好主意,如果到目前为止只有一个安装的话,可以考虑安装另一个。无论是在大型公司 工作,还是在人数极少的小公司工作,保持生产代码和开发代码的分离将极大降低复杂性(如 果在开发时,需要为生产做准备的话)。 本章介绍了 SQL Server 中的安全性,使读者能轻松地知晓自己想要以何种方式实现安 全性,以及如何处理不同的用户名。虽然目前可能还没有什么数据,但需要确保一旦有了数 据,只有合适的人才能够查看到它们。 现在,已经做好了系统学习 SQL Server 2008 的准备。管理 SQL Server 最好的方法之一 是使用 SSMS,接下来将讨论这方面的话题。 【责任编辑:云霞 TEL:(010)68476606】 6.1.1 索引类型 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍索引类型。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.1.1 索引类型 SQL Server 有 3 种类型的索引,即聚集索引、非聚集索引,以及主 XML 索引和辅助 XML 索引。但是在本书中,我们主要介绍聚集索引和非聚集索引,因为 XML 和 XML 索引 是一个更高级的话题。 索引的类型是指在 SQL Server 中存储索引和数据的物理行的方式。理解索引类型之间 的不同是很重要的,我们在下面进行说明。 1. 聚集索引 聚集索引定义了数据在表中存储的物理顺序。如果在聚集索引中定义了不止一个列,数 据将按照在这些列上所指定的顺序来存储,先按第一列指定的顺序,再按第二列指定的顺序, 依此类推。一个表只能定义一个聚集索引。它不可能采用两种不同的物理顺序来存储数据。 回到本书先前的类比,如果查看一个电话簿,你会看到数据先以姓氏的字母顺序排列, 再以名的字母顺序排列,再以中间名的字母顺序排列。因此,当搜索索引并找到键的时候, 就已经从要提取的信息中找到了相应的数据,如电话号码。换句话说,这时并不需要根据相 应的键,再翻到相应的页,来找到数据,数据本身就已经在这里了。这就是针对姓、名和中 间名的聚集索引。 在数据被插入时,SQL Server 会将输入的数据,连同索引键值,一同插入到合适位置对 应的行中。然后会移动数据,以便保持顺序。可以将数据想象成书架中的书。在图书馆购进 一本新书时,管理员会尝试按字母顺序找到一个位置,并将这本书插入到该位置中。这时书 架上所有的书都会被移动。如果此时没有足够的空间供图书移动,那么在书架最后位置上的 书就会被移动到下一个书架上,依此类推。直到书架上有足够的位置供新书加入。尽管这种 移动看上去非常简单,但这的确就是 SQL Server 所做的事情。 不要将聚集索引放置到一个会进行大量更新的列上,因为这意味着 SQL Server 会不得 不经常改变数据的物理位置,这样会导致过多的处理开销。 由于在聚集索引中包含了表数据本身,与通过非聚集索引提取数据相比,使用聚集索引 提取数据时,SQL Server 需要进行的 I/O 操作更少。因此,如果在表中只有一个索引,那么 应该确保它是聚集索引。 2. 非聚集索引 不像聚集索引,非聚集索引并不存储表数据本身。相反,非聚集索引只存储指向表数据 的指针,该指针作为索引键的一部分,因此,在一个表中同时可以存在多个非聚集索引。 因为非聚集索引以与基表分开的结构保存(实际上,是以带有聚集索引的表的形式保存, 只不过被隐藏起来而无法看见),所以可以在与基表不同的文件组中创建非聚集索引。如果 文件组被保存在不同的磁盘上,在查询和提取数据时可以得到性能上的提升,这是因为 SQL Server 可以进行并行的 I/O 操作,从索引和基表中同时提取数据。 在从拥有非聚集索引的表中提取信息的时候,SQL Server 会在索引中找到相关的行。如 果要查询的信息不是索引中所记录信息的一部分,SQL Server 会再使用索引指针中的信息, 以提取数据中的相关行。正如你看到的,这至少需要两个 I/O 操作--也可能更多,这依赖于 对索引的优化。 在创建非聚集索引时,用来创建索引的信息与表分开放置在不同的位置,因而可以在需 要时将其存储在不同的物理磁盘上。 注意 索引越多,在往带有索引的行中插入或更新数据时,SQL Server 进行索引修改操 作所花费的时间就越多。 3. 主 XML 索引和辅助 XML 索引 关于对 XML 数据进行索引,在本书中只进行简要介绍。要了解更多这方面的知识,最 好去阅读联机丛书,因为该主题超出了本书的范围。 【责任编辑:云霞 TEL:(010)68476606】 6.1.2 唯一性 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 1 章 SQL Server 2008 概述和安装,本章介绍了 SQL Server 中的安 全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。本节为大家介 绍唯一性。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.1.2 唯一性 索引可以被定义为唯一的或非唯一的。唯一索引确保带有唯一索引的列中所保存的值, 包括 NULL 值,在整个表中只能出现一次。 SQL Server 会自动对带有唯一索引的列强制其唯一性。如果试图在表中插入一个已经存 在的值,就会产生错误,对数据的插入或修改就会失败。 非唯一索引很有效。然而,因为它允许出现重复的值,所以在提取数据的时候,非唯一 索引会比唯一索引带来更大的开销。SQL Server 需要检查是否返回了多个项,并同 SQL Server 所知道的唯一索引进行比较,以便在找到第一个行之后停止搜索。 实现唯一索引通常用于支持约束,例如对主键的约束。实现非唯一索引通常用于支持使 用非键列的行的定位。 【责任编辑:云霞 TEL:(010)68476606】 6.2.1 使用低维护列 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用低维护列。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.2 确定是什么创建了好的索引 要在表中创建索引,应该指定在索引中要包含哪些列。索引中的列不需要都是相同的数 据类型。你应该了解,一个索引中最多只能包含 16 个列,在一行中,索引列中总共包含的 数据不能多于 900 字节。老实说,如果你创建的索引中包含的列数超过了 4 或 5 列,就应该 回头重新评估一下索引定义。有时候你的确需要在索引中包含超过 5 列,即便如此也确实应 该再次对此进行检查。 也可以摆脱这一限制,创建一个包含不属于键的列的索引:该列被标记到索引的最后。 这意味着索引会占用更多的空间,但也意味着若 SQL Server 从索引搜索中提取所有的数据, 则会比较快捷。然而,要重申的是,如果要按这种方式设计索引,那么也许应该看看索引的 设计是否合理。 在下面的几节中,我们将对一些要素进行检查,以确定索引是否是好的索引: 使用"低维护"列; 使用主键和外键; 能够找到指定的记录; 使用覆盖索引; 查找信息范围; 保持数据的排序。 6.2.1 使用低维护列 正如我提到过的,对于非聚集索引来说,真正的索引数据同表数据是分开的,尽管二者 可以被存储到同一区域或不同区域(例如,保存在不同的硬盘驱动器上)。要重申的是,这 意味着在往表中插入记录的时候,索引中包含的列中的信息被复制,并被插入到索引区域中。 因此,如果在表中对一个列里的数据进行修改,而该列被包含在一个索引中,则 SQL Server 也必须对索引中的数据进行修改。也就是说,实际上并不只是进行了一次更新,而是两次更 新。如果表拥有不止一个索引,那么也就更新不止一次,这样在对一条记录进行修改时,可 能会导致几次磁盘写操作。在对数据的修改操作中,这可能会导致性能的下降,在创建索引 时,应该在这种性能的下降与在数据提取方面的性能提升之间找到一个平衡点。 因此,对于低维护的数据(其含义是更新频度不高的列)来说,可以在其上创建索引, 而且这会是好的索引。这样 SQL Server 只需进行更少的磁盘写入,也可以获得更快的数据 库性能。在 SQL Server 数据库实例中的其他数据库也是如此。然而,不要让这种规则束缚 了你。如果你认为在数据库中,提取数据比修改数据更频繁,或提取数据的性能比修改数据 的性能更重要,那么就可以考虑在索引中包含这些列。 在我们构建的样例应用程序中,每个月都需要用收入或支出来更新客户的银行结余。然 而,我们还需要每晚进行一项工作,就是找出存款在 10 000 美元和 50 000 美元之间的客户, 因为按照美国联邦储备的规定,银行会给这些客户一个更高的储蓄利率。客户的银行结余会 被频繁更新,而位于这些列上的索引会加速晚间的储蓄检查程序。在本例的索引被创建之前, 我们需要确定在提升检查程序的性能的同时,更新结余的过程中轻微的性能下降是否可被接 受。 【责任编辑:云霞 TEL:(010)68476606】 6.2.2 主键和外键 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍主键和外键。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.2.2 主键和外键 索引的一种重要用途是在表中设置引用约束。请回忆第 3 章,引用约束是通过对键的使 用,根据现存的数据,对某些操作进行约束的行为。一个关于引用约束的快速示例:假设你 有一个拥有自己的银行产品的客户。引用约束可以防止在该客户的银行产品还存在的时候删 除该客户。 SQL Server 不会针对外键自动创建索引。然而,因为在连接到父表的时候,外键列值需 要被 SQL Server 所标识,所以通常总是建议在外键列上创建索引。 【责任编辑:云霞 TEL:(010)68476606】 6.2.3 找到指定记录 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍找到指定记录。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.2.3 找到指定记录 对于索引来说,理想的情况是让列允许 SQL Server 快速标识出合适的行。在第 8 章, 我们会遇到 WHERE 查询子句。该子句列出了表中的某些列,并用于限制在一个查询中所 返回的行数。在最常用的查询中,WHERE 子句中使用的列是索引的最佳选择。例如,如果 需要通过特定的订单号找到客户的订单,那么基于 customer_id 和 order_number 来创建索引 是比较好的选择,因为在表中,所有用于定位所需行的信息都会包含在索引中。 如果在应用程序中找到指定的记录是其工作的一部分,那么这种场景确实是一个应该考 虑创建索引的地方。 【责任编辑:云霞 TEL:(010)68476606】 回书目 上一节 下一节 上一篇: 6.2.2 主键和外键 下一篇: 6.2.4 使用覆盖索引 6.2.4 使用覆盖索引 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用覆盖索引。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.2.4 使用覆盖索引 正如早先提到的,在插入和更新记录时,索引中包含的列中的数据,不仅会被保存到表 中,也会保存在非聚集索引中。通过在索引中找到一个项,SQL Server 会转移到表中,以定 位和提取记录。然而,如果所需的信息已经被保存在索引中,那么就不需要进入到表中来提 取记录,因此这可以提供更快的数据访问。 例如,考虑一下 ApressFinancial 数据库中的 ShareDetails.Shares 表。假设你需要在其中 找到描述信息、当前价格及股票的股票行情自动收录器ID。如果索引被放置在ShareId列上, 这是一个标识列,因此是唯一的,你会请求 SQL Server 使用提供的 ID 来找到该记录。然后 会从该索引中得到该数据定位的详细信息,并移动到该数据区域。然而,如果有一个索引中 包含了所有的列,那么 SQL Server 就可以在索引操作中提取描述股票行情自动收录器和价 格的细节,而不再需要移动到数据区域。这被称作覆盖索引(covered index),因为索引覆 盖了表中的每一列,以方便数据的提取。 6.2.4 使用覆盖索引 http://book.51cto.com 2009-05-15 11:25 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用覆盖索引。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.2.4 使用覆盖索引 正如早先提到的,在插入和更新记录时,索引中包含的列中的数据,不仅会被保存到表 中,也会保存在非聚集索引中。通过在索引中找到一个项,SQL Server 会转移到表中,以定 位和提取记录。然而,如果所需的信息已经被保存在索引中,那么就不需要进入到表中来提 取记录,因此这可以提供更快的数据访问。 例如,考虑一下 ApressFinancial 数据库中的 ShareDetails.Shares 表。假设你需要在其中 找到描述信息、当前价格及股票的股票行情自动收录器ID。如果索引被放置在ShareId列上, 这是一个标识列,因此是唯一的,你会请求 SQL Server 使用提供的 ID 来找到该记录。然后 会从该索引中得到该数据定位的详细信息,并移动到该数据区域。然而,如果有一个索引中 包含了所有的列,那么 SQL Server 就可以在索引操作中提取描述股票行情自动收录器和价 格的细节,而不再需要移动到数据区域。这被称作覆盖索引(covered index),因为索引覆 盖了表中的每一列,以方便数据的提取。 6.2.6 保持数据的排序 http://book.51cto.com 2009-05-15 11:52 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍保持数据的排序。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.2.6 保持数据的排序 正如以前所说的,聚集索引总是让表中的数据保持一定的顺序。如果将一个列(或多个 列)设置为聚集索引,在插入记录时,SQL Server 会将记录插入到合适的物理位置上,以确 保该记录在数据表中以在索引中所指定的正序或倒序存储。对此解释得更深入一些,假定你 在客户编号上设置了聚集索引,当前客户编号的数据包括 10、6、4、7、2 和 5,则 SQL Server 将对数据按如下的顺序物理存储:2,4,5,6,7,10。如果一个过程往表中添加了客户编 号 9,则它会被物理地插入到 7 和 10 之间,这意味着客户编号为 10 的记录需要被物理地移 动。因此,如果在一行或多行中设置了聚集索引,当数据插入到这些行中时,会导致聚集索 引被重新排序,这会极大影响数据插入的性能。当创建索引时,SQL Server 允许指定一个填 充要素,通过这种方法减少由于重新排序所带来的冲突。这里简单地讲一下填充因子。不管 怎样,这一选项使你能够定义在创建新叶之前索引叶被填充的程度。可以把索引叶想成是每 一个存储柜的索引卡。我们知道将有更多的物品会被放入柜中,而你可能需要把这些物品中 的一部分添加到存储柜的索引卡上。因此,要尝试估计将添加的物品的数量,从而在索引卡 上留出一定的空间,以便把物品添加到其上。这样做就是在试图避免不得不创建新的索引卡 的情形。 【责任编辑:云霞 TEL:(010)68476606】 6.3.1 使用了不合适的列 http://book.51cto.com 2009-05-15 11:52 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用了不合适的列。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.3 确定是什么导致了坏的索引 现在你知道了什么是好的索引,让我们再研究一下,究竟是什么导致了坏的索引。这里 有几点需要注意: 使用了不合适的列; 选择了不合适的数据; 包含了过多的列; 表中包含的记录过少。 6.3.1 使用了不合适的列 如果在表中存在未被查询使用的列,那么最好不要为该列创建索引,除非需要将它同其 他的列组合起来创建覆盖索引,正如前面提到的那样。如果为未被查询使用的列设置了索引, 索引仍然会增加数据修改操作的开销,但是却不会提高数据提取操作的任何性能。 【责任编辑:云霞 TEL:(010)68476606】 回书目 上一节 下一节 6.3.1 使用了不合适的列 http://book.51cto.com 2009-05-15 11:52 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用了不合适的列。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.3 确定是什么导致了坏的索引 现在你知道了什么是好的索引,让我们再研究一下,究竟是什么导致了坏的索引。这里 有几点需要注意: 使用了不合适的列; 选择了不合适的数据; 包含了过多的列; 表中包含的记录过少。 6.3.1 使用了不合适的列 如果在表中存在未被查询使用的列,那么最好不要为该列创建索引,除非需要将它同其 他的列组合起来创建覆盖索引,正如前面提到的那样。如果为未被查询使用的列设置了索引, 索引仍然会增加数据修改操作的开销,但是却不会提高数据提取操作的任何性能。 【责任编辑:云霞 TEL:(010)68476606】 回书目 上一节 下一节 6.3.3 包含了过多的列 http://book.51cto.com 2009-05-15 11:52 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍包含了过多的列。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.3.3 包含了过多的列 在索引中包含的列越多,在插入或修改数据的时候,被移动的数据就越多。尽管在 SQL Server 2008 中,对索引数据的更新只需要花费很少的时间,但是如果数据很多,花费的总 时间也还是相当可观。因此,在表中所添加的每个索引都可能导致额外的系统开销,所以建 议你根据数据提取性能的可接受程度,只创建最少数量的索引。 【责任编辑:云霞 TEL:(010)68476606】 6.3.4 表中包含的记录过少 http://book.51cto.com 2009-05-15 11:52 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍表中包含的记录过少。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.3.4 表中包含的记录过少 从数据性能的观点看,如果在表中只有一行,那么绝对不需要在表中设置索引。SQL Server 会在第一个请求中就找到该记录,而不需要索引的帮助,因为 SQL Server 会使用表 扫描。话虽如此,你可能希望包含一个主键,以便强制数据的完整性。 在表中只包含少数记录的时候也同样如此。重申一遍,没有理由为这类表设置索引。其 原因如下:SQL Server 会先跳转到索引上,它的引擎会对数据进行几次读取,以找到正确的 记录,然后会直接通过从索引中提取的记录指针,移动到该记录上。在这个过程中,涉及了 好几个动作,并且在 SQL Server 的不同组件之间进行了多次数据传递。在执行一个查询的 时候,SQL Server 会确定是使用为表定义的索引来定位要查找的行比较高效,还是只简单通 过表扫描来找到要查找的行更快捷。 【责任编辑:云霞 TEL:(010)68476606】 6.4 针对性能对索引进行审查 http://book.51cto.com 2009-05-15 11:52 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍针对性能对索引进行审查。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.4 针对性能对索引进行审查 作为管理员或开发者,你应该经常对表中所构建的索引进行审查,以确保昨天所创建的 好索引不会在今天变成坏索引。在构建解决方案的时候,在开发环境中被认为是好的索引, 在生产环境中也可能就不那么好了。例如,用户可能会多次执行一个出乎我们意料的任务。 因此,强烈建议你专门设置一个任务,以对索引进行长期的监控,了解它们的运行情况。这 可以通过 SQL Server 中的索引优化工具,即数据库引擎优化顾问(Database Tuning Advisor, DTA)来实现。 DTA 对数据库和一个保存有代表性信息的工作负荷文件进行观察,并使用这些获取的 信息,以关系图的形式显示在数据库中创建了什么索引,以及可以在哪里进行改进。到现在 为止,本书中还没有实际介绍如何利用数据工作,因此介绍该工具的使用可能会导致困惑。 这种强大且高级的工具只适宜有经验的 SQL Server 2008 开发者或数据库管理员使用。 要让 SQL Server 数据库以最优的方式运行,让索引更合理是至关重要的。花一点时间 来考虑一下索引,尝试让它们更合理,并定期审查它们。对聚集索引、唯一性索引和那些包 含在索引中的列进行审查,以确保尽可能快地提取数据。最后,还应该确保包含在索引中的 列具有合理的顺序,以减少 SQL Server 在查找数据时的读取次数。如果大量的查询都基于 在指定的部门或部门的雇员列表中查找人员,那么以列 FirstName、LastName 和 Department 这样的顺序来定义索引可能不如以 Department、FirstName 和 LastName 这样的顺序来定义索 引好。这两种索引之间的不同在于,对于第一种索引来说,SQL Server 可能需要进行表扫描 才能找到要提取的记录,而对于第二种索引,SQL Server 可以对索引进行搜索,直至找到正 确的部门,然后只需要从索引中继续返回行,直至部门改变。正如你看到的,第二种方式的 工作量更少一些。 6.5.1 用表设计器创建索引 http://book.51cto.com 2009-05-15 11:52 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍用表设计器创建索引。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.5 创建索引 既然知道了什么是索引,也了解了索引的各种类型,现在我们开始在 SQL Server 中创 建一些索引。正如你所预料的,在 SQL Server 中,可以使用多种不同的方法来创建索引, 这些方法将是本章的这一节的主要内容,我们先从如何使用 SSMS 的表设计器开始介绍。 放置到数据库中的第一个索引,是放在CustomerDetails.Customers表的CustomerId列上。 6.5.1 用表设计器创建索引 回忆前面有关创建 CustomerId 列的那一章,SQL Server 自动在该列中生成数据,而不 管是不是在表中插入了新的记录。这个数据永远无法改变,因为它在列上使用了 IDENTITY 标识。因此,只要有客户记录被添加,该 CustomerId 列就会自动更新。可以写(如用 C#) 一个应用程序,以之作为用户前端来更新客户数据的保留区域,它也可能会显示特定客户的 细节,但是它不知道 CustomerId 对于每个新记录来说要求递增,也不知道值是从哪里开始 的。 被创建的第一个索引,用于找到客户记录,并对客户信息进行更新。通过使用姓名和地 址的组合,应用程序会找到客户,但是在返回的结果中,仍然可能包含了多条记录。例如, 可能有一对父子都叫 John J.Doe,而他们拥有相同的地址。一旦在屏幕上显示了相关的记录 细节,计算机怎么才能知道要对哪个 John J.Doe 来进行更新呢? 同观察到的客户姓名和地址不同的是,应用程序知道 CustomerId,并通过它在 SQL Server 中查找记录。在完成对名称的搜索的时候,CustomerId 也作为返回值的一部分被返回, 这样当用户选择正确的 John J.Doe 时,应用程序也就知道了相应的 CustomerId。SQL Server 会使用这个值来找到要更新的记录。在下面的练习中,我们为 CustomerDetails.Customers 表 添加这一索引。 练习:以图形化的方式创建索引 (1) 确保 SSMS 正在运行,并且已经展开了树状视图,能看到 ApressFinancial 数据库的 "表"节点。 (2) 找到要添加索引的第一个表(在本例中是 Customer- Details.Customers 表)。右击并 选择"设计"。这会打开表设计器。点击"管理索引和键"按钮(参看图 6-1)。 (3) 这时会显示创建索引界面,该界面类似于图 6-2。注意,这里已经定义了一个主键。 该主键是在第 5 章中创建的,在图 5-24 中,当我们创建关系时看到过"保存"对话框。我们 将 CustomerDetaills.Customers 表定义为主键表,而该表尚无主键,于是 SQL Server 为我们 创建了主键。单击"添加"按钮,以创建新的索引并设置索引的属性。 (点击查看大图)图 6-2 "索引/键"对话框 这个对话框中显示的列是预设的,但是你可以根据需要改变你希望使用的列和选项。然 而,不管已经创建了什么索引,为索引所选择的初始列总会是表中定义的第一个列。 (4) 要改变的第一个区域是索引的名称。注意,在"(名称)"文本框中,SQL Server 已 经创建了一个可能的名称。名称的前缀为 IX_,这使用了一种好的命名系统。它还很好地保 留了表的名称以及一个有用的后缀,例如列的名称。在本例中,索引被命名为 IX_Customers_CustomerId。在"说明"中添加某些描述可能会更好。然而,因为索引的名称已 经能解释其内容,实际上不再需要什么描述信息了。 (5) 在本例中,SQL Server 已经正确地选择 CustomerId 列作为组成索引的列。同时,它 设置索引按照升序排序。对于这个例子,默认的排序方式是合适的。如果存在多个不同排序 的列,而一个列在查询的 ORDER BY 子句中被使用,那么为该列设置索引时采用相应的排 序是比较有用的。如果在索引中为某列所设置的排序顺序,同该列在查询的 ORDER BY 子 句中所使用的排序顺序一致,则 SQL Server 就可以避免执行额外的排序工作,从而提高查 询的性能。 提示 如果在索引中只有一列,SQL Server 向前读取该索引的速度会同向后读取索引的 速度一样快。 (6) 正如以前定义表时所提到的,在添加记录时,SQL Server 会自动为 CustomerId 列的 值按顺序生成下一个数字,因为该列具有 IDENTITY 特性。该值不能在表中被修改,因为 允许创建你自己的标识值的选项开关没有打开,所以通过将信息的这两项组合起来,就可以 确认值是唯一的。因此,将"是唯一的"选项设置为"是"。 (7) 创建索引的最后一部分是将"创建为聚集的"选项设置为"否"(如图 6-3 所示)。虽 然,从许多标准来看,该索引都是成为聚集索引的理想候选,例如,该索引有很高程度的唯 一性,能在查询的一个范围内使用,但是,极少有人会首先通过客户 ID 来访问该表。更可 能的情况是,通过表中的客户支票账户 AccountNumber 访问该表。最后,这样插入到 SQL Server 中的记录的顺序将不会被改变。如果你向下滚动屏幕,还应该将"重新计算统计数据" 选项设置为"否"。 注解 如果当前是在生产环境中,或者,在开发环境中创建的系统将会迁移至生产环境 中,则需要做一些其他方面的考虑。正如我们在前面讨论过的,你可能需要修改文件组或分 区方案,以便把索引放置在不同的文件组上。另一个需要注意的区域是"填充因子"。我们将 在本练习的最后讨论与之相关的内容。 (点击查看大图)图 6-3 "索引/键"对话框中的"聚集"选项 (8) 点击"关闭"按钮,关闭对表的修改对话框。在提示是否要保存改变时,回答"是"。 这就将索引添加到了数据库中。 在 SSMS 中构建索引是一个很直观的过程,正如你所看到的。尽管在创建第一个索引 的时候,只花费了很少的时间,但是这里面还是有很多地方需要你做一些决策。我们现在就 对此进行说明。 为索引选择名称和包含的列是很容易的,不值得在其上耗费过多的笔墨。通过本章开始 处介绍构建索引的基础时的讨论,你应该知道在构建索引的时候,需要包含哪些列。 你需要做的第一个主要决策是,确认一个列中是否包含唯一的值。回忆前文,你就会记 得,我们构建的第一个索引就是一个标识列,不能通过任何 SQL 命令往该列中输入数据, 因为该列中的数据是由 SQL Server 自动生成的。同样,在一个标识列中,默认时不可能出 现两行包含相同值的情形。然而,这里并没有一种自动的方法来阻止创建重复键。因此,还 需要告知 SQL Server 该索引是唯一的。 移动到"创建为聚集的"设置上,表中的数据最好保持 CustomerId 的顺序。这是因为当往 表中插入数据的时候,新插入的数据对应的 CustomerId 值,总是比以前的记录对应的 CustomerId 值要大。因此,每当添加记录的时候,记录都会被添加到表的末尾,也就不再需 要使用聚集索引了。因为为索引设置了"是唯一的"选项,所以也就不必再选择"创建为聚集 的"选项了。 接着来到了"填充因子"选项,通过该选项告知 SQL Server,在 SQL Server 接续索引开 始一个新数据页之前,要用索引数据把页填充到什么程度。对于眼下这一索引,由于数据将 是静态的,不会出现太多必须把索引项移来移去的情况,因此最好是把填充因子设置成较高 的百分比,如 95。 最后,"重新计算统计数据"选项用于定义当数据被修改时,SQL Server 是否重新计算关 于索引的统计数据。 6.5.2 索引和统计信息 http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍索引和统计信息。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.5.2 索引和统计信息 在提取数据的时候,SQL Server 显然会考虑采用最好的方法来获取数据,并将其返回给 请求它的查询。即使已经在一系列的列上创建了索引,SQL Server 也可能会决定使用另外一 种方法--也许通过表扫描提取数据的方法会更好更快。在提取相同的数据时,也许有多个索 引可供选择。无论出现什么情况,SQL Server 都会获取相关的信息,以做出更明智且更正确 的选择。这就是统计信息的作用。 SQL Server 会为索引中包含的每个列保存其统计信息。这些统计信息在经过了一定的时 间或进行了一定数量的数据插入和修改之后被更新。在后台所有这些工作是如何进行的细节, 以及 SQL Server 是如何使统计信息保持最新,都属于高级主题。你只需要知道的是,如果 对包含数据的表中的索引进行了修改或构建,不让 SQL Server 更新表上的统计信息,那么 SQL Server 在决定如何提取数据的时候,就可能会得到不正确的信息。这甚至意味着,通过 改变索引,原意本来是想提高性能,但实际上却导致性能降低。 这并不是要谨慎到总是让 SQL Server 自动对统计信息进行更新,SQL Server 只有在它 觉得需要的时候,才会对统计信息进行更新。这种更新可能会发生在一个很忙的处理过程中, 而你对要发生的事情却无法控制。当然,如果 SQL Server 确实(在这个很忙的处理过程中) 去更新统计信息,那么,因为若打开了 AUTO_UPDATE_STATISTICS_ASYNC 选项,统计 信息的更新是异步的,所以导致启动更新的查询不会因为系统很忙而受到影响。 通过计划任务来手动更新统计信息,让所有的统计信息都在闲时创建,这样可能会更有 效率。在一个有大量对数据的插入或修改的生产环境中,常会看到这种手动更新统计信息的 情形。 【责任编辑:云霞 TEL:(010)68476606】 6.5.3 CREATE INDEX 语法 http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍 CREATE INDEX 语法。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.5.3 CREATE INDEX 语法 通过 T-SQL 创建索引,就像创建表一样容易。在本节中,我们只看看如何给表创建索 引,尽管在 SQL Server 中,还可以给另一种被称作视图的对象创建索引。 创建索引的完整语法没有在这里列出,不过你可以在 SQL Server 的联机丛书中找到对 它的详细描述。在学习 SQL Server 2008 的时候,使用其简化版本就已经足够了。大多数情 况下,创建索引可以采用下面的版本: 让我们对该删节版本语句中的选项进行逐一的介绍。 CREATE。必填。该关键字通知 SQL Server 要构建一个新的对象。 UNIQUE。可选。该选项用于通知 SQL Server 索引中列出的列的值是每行唯一的。如 果试图插入重复的行,则该选项会强制 SQL Server 返回一个错误信息。 CLUSTERED 或 NONCLUSTERED。可选。如果这两个选项都没有被明确列出,则默 认将索引创建为 NONCLUSTERED(非聚集索引)。 INDEX。必填。该选项用于通知 SQL Server 要创建的新对象是一个索引。 Index_name。必填。这是要创建的索引的名称。该名称在表中必须是唯一的,也建议在 整个数据库中保持该名称的唯一性,在前面的相关讨论中,我们使用了"IX_表名_列名"的这 种命名方法。 ON table。必填。这是同索引相关联的表的名称。只能是一个表的名称。 column。必填。这是在索引中所包含的列的名称。可以是一个列,也可以是多个列。如 果是多个列,列的名称之间需要用逗号进行分隔。 ASC。可选(默认)。如果既没有声明 ASC,也没有声明 DESC,则默认设置为 ASC。 ASC 选项用于通知 SQL Server 将列按升序保存。 DESC。可选。它通知 SQL Server 将列以降序保存。 WITH。可选。不过如果必须使用下面的任何选项,则该 WITH 选项都是必填的。 IGNORE_DUP_KEY。这个选项只在索引中定义了 UNIQUE 的时候才有效。如果在前 面没有使用 UNIQUE 选项,则无效。我们一会再对此进行解释。 DROP_EXISTING。如果在数据库中存在相同名称的索引,则可以使用该选项。它会在 重建索引之前先删除原先的索引。如果你实际上并不改变索引中的任何列,那么这个选项很 有用。我们一会再进行说明。 SORT_IN_TEMPDB。在一个已经有数据的表中构建索引的时候,建议使用这个选项, 如果表是一个很大的表,会在临时数据库 tempdb 中对数据按索引排序,正如我们在第 3 章 所介绍的。如果你有一张大表,或者 tempdb 数据库位于另一个磁盘上,则可以使用这个选 项。这个选项会加速索引的构建,因为 SQL Server 会对保存表的磁盘设备进行读取,同时 对 tempdb 表所在的另一磁盘设备进行写入。这种读取和写入是并发进行的,从而提高了性 能。 ON。可选。如果要指定将索引创建在特定的文件组中的时候,这个选项则是必填的。 如果希望将索引构建在 PRIMARY 文件组,则这个选项不必填。 filegroup。这是要保存索引的文件组的名称。在当前,我们只有一个文件组,即 PRIMARY。 PRIMARY 是一个保留字,如果要使用它,需要用方括号([])将之括住。 有两个选项需要更进一步讨论:IGNORE_DUP_KEY 和 DROP_EXISTING。这将在下 面的两节中予以介绍。 1. IGNORE_DUP_KEY 如果将索引定义为 UNIQUE,那么不管怎样尝试,你都无法添加一个在该列中包含重 复值的新行。然而,根据在索引上所进行的这一设置,可以执行两种操作。 在进行多行插入的时候,如果指定了 IGNORE_DUP_KEY 选项,那么即使在插入的行 中存在与唯一索引相冲突的内容,SQL Server 也不会生成错误信息,而只是生成一个警告信 息。那条与现有唯一索引相冲突的行不会被插入,而其他的行则能够成功插入。 在执行多行插入的时候,如果省略了 IGNORE_DUP_KEY 选项,那么只要有某些行违 背了唯一索引,在 SQLServer 中都将产生错误信息,整个批操作都会被回滚,所有的行都不 会被插入到表中。 注意 每次 SQL Server 进行了一项操作之后,可以通过名为@@ERROR 的系统变量来测 试是否出现了错误,或者也可以通过 Try/Catch 这样的错误处理机制来判断是否存在错误。 如果出现了错误,通常需要在批操作中进行某些类型的错误处理。如果使用了 IGNORE_DUP_KEY 选项,则在试图插入重复的行时,不会生成错误,这样在记录被插入 的时候,批操作就能正常运行。当然,要小心,在这种情况下,表面上每件事都工作得很好, 但实际上可能有某些行没有被插入。 2. DROP_EXISTING 在数据被插入和修改时,索引会被膨胀多次,比理想状态要大很多。就像 Access 数据 库需要被压缩一样,有时 SQL Server 中的索引也需要被压缩。通过消除索引中的碎片对索 引进行压缩可以加快性能,也可以减少对磁盘空间的占用。要压缩索引,可以重建索引,而 无需实际修改列中的数据,或者,实际上,可以从无到有,构建整个索引,并访问表中的每 一行。 在重建聚集索引时,相比在 DROP INDEX 命令后再使用 CREATE INDEX 命令来说, DROP_EXISTING 子句提供更强的性能。如果列包含在聚集索引中,每当表的聚集索引被重 建时,非聚集索引也会被重建。聚集索引的必须用原来的名字,同样,排序顺序以及创建索 引的分区也必须保持一致。最后,唯一性属性也不能改变。因此,如果删除聚集索引再重建 它,现有的非聚集索引会被重建两次(如果要重建的话):一次是在删除索引之后,一次是 在创建索引之后。当你在时间很关键的批处理窗口中工作时,这一点十分重要,必须谨记。 考虑到表和要创建的索引的大小,或许重建聚集索引的工作只能放在周末进行。 DROP_EXISTING 可以允许通过显式地删除再重建索引,对现存的索引进行重建。这在 重建主键索引的时候特别有用。在采用传统的方法重建主键索引的时候,因为其他的表可能 引用了主键,所以需要先在这些表中删除指向该主键上的外键。而通过指定 DROP_EXISTING 子句,SQL Server 会重建索引,而不会对主键约束性产生影响。 【责任编辑:云霞 TEL:(010)68476606】 6.5.4 在查询编辑器中创建索引:模板(2) http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍在查询编辑器中创建索引:模板。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.5.4 在查询编辑器中创建索引:模板(2) (8) 突出显示该索引,右击,再选择"属性",会显示一些不同的信息。在图 6-8 所示的 对话框中,不仅提供了索引的图形化版本,还列出了很多其他的潜在选项。 (点击查看大图)图 6-8 "索引属性"对话框 (9) 如果在表中输入了数据,或是处于生产环境中,最有趣的选项卡是"碎片"选项卡。在数 据被修改时,索引也会被修改。就像硬盘数据也会存在碎片一样,索引中的数据也会由于碎 片而难于使用。这会降低索引的速度,而且,正如在本章前面提到的那样,最重要的是应该 对索引经常检查,以确保它们有最好的速度和性能。当用户仍在使用系统的时候,SQL Server 仍能尽可能地修正碎片。通过选中图 6-9 底部的"重新组织索引"复选框,可以实现对索引的 重新组织。稍复杂一点的步骤是,在对象资源管理器中突出显示索引,右击以打开子菜单, 并选择"重新组织"。 (点击查看大图)图 6-9 检查索引碎片 最后一种创建索引的方法是在查询编辑器中手工输入所有的索引代码。我们在下节介绍。 【责任编辑:云霞 TEL:(010)68476606】 6.5.5 在查询编辑器中创建索引:SQL 代码 http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍在查询编辑器中创建索引:SQL 代码。  标签:SQL 代码 引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.5.5 在查询编辑器中创建索引:SQL 代码 在下面的练习中,我们将在查询编辑器中创建两个索引和一个主键。这允许我们在下一 节中构建 TransactionDetails.Transactions 和 TransactionDetails.TransactionTypes 这两个表之间 的外键。该代码也说明了如何为前面讨论 CREATE INDEX 的语法时提到的索引构建 T-SQL 定义选项。 注解 在执行代码之前,下面练习中所讨论的代码被分成了 3 个部分。这是为让它们更 容易理解。 练习:使用查询编辑器来创建索引 (1) 在一个空白的查询编辑器窗口中输入下面的代码。在这一节中,要创建的第一个索 引是一个位于 TransactionDetails.TransactionTypes 表中的唯一聚集索引。 (2) 要创建的第二个索引是位于 TransactionDetails.Transactions 表中的基于 TransactionType 列的非聚集索引。不应该将它设置为聚集索引,因为最好的方式是将 CustomerId 列或 DateEntered 列作为聚集列。 (3) 最后一步是为 TransactionDetails.TransactionTypes 表添加一个主键。这可以通过 ALTER TABLE 语句来完成。 (4) 现在可以通过按下 F5 或 Ctrl+E,或者点击工具条上的"执行"按钮,运行代码。你会 看到如下的成功信息。 命令已成功完成。 在本例中,创建了两个不同的索引。第一个是一个唯一聚集索引,它基于 TransactionDetails. TransactionTypes 表的标识列。之所以选择该列,是因为要使用 TransactionTypes 列来连接到该表。有时候可能也会基于该表的其他列,不过这非常少见。 由于在该表中只会输入很少的记录,所以其开销是微不足道的,也没有实际的利害关系。它 也允许我们查看在本例中关键字所放置的位置。 第二个索引构建在 TransactionDetails.Transactions 表上,它不能是一个唯一索引。因为 会存在具有相同类型的多个事务,所以会存在具有相同值的多条记录。然而,仍然可能将该 索引设置为聚集的。在事务中改变事务类型是很少见的,也就是说,如果在本系统中构建了 完整的审核机制,我们就可以"封杀"这类改变事务类型的操作。在这种"封杀"的情形下,要 改变事务类型,唯一的方法就是取消这一项,记录这个取消行为,再创建一个新的输入项。 然而,事务类型上的聚集索引并不能带来性能上的改善,因为基于单独的事务类型只会有很 少的数据查询。正如早先提到过的,设置为聚集索引并非最好的选择。 在本例中最有趣的地方是在一次执行中同时创建两个索引。虽然在前面的例子中使用的 是两个批事务,而一次只创建了一个索引。请注意在两个创建索引的 CREATE 语句之间的 GO 关键字。每个索引创建过程都完成于此,而不需要包含任何其他的 SQL 语句。如果需 要创建不止一个索引,而且又想同时构建它们,这可能是你所需要的解决方案(请参看第 8 章以了解事务的相关细节)。 有一点我们还没有说明,如果试图用相同的索引名称重复创建索引,会发生什么情况? 以前的索引已经被创建,但是又再次运行了查询,SQL Server 会产生一个错误消息,提示该 索引已经存在,你会看到类似下面的信息: 消息 1913,级别 16,状态 1,第 1 行 操作失败,因为在表'TransactionDetails.TransactionTypes' 上已存在名称为 'IX_TransactionTypes' 的索引或统计信息。 消息 1913,级别 16,状态 1,第 1 行 操作失败,因为在表'TransactionDetails.Transactions' 上已存在名称为 'IX_Transactions_TType' 的索引或统计信息。 消息 1779,级别 16,状态 0,第 1 行 表'TransactionTypes' 已经有针对它定义的主键。 消息 1750,级别 16,状态 0,第 1 行 无法创建约束。请参阅前面的错误消息。 即使改变了索引的内容,并让索引中包含不同的列,但只要使用了相同的名称,就无法 创建该索引。 在本例的最后,我们对表进行了修改,以添加主键。在表中,可以定义不同类型的 CONSTRAINTS:默认时使用列约束,但是,正如我们在前一章中所看到的,约束也可以用 于主键和外键。 重申一遍,在这一节中,介绍了几个新的领域,而你现在已经得到了创建最常用索引所 需的信息。与创建表比较而言,创建索引只需要很少的代码,非常快捷和容易。然而,如果 往一个现有的充满信息的表中添加新索引,可能要花较长的时间才能完成,这要看具体的情 况。可以在系统被使用的时候,或是表或聚集索引被更新的时候,添加索引。这只在 SQL Server 的企业版中提供,这需要为索引的行为指定 REBUILD WITH (ONLINE = ON)选项。 在使用这些选项的时候要小心,因为在索引被构建时,如果有用户试图访问同索引相关的表, SQL Server 就不会识别该索引,在使用最好的方法来访问数据时,会忽略该索引,直到它被 构建完成。 如果为了重建统计信息,而在删除索引之后创建索引,可能会出现问题。例如,如果没 有使用 ONLINE = ON 选项。当该选项设置为 ON 时,SQL Server 将允许对表进行访问,以 添加或修改数据。然而,如果该选项设置为 OFF,则所有对表的操作都必须等待,直到完 成了索引重建。这就意味着,当正在生成索引时,系统中任何其他部分如果要访问索引所在 的表,访问都会暂停。因此,如果你是在当前可用的数据库上重建索引,则必须权衡这两个 可能出现的问题,决定哪一种是可以接受的。 【责任编辑:云霞 TEL:(010)68476606】 6.6 删除索引 http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍删除索引。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.6 删除索引 也有索引是多余的而需要从表中删除的时候。删除索引只需要简单执行 DROP INDEX 语句,后面跟上表名和索引名。谨记,对于每一个数据修改操作,都需要为每一个存在的索 引花费处理时间,以保证索引是最新的。因此,当使用相同的列创建索引时,或者当索引不 再能提供快速的数据访问因而被 SQL Server 忽略时,应该把它删除掉。 注解 如果索引用于主键或具有唯一性约束,就无法直接删除它。在这种情况下,必须 使用 DROP CONSTRAINT 命令。从表中删除约束,也会从表中删除索引。 练习:在查询编辑器中删除索引 (1) 如果要删除在上节中所创建的索引,所要做的全部事情就是执行下面的代码。它会 从 SQL Server 中删除该索引,也会将同索引相关联的统计信息一并删除。 (2) 在运行后,可以看到每件事都被正确执行了。 命令已成功完成。 (3) 不要忘记通过运行下面的代码来重建索引: 在下一节,我们会学习如何修改索引。 【责任编辑:云霞 TEL:(010)68476606】 6.7 在查询编辑器中修改索引 http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍在查询编辑器中修改索引。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.7 在查询编辑器中修改索引 与修改表的操作不同,不能使用 ALTER 命令来更新索引中所包含的列。要进行这类操 作,首先要删除索引,再重建它。DROP 命令可以从表中物理地删除索引,如果要重建相同 的索引,则在删除索引之前,应该确保知道索引中所包含的内容。 注解 在 SSMS 中,可以从索引的定义中删除列,而无需删除和重建索引,删除和重建 操作是在后台由 SQL Server 自动完成的。 下一个练习用于说明删除索引再重建索引的步骤。你可以学习到如何在两个步骤(而不 是三个步骤)之内完成该操作。 练习:在查询编辑器中修改索引 (1) 首先,假设我们要创建一个索引,以帮助我们在指定时间及时提取特定的股票价格。 这需要在数据查询中使用股票 ID 和要查询价格的日期,下面的代码就可以让索引实现该目 的(由于这段代码暂时还不完整,请不要运行): (2) 然而,最好让 PriceDate 降序,这样最新的价格总是在最前面,而查询是为了知道 最新的价格。通过将该列加入到索引中,SQL Server 就只读取最新的一行,而不是像以前那 样,随着越来越多的价格记录被创建,需要读取越来越多的行。将 Price 列本身也放入到索 引中对性能是有利的。这可以避免在从聚集索引的信息列中提取数据的时候,对数据进行第 二次读取。 注解 记住,聚集索引中包含了数据,而没有指向数据的指针。然而,在本例中,若没 有 Price 列,则会进行第二次读取。 注解 如果不小心运行了第一段代码,则设置 DROP_EXISTING = ON。 (3) 现在运行代码,可以看到下面的结果。 命令已成功完成。 通过在CREATE INDEX命令中使用DROP_EXISTING子句,可以在一个(而不是两个) 执行操作中修改索引。这会删除索引然后再重建它。 注解 在构建索引的时候要小心。有可能对同一列多次设置相同的顺序,这样就会使用 不同的索引名称多次创建同一索引。这浪费了时间,也会给 SQL Server 带来不必要的负担。 然而,在将一个已经被包含在聚集索引中的键列包含在非聚集索引中的时候,因为行指针实 际上指向的是聚集索引键,所以 SQL Server 会足够聪明,不会将该信息在非聚集索引中再 次保存,在聚集索引键被用在非聚集索引中的时候,可以明确定义其顺序。 还要构建更多的索引,但是我们将在后面再进行介绍。 【责任编辑:云霞 TEL:(010)68476606】 6.8 当索引不存在时 http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍当索引不存在时。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.8 当索引不存在时 随着数据库中数据量的增加,可能会在意想不到的地方出现扩展。最初和数据库一起构 建的应用程序可能有了扩充,这样一来,最初的数据库设计和索引决策或许不再完全正确。 潜在的问题是,数据库中查询所涉及的数据上不存在适合的索引。 当 SQL Server 访问数据时,它使用查询优化器来产生查询计划。查询计划是一个操作 计划,SQL Server 使用查询计划来执行你所构建的针对数据的查询。查询计划由若干步骤组 成,SQL Server 完成这些步骤来执行查询并生成需要的结果。在第 12 章中讨论高级 T-SQL 时,将给出查询计划的概述。在考虑查询计划时,需要确定哪一个是执行查询筛选的最优索 引。 【责任编辑:云霞 TEL:(010)68476606】 6.8 当索引不存在时 http://book.51cto.com 2009-05-15 12:57 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍当索引不存在时。  标签:索引 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.8 当索引不存在时 随着数据库中数据量的增加,可能会在意想不到的地方出现扩展。最初和数据库一起构 建的应用程序可能有了扩充,这样一来,最初的数据库设计和索引决策或许不再完全正确。 潜在的问题是,数据库中查询所涉及的数据上不存在适合的索引。 当 SQL Server 访问数据时,它使用查询优化器来产生查询计划。查询计划是一个操作 计划,SQL Server 使用查询计划来执行你所构建的针对数据的查询。查询计划由若干步骤组 成,SQL Server 完成这些步骤来执行查询并生成需要的结果。在第 12 章中讨论高级 T-SQL 时,将给出查询计划的概述。在考虑查询计划时,需要确定哪一个是执行查询筛选的最优索 引。 【责任编辑:云霞 TEL:(010)68476606】 6.9.2 SQL Server 数据库关系图工具 http://book.51cto.com 2009-05-15 13:17 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍 SQL Server 数据库关系图工具。  标签:数据库 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.9.2 SQL Server 数据库关系图工具 SSMS 的数据库关系图工具的设计目标是按照开发人员的需要,构建数据库的各个细节 方面的关系图。尽管它是一个简单直观的工具,也不像市场上的某些数据库关系图构建工具 那样强大,但是对 SQL Server 来说,它已经很完美了。 例如,数据库设计工具产品的市场领导者之一,是一种叫作 ERWin 的产品。ERWin 是 一种强大的数据库实用工具,它不仅能构建数据库关系图,还可以提供数据描述语言输出, 可以用于构建数据库解决方案。通过 OLE DB data provider 这类方式同数据库相连接,该工 具就可以同数据库进行直接的交互,因此也可以被用作创建数据库的前端。同时它还可以协 调创建的源代码,并以变更控制的观点进行控制,如果需要的话,不仅可以确保在数据库中 存在代码,而且可以通过执行命令快速创建新的数据库。在创建新的数据库时,这可能比较 有用。如果希望拥有比在 SQL Server 数据库关系图中工作所提供的功能(在本章中会介绍) 更加深入的特性,应该看一看更强大的工具,当然,它可能价格不菲。 SQL Server 的数据库关系图工具并不是只能提供创建关系图的功能。正如早先提到的, 它还可以被用于作为构建数据库解决方案的前端。通过该工具,SQL Server 提供了添加和修 改表,构建关系,添加索引等很多方面的特性。在工具中所做的任何更改都会先保存在内存 中,直至通过工具中的保存命令被提交。然而,在用途方面它也有一些局限性。 首先,对于任何基于关系图的数据库工具来说,最大的限制是显示关系图的屏幕空间不 够大。一旦在数据库的解决方案中包含了上百张表,要找到你正在查找的表,就得不断滚动 关系图窗口。 其次,不能添加存储过程、架构、用户、视图以及其他不是表的对象。其他的产品允许 包括这些对象,或者它们甚至已经为你构建了一些。 最后,在当前,在该工具中所修改的任何可改变的信息,都可以在 SSMS 中通过使用 相同的对话框和界面来实现。 阅读完本章后你会看到,数据库关系图工具对于它能操作的对象来说是非常强大的,但 是在使用该工具的时候也有一些地方需要注意。要牢记的是,数据库关系图工具会将所有的 改变保存在内存中,直至真正地保存该关系图。 例如,如果打开了一个数据库关系图,而关系图中的一个表已经在关系图外被删除,例 如,在查询编辑器或 SSMS 中被删除,则可能会发生两件事情中的一种。首先,如果在关 系图中,在该被删除的表中存在未保存的更改,那么当保存关系图的时候,该表会被重建, 但是别忘记,前面的删除操作会将所有的数据都删除。其次,如果在关系图中,没有对该表 进行更改,那么该表就不会被重建。一旦重新打开关系图,你就会看到该表被删除了,也就 不再出现在关系图中。 在同时有多个开发者在数据库上进行工作时,在 SSMS 的数据库关系图工具中所做的 任何更改都不会对其他开发者的关系图产生影响,直到他们的更改被保存且他们的关系图被 刷新。如果打开了多个关系图,并在其中修改了一个表,例如插入或删除了列,那么这种更 改会立刻对你自己的 SSMS 中的所有其他已打开的关系图产生影响。不要忘记这是一个内 存中的操作,所以这个过程不会对其他人的关系图产生影响,直到更改被保存且关系图被刷 新。 同样,如果在关系图中删除了一个对象,当你保存该关系图时,该对象会被删除,而其 他人在该对象上所完成的任何更改都会丢失。很明显,最后关闭关系图的人会是赢家。 简而言之,如果使用数据库关系图工具,一定要小心。因为很多过程都在内存中进行, 可能会不经意导致问题的发生。 【责任编辑:云霞 TEL:(010)68476606】 6.9.2 SQL Server 数据库关系图工具 http://book.51cto.com 2009-05-15 13:17 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍 SQL Server 数据库关系图工具。  标签:数据库 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.9.2 SQL Server 数据库关系图工具 SSMS 的数据库关系图工具的设计目标是按照开发人员的需要,构建数据库的各个细节 方面的关系图。尽管它是一个简单直观的工具,也不像市场上的某些数据库关系图构建工具 那样强大,但是对 SQL Server 来说,它已经很完美了。 例如,数据库设计工具产品的市场领导者之一,是一种叫作 ERWin 的产品。ERWin 是 一种强大的数据库实用工具,它不仅能构建数据库关系图,还可以提供数据描述语言输出, 可以用于构建数据库解决方案。通过 OLE DB data provider 这类方式同数据库相连接,该工 具就可以同数据库进行直接的交互,因此也可以被用作创建数据库的前端。同时它还可以协 调创建的源代码,并以变更控制的观点进行控制,如果需要的话,不仅可以确保在数据库中 存在代码,而且可以通过执行命令快速创建新的数据库。在创建新的数据库时,这可能比较 有用。如果希望拥有比在 SQL Server 数据库关系图中工作所提供的功能(在本章中会介绍) 更加深入的特性,应该看一看更强大的工具,当然,它可能价格不菲。 SQL Server 的数据库关系图工具并不是只能提供创建关系图的功能。正如早先提到的, 它还可以被用于作为构建数据库解决方案的前端。通过该工具,SQL Server 提供了添加和修 改表,构建关系,添加索引等很多方面的特性。在工具中所做的任何更改都会先保存在内存 中,直至通过工具中的保存命令被提交。然而,在用途方面它也有一些局限性。 首先,对于任何基于关系图的数据库工具来说,最大的限制是显示关系图的屏幕空间不 够大。一旦在数据库的解决方案中包含了上百张表,要找到你正在查找的表,就得不断滚动 关系图窗口。 其次,不能添加存储过程、架构、用户、视图以及其他不是表的对象。其他的产品允许 包括这些对象,或者它们甚至已经为你构建了一些。 最后,在当前,在该工具中所修改的任何可改变的信息,都可以在 SSMS 中通过使用 相同的对话框和界面来实现。 阅读完本章后你会看到,数据库关系图工具对于它能操作的对象来说是非常强大的,但 是在使用该工具的时候也有一些地方需要注意。要牢记的是,数据库关系图工具会将所有的 改变保存在内存中,直至真正地保存该关系图。 例如,如果打开了一个数据库关系图,而关系图中的一个表已经在关系图外被删除,例 如,在查询编辑器或 SSMS 中被删除,则可能会发生两件事情中的一种。首先,如果在关 系图中,在该被删除的表中存在未保存的更改,那么当保存关系图的时候,该表会被重建, 但是别忘记,前面的删除操作会将所有的数据都删除。其次,如果在关系图中,没有对该表 进行更改,那么该表就不会被重建。一旦重新打开关系图,你就会看到该表被删除了,也就 不再出现在关系图中。 在同时有多个开发者在数据库上进行工作时,在 SSMS 的数据库关系图工具中所做的 任何更改都不会对其他开发者的关系图产生影响,直到他们的更改被保存且他们的关系图被 刷新。如果打开了多个关系图,并在其中修改了一个表,例如插入或删除了列,那么这种更 改会立刻对你自己的 SSMS 中的所有其他已打开的关系图产生影响。不要忘记这是一个内 存中的操作,所以这个过程不会对其他人的关系图产生影响,直到更改被保存且关系图被刷 新。 同样,如果在关系图中删除了一个对象,当你保存该关系图时,该对象会被删除,而其 他人在该对象上所完成的任何更改都会丢失。很明显,最后关闭关系图的人会是赢家。 简而言之,如果使用数据库关系图工具,一定要小心。因为很多过程都在内存中进行, 可能会不经意导致问题的发生。 【责任编辑:云霞 TEL:(010)68476606】 6.9.3 默认的数据库关系图 http://book.51cto.com 2009-05-15 13:17 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍默认的数据库关系图。  标签:数据库 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.9.3 默认的数据库关系图 尽管这并不是强制的,但我还是认为在每个数据库解决方案中,都应该构建一个默认的 数据库关系图,以便让开发者(无论有没有经验)可以直接看到数据库是如何被组织的。 默认的数据库关系图中,应该包含数据库中的每个表以及这些表之间的每个关系。其他 的关系图可能只为相关的事情提供部分的概览,但默认的数据库关系图不同,它应该包含所 能包含的一切。 正如前面提到的,让数据关系图保持最新是很必要的。你会注意到,在本章中这句话已 经重复多次了。不要将默认的关系图作为数据库解决方案的开发源来使用。默认的关系图中 包含所有的表,这意味着如果使用该关系图进行开发,就潜在地锁住了其他用户,其他用户 就无法在他们所处的开发环境内接触相应的表,他们的更改也会丢失。后面讨论将数据库关 系图作为开发源的时候,我们会看到更多有关这方面的细节。 既然你已经知道什么是关系图,以及什么是关系图工具,现在是时候为这个数据库创建 第一个关系图了。 练习:创建数据库关系图 (1) 确保 SSMS 正在运行,且 ApressFinancial 数据库被展开,以便看到其中的"数据库 关系图"和"表"节点。选择"数据库关系图"节点并右击,选择"安装关系图支持程序"(参看图 6-10)。 (2) 如果这是在该数据库上创建的第一个关系图,则需要安装支持对象。如果没有这些 对象,就无法创建关系图,所以在随后显示的对话框(参看图 6-11)上点击"是"。 (3) 在创建关系图时,所看到的第一个界面是"添加表"对话框(参看图 6-12)。如果希 望在关系图中包含所有表的话,选择其中列出的所有表,再点击"添加",这会"清空"该界面。 点击"关闭"。 (4) 在经过一段时间后,会返回到 SSMS 中,而数据库关系图则已经被构建。在这一时 刻,关系图会非常大,以至于不能在一个界面上同时显示出所有的表,可以通过关系图工具 条上的"大小"组合框来更改显示的比例,如图 6-13 所示。 图 6-10 创建新的数据库关系图 (点击查看大图)6-11 安装关系图支持 (点击查看大图)图 6-12 选择表 图 6-13 "大小"组合框 (5) 这时的关系图与图 6-14 所示类似(如果布局有不同,不要惊讶)。 (点击查看大图)图 6-14 迄今为止创建的表和关系 这就是创建一个基本关系图所需要的步骤。 【责任编辑:云霞 TEL:(010)68476606】 6.9.3 默认的数据库关系图 http://book.51cto.com 2009-05-15 13:17 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍默认的数据库关系图。  标签:数据库 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.9.3 默认的数据库关系图 尽管这并不是强制的,但我还是认为在每个数据库解决方案中,都应该构建一个默认的 数据库关系图,以便让开发者(无论有没有经验)可以直接看到数据库是如何被组织的。 默认的数据库关系图中,应该包含数据库中的每个表以及这些表之间的每个关系。其他 的关系图可能只为相关的事情提供部分的概览,但默认的数据库关系图不同,它应该包含所 能包含的一切。 正如前面提到的,让数据关系图保持最新是很必要的。你会注意到,在本章中这句话已 经重复多次了。不要将默认的关系图作为数据库解决方案的开发源来使用。默认的关系图中 包含所有的表,这意味着如果使用该关系图进行开发,就潜在地锁住了其他用户,其他用户 就无法在他们所处的开发环境内接触相应的表,他们的更改也会丢失。后面讨论将数据库关 系图作为开发源的时候,我们会看到更多有关这方面的细节。 既然你已经知道什么是关系图,以及什么是关系图工具,现在是时候为这个数据库创建 第一个关系图了。 练习:创建数据库关系图 (1) 确保 SSMS 正在运行,且 ApressFinancial 数据库被展开,以便看到其中的"数据库 关系图"和"表"节点。选择"数据库关系图"节点并右击,选择"安装关系图支持程序"(参看图 6-10)。 (2) 如果这是在该数据库上创建的第一个关系图,则需要安装支持对象。如果没有这些 对象,就无法创建关系图,所以在随后显示的对话框(参看图 6-11)上点击"是"。 (3) 在创建关系图时,所看到的第一个界面是"添加表"对话框(参看图 6-12)。如果希 望在关系图中包含所有表的话,选择其中列出的所有表,再点击"添加",这会"清空"该界面。 点击"关闭"。 (4) 在经过一段时间后,会返回到 SSMS 中,而数据库关系图则已经被构建。在这一时 刻,关系图会非常大,以至于不能在一个界面上同时显示出所有的表,可以通过关系图工具 条上的"大小"组合框来更改显示的比例,如图 6-13 所示。 图 6-10 创建新的数据库关系图 (点击查看大图)6-11 安装关系图支持 (点击查看大图)图 6-12 选择表 图 6-13 "大小"组合框 (5) 这时的关系图与图 6-14 所示类似(如果布局有不同,不要惊讶)。 (点击查看大图)图 6-14 迄今为止创建的表和关系 这就是创建一个基本关系图所需要的步骤。 【责任编辑:云霞 TEL:(010)68476606】 6.9.4 数据库关系图工具条 http://book.51cto.com 2009-05-15 13:17 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍数据库关系图工具条。  标签:数据库 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.9.4 数据库关系图工具条 下面让我们看一下数据库关系图工具条,了解一下每个工具按钮在关系图中的作用。完 整的工具条显示在图 6-15 中。 (点击查看大图)图 6-15 "数据库关系图"工具栏 第一个按钮是"新建表"按钮,如下面的图所示。点击该按钮可以在数据库设计器内创建 新表。这个过程同第 5 章介绍的过程类似。不同之处在于需要使用"属性"窗口来为每一列设 置属性,而不是像在表设计器中那样,在其下方区域设置列的属性。 在构建关系图时,我们选择了所有的表。如果当时没有选择所有的表,则在创建关系图 的时候,还可能会需要往关系图中添加表。点击"添加表"按钮(参看下图)可以打开"添加 表"对话框,该对话框前面已经显示过,它可以往关系图中继续添加表。 "添加相关表"按钮显示在下面,可以在设计器中添加同被选中表相关的表。 通过使用下面的按钮,可以在设计器中从数据库中删除表。 如果只是想从关系图中移除表,而不是从数据库中删除表,则可以使用下面的按钮来完 成该操作。例如,如果一个表不再作为数据库关系图"视图"的一部分,那么就可使用这个按 钮。 在设计器中,任何对数据库的更改都可以保存为脚本。使用下面的"生成更改脚本"按钮 就可以完成这项工作。 如果希望将某一列设置为主键,则可以在表中选中该列,然后点击"设置主键"按钮(如 下所示)。 可以在关系图中创建一个区域,以放入特别的文本。这可以通过使用下面的"新建文本 标注"按钮来实现。 每个表都以标准的布局方式而显示。可以让它以其他不同的预定义的布局形式来显示, 也可以创建自己的定制视图。下面的"表视图"按钮允许你更改布局或创建自定义的布局版本。 在表和表之间会存在关系,默认时显示为直线。然而,通过点击下面的按钮,可以在关 系线上以标签的形式显示关系的名称。 关系图是对数据库进行文档化的一种理想方式。可以在会议前打印关系图,以便在会议 上对更深入的开发工作进行讨论,等等。下面的按钮可以显示将被打印出来的页面上的分页 符。 关系图中的第一次设置的分页符会一直被保留,直至对分页符进行了重新计算。可以查 看分页符,并按照分页符的位置,对表进行排列,然后再基于新的布局,重新计算分页符。 点击下面的按钮就可以重新计算分页。 表可以被手工展开或折叠。而通过按住 Ctrl 键选择一个或多个表,再点击相关的表, 然后点击下面的按钮,就可以将表设置为统一大小。 通过点击下面的按钮,可以对选中的表进行重新排列,并让 SQL Server 来进行排列选 择。只有在选中了几个表时,该按钮才是可用的。 可以对显示在关系图中的表进行重新排列。在点击下面的按钮后,SQL Server 会尽可能 好地对表和相关联的表进行重新布局。该按钮与前一个按钮差不多,只是该按钮总是可用的。 在第 5 章,介绍了如何在两个表之间构建关系。那时所使用的按钮在这里也出现了。点 击该按钮会出现在第 5 章中显示过的那个对话框。 在第 5 章中,已经遇到过其余的按钮。 【责任编辑:云霞 TEL:(010)68476606】 6.10 小结 http://book.51cto.com 2009-05-15 13:17 董明等译 人民邮电出版社 我要评论()  摘要:《SQL Server 2008 基础教程》第 6 章创建索引和数据库关系图,本章介绍了数据库关系图。数据库 关系图一开始就应该被考虑作为文档的组成部分。本节为这一章的小结部分。  标签:数据库 SQL Server SQL Server 2008 基础教程  限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne 和甲骨文开发者大会 2010” 6.10 小结 我们已经介绍了在创建 SQL Server 解决方案时涉及的另一个主要的构建模块。前几章 介绍如何存储数据,而在这一章,你学习了关于索引的一些知识,以及如何通过索引快速和 高效地检索表中存储的数据。 有多种索引类型,在正确的时间选择正确的索引类型,可以让工作完成得像艺术品一样 完美。本章带你经历了确定在什么样的列上构建索引才会高效的步骤,并以正确的索引类型 在这些列上构建了索引,以创建大部分信息。 本章还介绍了数据库关系图。数据库关系图一开始就应该被考虑作为文档的组成部分。 请记住,数据库关系图工具可能会在 SQL Server 的未来版本中得到扩展,从而变得比现在 更实用、更强大,尽管现在它已经是一个很强大的实用工具了。 提示 记住,谁最后保存关系图,谁的更改就能被保存。 别惊讶,在关系图中的更改直到它被保存才会起作用,并且你在关系图中所做的更改可 能会覆盖别人所做的更改。如果在任何形式的多人开发环境中使用数据库关系图工具进行开 发,那么在完成更新之前一定要特别小心(事实上,应该避免多人一起使用这一工具)。除 非将数据库解决方案分割成多个部分,否则如果在一个关系图中几乎包含了所有的表,就不 要使用该数据库设计器作为开发工具。 【责任编辑:云霞 TEL:(010)68476606】 回书目 上一节 上一篇: 6.9.4 数据库关系图工具条 下一篇: 目录  相关文章  ·6.9.4 数据库关系图工具条  ·6.9.3 默认的数据库关系图  ·6.9.2 SQL Server 数据库关系图工具  ·6.9.1 数据库关系图基础  ·5.2.3 master 数据库启动的奥秘  频道热门  ·高效程序员的 45 个习惯:敏捷开发修炼之道  ·安防天下——智能网络视频监控技术详解与实践  ·2 月 IT 图书排行榜:跟我来学 Linux  ·Oracle Database 11g 初学者指南  ·Web 编程入门经典--HTML、XHTML 和 CSS(第 2 版)
还剩76页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 5 人已下载

下载pdf

pdf贡献者

gedb

贡献于2012-11-24

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf