麦迪文扮演者:sql 2005教程

来源:百度文库 编辑:九乡新闻网 时间:2024/05/04 16:41:48
第1章  SQL Server 2005概述和安装...... 1
1.1  为什么选择SQL Server 2005.. 1
1.2  SQL Server的发展..... 3
1.3  硬件要求..... 4
1.3.1  CPU.... 4
1.3.2  内存..... 4
1.3.3  硬盘空间..... 5
1.3.4  操作系统要求..... 5
1.4  示例..... 5
1.5  安装..... 6
1.6  标准安装..... 6
1.7  安全性..... 13
1.7.1  服务账户..... 13
1.7.2  身份验证模式..... 13
1.7.3  sa登录..... 17
1.8  小结..... 18
第2章  SSMS... 19
2.1  SSMS概览..... 19
2.2  SSMS的选项..... 26
2.2.1  “环境”节点..... 26
2.2.2  “源代码管理”节点..... 28
2.2.3  “文本编辑器”节点..... 29
2.2.4  “查询执行”节点..... 31
2.2.5  “查询结果”节点..... 33
2.3  查询编辑器..... 35
2.4  外围应用配置器工具..... 37
2.5  小结..... 40
第3章  设计和创建数据库...... 41
3.1  数据库的定义..... 42
3.2  SQL Server中的数据库..... 43
3.2.1  master... 43
3.2.2  tempdb... 44
3.2.3  model... 45
3.2.4  msdb... 45
3.2.5  AdventureWorks/AdventureWorks DW.. 45
3.3  决定数据库系统类型..... 46
3.3.1  OLTP... 46
3.3.2  OLAP... 47
3.3.3  示例系统类型选择..... 47
3.4  收集数据..... 48
3.5  决定要存储在数据库中的信息..... 49
3.5.1  金融产品..... 50
3.5.2  客户..... 51
3.5.3  客户地址..... 51
3.5.4  股票..... 51
3.5.5  交易..... 51
3.6  外部信息和忽略的信息..... 52
3.7  建立关系..... 52
3.7.1  使用键..... 52
3.7.2  创建关系..... 54
3.7.3  更多关于外键..... 57
3.8  规范化..... 58
3.8.1  每一个实体应该有唯一的
标识符..... 59
3.8.2  只存储与实体直接有关的信息..... 59
3.8.3  避免重复值或重复列..... 59
3.8.4  范式..... 60
3.8.5  非规范化..... 61
3.9  创建示例数据库..... 62
3.9.1  在SSMS中创建数据库..... 62
3.9.2  在SSMS中删除数据库..... 74
3.9.3  在查询编辑器中创建数据库..... 77
3.10  小结..... 79
第4章  安全...... 80
4.1  登录名..... 80
4.2  角色..... 88
4.2.1  固定服务器角色..... 88
4.2.2  数据库角色..... 90
4.2.3  应用程序角色..... 90
4.3  架构..... 93
4.4  在解决方案中进行下去之前..... 95
4.5  小结..... 99
第5章  定义表...... 100
5.1  什么是表..... 100
5.2  定义表:SSMS.. 101
5.2.1  表中的不同数据类型..... 102
5.2.2  程序中的不同数据类型..... 106
5.3  列不仅仅是简单的数据仓库..... 106
5.3.1  默认值..... 106
5.3.2  生成IDENTITY值..... 107
5.3.3  NULL值的使用..... 107
5.3.4  为什么要定义允许NULL值
的列..... 108
5.4  在SQL Server中存储图像和大型
文本..... 108
5.5  在SSMS中创建表..... 109
5.6  通过查询编辑器定义表..... 113
5.7  定义表:使用模板..... 115
5.8  创建模板和修改模板..... 118
5.9  ALTER TABLE命令..... 119
5.10  定义其余的表..... 121
5.11  设置主键..... 122
5.12  创建关系..... 123
5.12.1  在创建时检查现有数据..... 125
5.12.2  强制外键约束..... 126
5.12.3  删除规则/更新规则..... 126
5.13  使用SQL语句ALTER TABLE... 126
5.14  小结..... 128
第6章  创建索引和数据库关系图...... 129
6.1  什么是索引..... 129
6.1.1  索引类型..... 130
6.1.2  唯一性..... 132
6.2  确定是什么导致了好的索引..... 132
6.2.1  使用低维护列..... 132
6.2.2  主键和外键..... 133
6.2.3  找到指定记录..... 133
6.2.4  使用覆盖索引..... 133
6.2.5  查找信息范围..... 134
6.2.6  保持数据的排序..... 134
6.3  确定是什么导致了坏的索引..... 135
6.3.1  使用了不合适的列..... 135
6.3.2  选择了不合适的数据..... 135
6.3.3  包含了过多的列..... 135
6.3.4  表中包含的记录过少..... 135
6.4  针对性能对索引进行回顾..... 136
6.5  创建索引..... 136
6.5.1  在表设计器中创建索引..... 136
6.5.2  索引和统计信息..... 139
6.5.3  CREATE INDEX语法..... 140
6.5.4  在查询编辑器中创建索引:
模板..... 142
6.5.5  在查询编辑器中创建索引:
SQL代码..... 145
6.6  删除索引..... 148
6.7  在查询编辑器中修改索引..... 149
6.8  为数据库生成关系图..... 151
6.8.1  数据库关系图基础..... 151
6.8.2  SQL Server数据库关系图工具..... 152
6.8.3  默认数据库关系图..... 153
6.8.4  数据库关系图工具条..... 155
6.9  小结..... 157
第7章  数据库的备份、还原和维护...... 158
7.1  事务日志..... 159
7.2  备份策略..... 161
7.3  当可能发生错误..... 162
7.4  让数据库脱机..... 163
7.5  备份数据..... 164
7.5.1  使用T-SQL备份数据库..... 169
7.5.2  使用T-SQL进行日志备份..... 175
7.6  还原数据库..... 178
7.6.1  使用SSMS还原数据..... 178
7.6.2  使用T-SQL进行还原..... 181
7.7  分离和附加数据库..... 185
7.7.1  使用SSMS进行分离和附加
操作..... 185
7.7.2  使用T-SQL进行分离和附加
操作..... 190
7.8  为数据库生成SQL脚本..... 192
7.9  维护数据库..... 198
7.10  小结..... 207
第8章  操作数据...... 208
8.1  T-SQL的INSERT命令的语法..... 209
8.2  SQL命令INSERT... 209
8.2.1  默认值..... 212
8.2.2  使用NULL值..... 212
8.3  DBCC CHECKIDENT... 216
8.4  列约束..... 217
8.5  同时处理多条记录..... 222
8.6  检索数据..... 224
8.7  使用SSMS检索数据..... 224
8.8  SELECT语句..... 226
8.9  指定列..... 228
8.10  第一批搜索..... 229
8.11  改变输出的显示..... 231
8.12  限制搜索:WHERE的使用..... 232
8.12.1  SET ROWCOUNT n... 235
8.12.2  TOP n... 236
8.12.3  TOP n PERCENT... 237
8.13  字符串函数..... 237
8.14  顺序!顺序!..... 239
8.15  LIKE运算符..... 240
8.16  生成数据:SELECT INTO... 242
8.17  谁能添加、删除或选取数据..... 244
8.18  更新数据..... 248
8.18.1  UPDATE命令..... 248
8.18.2  在查询编辑器中更新数据..... 250
8.19  事务..... 253
8.19.1  BEGIN TRAN... 254
8.19.2  COMMIT TRAN... 254
8.19.3  ROLLBACK TRAN... 255
8.19.4  锁定数据..... 255
8.19.5  更新数据:使用事务..... 255
8.19.6  嵌套事务..... 257
8.20  删除数据..... 259
8.20.1  DELETE的语法..... 259
8.20.2  使用DELETE语句..... 259
8.21  截断表(删除表中的所有行)..... 261
8.22  删除表..... 262
8.23  小结..... 263
第9章  构建视图...... 264
9.1  什么是视图..... 265
9.2  针对安全而使用查询..... 265
9.3  加密视图定义..... 266
9.4  创建视图:SSMS.. 267
9.5  使用视图来创建视图..... 272
9.6  CREATE VIEW语法..... 277
9.7  创建视图:查询编辑器窗格..... 278
9.8  创建视图:SCHEMABINDING... 279
9.9  为视图设置索引..... 282
9.10  小结..... 285
第10章  存储过程...... 286
10.1  什么是存储过程..... 286
10.2  CREATE PROCEDURE语法..... 287
10.3  返回一系列记录..... 290
10.4  创建存储过程:SSMS.. 290
10.5  执行存储过程的不同方法..... 294
10.5.1  不使用EXEC... 294
10.5.2  使用EXEC... 294
10.6  使用RETURN... 295
10.7  控制流程..... 299
10.7.1  IF...ELSE... 299
10.7.2  BEGIN...END... 300
10.7.3  WHILE...BREAK语句..... 300
10.7.4  CASE语句..... 302
10.8  综合应用..... 305
10.9  小结..... 307
第11章  T-SQL基础...... 308
11.1  使用多个表..... 308
11.2  变量..... 313
11.3  临时表..... 315
11.4  聚合..... 318
11.4.1  COUNT/COUNT_BIG... 318
11.4.2  SUM... 319
11.4.3  MAX/MIN... 319
11.4.4  AVG... 320
11.5  GROUP BY... 320
11.6  HAVING... 322
11.7  独特值..... 323
11.8  函数..... 324
11.8.1  日期和时间函数..... 324
11.8.2  字符串函数..... 327
11.8.3  系统函数..... 333
11.9  RAISERROR... 336
11.10  错误处理..... 340
11.11  @@ERROR... 340
11.12  TRY...CATCH... 342
11.13  小结..... 345
第12章  高级T-SQL... 346
12.1  子查询..... 346
12.1.1  IN... 348
12.1.2  EXISTS... 349
12.2  APPLY运算符..... 350
12.2.1  CROSS APPLY... 350
12.2.2  OUTER APPLY... 351
12.3  公用表表达式..... 352
12.4  透视数据..... 355
12.4.1  PIVOT... 355
12.4.2  UNPIVOT... 357
12.5  排名函数..... 358
12.5.1  ROW_NUMBER... 359
12.5.2  RANK... 361
12.5.3  DENSE_RANK... 362
12.5.4  NTILE... 363
12.6  使用MAX数据类型..... 363
12.7  小结..... 367
第13章  触发器...... 368
13.1  什么是触发器..... 368
13.2  DML触发器..... 369
13.3  针对DML触发器的CREATE TRIGGER
语法..... 370
13.4  为什么不使用约束..... 372
13.5  对逻辑表进行删除和插入..... 372
13.6  创建DML FOR触发器..... 373
13.7  检查特定的列..... 377
13.7.1  使用UPDATE()... 377
13.7.2  使用COLUMNS_UPDATED()... 381
13.8  DDL触发器..... 384
13.9  删除DDL触发器..... 387
13.10  EVENTDATA()... 387
13.11  小结..... 390
第14章  SQL Server Reporting Services.. 391
14.1  什么是Reporting Services.. 391
14.2  Reporting Services架构:远观..... 392
14.3  Reporting Services架构:更近的
观察..... 393
14.3.1  应用程序层..... 394
14.3.2  服务器层..... 395
14.3.3  数据层..... 397
14.4  使用报表向导构建第一个报表..... 398
14.5  构建即席报表..... 401
14.5.1  数据相关的元素..... 402
14.5.2  报表项..... 402
14.5.3  报表结构..... 403
14.6  小结..... 409
附录  术语表...... 410
译序
随着网络的飞速发展、信息技术的突飞猛进,作为形形色色网络应用程序的后台,数据库应用程序以难以置信的速度覆盖了各行各业。这些数据库应用程序常常是以关系型数据库系统为支撑的。
在主流的关系型数据库管理系统中,SQL Server 2005是较为易用且功能非常强大的一种,其功能涉及方方面面,要想全面掌握它不是一件容易的事。对于初学者来说,只有围绕某一主线,由浅入深地进行学习,才能快速入门。
本书正是这样一本读物,它适合那些希望使用SQL Server 2005进行开发,但对其尚不了解或者仅对关系型数据库略知一二的人士阅读。
作为一本引领初学者入门的读物,本书的最大特点是侧重阐述基础知识,对于可能会扰乱读者的较为生僻或者繁难的知识点,作者总是点到为止:一方面,不厌其烦地反复讲述基本的图形界面操作方法,以加深读者的印象,让读者在不知不觉中逐渐熟悉基本的操作;另一方面,作者在讲解完图形界面操作步骤之后,会立即给出实现相应功能的T-SQL代码,使读者能够在明了代码执行效果的基础上,更轻松地掌握T-SQL代码,而这些代码正是开发者所必须了解的。此外,作者在讲述基础知识的同时,也不忘从大处着眼,始终让读者以一个完整的数据库(的创建或使用)为考虑问题的出发点。具体来说,本书的前半部分以建立一个金融数据库系统为主线,从最基础的收集信息入手,一步步地引导读者学会如何保证数据库的安全,创建表、主键、索引等对象,在表之间建立恰当的关系,并掌握如何备份和还原数据库;本书的后半部分将以前面建立的示例数据库为基础,深入讲解各种数据操作的方法,从数据检索、插入、更新、删除,到函数、触发器、存储过程的使用;在本书的最后,概略讲述了SQL Server Reporting Services,以便读者对此有所了解,为进一步深入学习奠定良好的基础。
最后要说明的是,由于译者水平有限,译文中难免有疏漏、谬误,还望大家不吝指正。
本书针对那些想成为开发者、数据库管理员或者兼为两者,但对SQL Server 2005还不熟悉的读者。无论你是否拥有数据库知识、了解桌面数据库(如MS Access),甚至具有基于服务器(如Oracle)的背景,本书都能为你提供SQL Server 2005入门和运行的知识。
从现在开始,你的基础知识将得以扩展,很快从初学者成长为合格的专业开发者。本书面向广大开发者,从喜欢使用图形界面的程序员,到希望成为SQL Server 2005编程语言(T-SQL)高手的程序员。本书将尽可能贴近实际地演示、说明和展开叙述每一种使用SQL Server 2005的方法,以便你能够判断哪种方式最适合自己。
本书针对数据安全性方面的操作和细节提供了大量示例。你还能学到完成某项任务的最佳方法,甚至也能了解在有两个或更多个选择存在时如何做出正确的选择。
一旦阅读完本书,你将能够娴熟地设计和创建坚实可靠的数据库解决方案。
致谢
首先,我要感谢贝德福德橄榄球俱乐部(www.bedfordrugby.co.uk)的那些“无名英雄”,这些年来,是你们让我的星期六变得如此不寻常。从伟大的Colin Jackson(他任橄榄球主管的第一赛季,便使俱乐部摆脱了勉强维持的处境)到参加俱乐部并全力奉献的运动员们,你们使我们在Twickenham的日子变得那么那么的特别。另外,也要感谢我在俱乐部中的许多朋友,如Bernie McGee、Lee Smith、Nigel Rudgard、Nigel和Sarah Crowe以及Sam Roberts(这里仅列出几个名字)。此外,还要感谢我的教练Junior Blues、Alan Grosvenor、Richard Porter和Rob Robson,他们在我需要暂时停止训练以便写作本书以及其他Apress出版社出版的图书时,给予了充分的理解。
接下来,要感谢与我一起工作的同事Martin Price、Henry Williams、Bill Cotton、Rakesh Juneja以及Jack Mason,是你们让我的生活从每天早晨5点就地狱般地开始了(只是玩笑而已!);特别是Anthony Jawad,若非有你,这9年将不可能是这样的。还有Jock,我对你感激不尽。噢,对了,还要感谢我长期饱受煎熬的训练伙伴Andrew Lockwood和Paul Goodwin……我保证要早睡,并且,为了让你们不再受我震天价响的呼噜声折磨而久久不能入眠,我决定要减一点点的体重。
当我需要全神贯注工作时,再没有比音乐更有助益的了,而且,也再没有比来自BBC(www.bbc.co.uk/6Music)的6Music更好的音乐了。特别是每天由以下几位主持所播放的优秀音乐:非常有趣的早餐秀中的Phill Jupitus和Phil Wilding;Gideon Coe和他非常规的幽默;才华横溢的Vic McGlynn,他使我整个下午都保持清醒。
同样,当我需要放松时,要感谢Sandy Hills Amusements(位于Norfolk的Sea Palling)的Debbie和Charlie Roberts给我提供了全英国最好的娱乐休闲活动!此外,还要感谢Axis(www.axis.com)很棒的网络摄影。最后,要感谢Friends Reunited,让我能与大学里最好的朋友Robert “Toad” McMillan取得联系。
这里,还要感谢我的岳母Jean。多谢Lanzarote,她自始至终帮助Julie解决许许多多、形形色色的家庭里和住宅中的事务。当然,也要感谢我已故的岳父David,我们都十分想念David,他所给予我们的宝贵帮助和指引,实在是怎么谢都不够。
还要感谢我的母亲Laura和父亲Scott。多谢你们,从我的ZX80使用电视而使你们不能观看电视,到为我找到大学,如果不是你们这样一如既往、贯穿始终地在我的生命中帮助我,我绝不可能拥有现在这样幸福而绝妙的生活。实在不知道该怎么谢你们,你们真是最好的父母。另外,要谢谢我的姐姐Carol以及她的孩子Eleanor、Erin和Lucas,真希望我们现在就到澳大利亚去。
这里,必须感谢Apress出版社的所有同仁们,特别是Dan Appleman,他使本书得到了众多作家的支持。此外,还要感谢Beth Christmas、Kylie Johnson、Tina Nielsen、Matt Moodie、Nicole Le Clerc、Ami Knox、Kelly Winquist和饱受煎熬的Tony Davis,以及那些在幕后编制索引的人士,等等,正是有了他们提供的宝贵工作,本书才得以出版。
另外,要感谢Cristian Lester在本书第14章中所给予的帮助。由于时间紧迫,第14章只有很少的准备时间,他很爽快地伸出了援助之手。
十分感谢Jasper Smith对本书所做的技术审校。在撰写本书时,很容易出现愚蠢的遗漏或错误,正是由于拥有Jasper这样有才华和知识的人士,才使得本书获得如此成功。
无疑,我还漏掉了许多应该感谢的人,对于他们我十分抱歉。
欢迎阅读本书。我们假定你对于SQL Server 2005尚不了解,但对于使用Microsoft SQL Server 2005创建解决方案很有兴趣。你可能熟悉其他一些数据库(如MySQL、Oracle或者Microsoft Access),但相对于其他的数据库产品,SQL Server无论是在界面上还是在工作方式上都有所不同。本书旨在使读者快速达到游刃有余地使用SQL Server 2005进行开发的水平。本书专门针对SQL Server 2005的新手,以及即将开始使用SQL Server 2005的读者。本书对于理解市面上其他数据库产品的基础知识也大有裨益,尤其是在使用T-SQL方面。由于许多数据库都使用基于ANSI标准的SQL,因此在学完本书之后,从SQL Server转向Oracle、Sybase等数据库也更为容易。
本章包含如下主题:
q  为什么选择SQL Server 2005?
q  怎样知道硬件是否符合要求?
q  是否可以确定拥有合适的操作系统?
q  使用SQL Server 2005能够做什么?
接下来关注所选定版本的安装,这一节包含如下内容:
q  在Windows XP平台上安装SQL Server 2005。
q  默认没有安装的选项。
q  物理上,SQL Server安装在何处?
q  一台计算机上的多个安装。
q  SQL Server在机器上如何运行?
q  如何实现安全性?
q  SQL Server的登录ID,特别是sa(系统管理员)登录。
1.1  为什么选择SQL Server 2005
下面的论述是我个人的观点,无疑与其他人的观点会有所不同,但基本要点是没有问题的。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 2005都要求用户必须在服务器上安装.NET Framework。然而,从开发者的角度看来,Oracle在许多方面都算不上是用户友好的,例如它专门的SQL Query工具、XML和Web技术工具,以及建立完整数据库解决方案的方式。Oracle的其他一些缺点还包括它较高的价格以及在安装和高效运行上的复杂性。尽管SQL Server也能同样高效地工作,但Web搜索引擎还是广泛地使用Oracle。具有新功能的SQL Server 2005将给Oracle带来压力,迫使其扩展现有的功能以迎接挑战。SQL Server向来是一次性购买的解决方案,如果购买了正确版本的SQL Server,那么用于分析数据或从一个数据源(如Excel)向SQL Server中复制数据的所有工具都将包含于其中。而对于Oracle,必须额外购买所需要的每一个附加特性。
接着来看看Sybase。Sybase与SQL Server十分相似,它们之间的主要不同是:Sybase没有图形用户界面前端。主要用于小规模安装的Sybase Adaptive Server Anywhere是有前端的,但高端的Sybase没有。有些人可能认为图形用户界面前端首先是为那些不懂得如何写代码的人准备的(当然,这是他们的一家之言),因而没有必要有图形用户界面前端,可照此逻辑,既然指向、点击和拖动就可以搞定,为什么还要按下60多个键呢?
虽然Sybase有用于Windows 2000的版本,但它主要还是用在UNIX上。尽管可以通过工具从Windows 2000/XP的机器连接到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的发展
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数据库
再一次对核心数据库引擎进行了重大改写。这是相当强大的、具有丰富特性的数据库产品的明确发布,该数据库介于基本的桌面数据库(如MS Access)与高端企业级数据库(如Oracle和DB2)之间(价格上亦如此),为中小型企业提供了切实可行(并且还廉价)的可选方案。该版本易于使用,并提供了对于其他竞争数据库来说需要额外附加的昂贵的重要商业工具(例如,分析服务、数据转换服务),是以获得了良好的声誉
2005
SQL Server 2005
对SQL Server的许多地方进行了改写,例如通过名为集成服务(Integration Service)的工具来加载数据,不过,SQL Server 2005最伟大的飞跃是引入了.NET Framework。引入.NET Framework将允许构建.NET SQL Server专有对象,从而使SQL Server具有灵活的功能,正如包含Java的Oracle所拥有的那样
1.3  硬件要求
在对SQL Server稍有了解之后,接下来要涉及的重要问题很可能是“我所拥有的计算机是否足以运行所选择的SQL Server版本?这是否有助于我的决策?”
若根据现今的最低硬件规格标准来判断,哪怕是最低成本的方案,多数情况下对于大部分的SQL Server版本,其答案都是肯定的。然而,手边可能会有较早的硬件(事物发展得如此之迅速,即便是几个月前购买的硬件,也可能很快就被认为是低于当前最低硬件规格标准的),因此,需要了解一下最低硬件要求是什么,并以此检查所拥有的计算机,以确定是否具备满足需求的硬件资源。
1.3.1  CPU
对于运行SQL Server的CPU,建议的最低要求是:500MHz的处理器、兼容的处理器,或具有类似处理能力的处理器。然而,像这里列出的大多数最低要求一样,微软事实上推荐的是更快的、1GHz的处理器。处理器越快,SQL Server运行得就越好,由此而产生的瓶颈也越少。现在的很多机器使用的都是2GHz及以上的处理器,500MHz在几年前就已经不是标准配置了。如果当前使用的是较低速的处理器,那么设法在处理器更新换代上进行投资,这样将缩减开发所花费的时间。
然而,跟提升SQL Server的运行速度相关的硬件并非只有处理器,SQL Server的速度很大程度上也受当前计算机中内存数量的影响。
1.3.2  内存
确认系统的处理器速度足以满足需求后,接着要检查系统中是否有足够的内存。除Windows Express版和Mobile版外,其他所有版本的SQL Server都要求计算机至少要有512MB的内存。在这种硬件配置下,能够使用的许多版本的SQL Server将可以运行,当然,不应该打开和运行太多的应用程序,因为那样很容易让SQL Server得不到足够的内存,从而使其运行变慢。微软推荐1GB或者更大的内存,当真正开始使用SQL Server时,实际上内存大小至少应该是推荐的2倍。
Windows Express版和Mobile版的最低内存需求是128MB。
另一方面,如果要运行Enterprise Edition,特别是若想要使用更高级的特性时,则至少(最低限度)需要有1GB的内存。
内存越大越好,对于任何开发者所使用的计算机,强烈建议至少要有1GB的内存,若有2GB则比较理想,这样才能够获得良好而全面的性能。如果内存足够大,那么进程就可以保持在内存中,而不是在要运行另一个进程时,将进程交换到硬盘上或别的区域中,因而当要从进程停止的地方继续运行时,则不必等待SQL Server重新载入回内存。上面的情形称为交换(swapping),内存越大,可能发生的交换就越少。
将CPU速度和内存作为一个整体来考虑,正是这两方面因素对于计算机运行速度至关重要。当运行速度足够快时,开发的速度也将尽可能地快。
1.3.3  硬盘空间
SQL Server需要比较多的硬盘空间!这不足为怪,如今主要的应用程序都是需要大量的硬盘空间的!不考虑要添加的数据文件,SQL Server自身将占用1GB以上的硬盘空间。当然,本章后面要用到的安装选项将决定总共所需的硬盘空间。通过选择不安装某个可选部件,可以减少对硬盘空间的需求,例如选择不安装联机丛书。不过,如今即便是大多数的笔记本电脑,都至少配有40GB的硬盘,配备80GB的硬盘也是稀松平常的事。硬盘空间是廉价的,因此,最好是购买容量远远超出当前所需容量的硬盘,而不要采用恰好满足眼下空间大小需求的硬盘,使得将来可能不得不另行购买硬盘以满足增长的需求,这样将随之带来移动资料、整理原先硬盘上的空间等问题。
此外,还需要在硬盘上留有备用的空间,以满足SQL Server和数据库的扩展所需。另外,还需要为开发过程中要用到的临时文件准备硬盘空间。总之,考虑大的硬盘空间吧——多多益善!
1.3.4  操作系统要求
SQL Server 2005可以运行在Windows 2000 Professional SP4及更高版本上,或者运行在所有Windows XP SP2以及更高版本上。它也可以运行在Windows XP的64位操作系统上,以及Windows Server 2003的64位版本上。因此,可以运行SQL Server的操作系统是很多的。
1.4  示例
为了充分展示SQL Server 2005,我们将一起为一家金融公司开发一个系统,该系统具有存款、股票购买以及定期购买(如信托投资储蓄计划)等特性。该应用程序适合大型机构,或者稍加修改,也能够供个人记录银行业务使用。
本书基于这种观念来开发实例,演示如何将所采纳的想法在设计中用正确的架构表达出来。由于不想把注意力从SQL Server转移开,因而没有对这个例子做更多的处理,应该说只是刚好能运行而已。通过学习本书,将具备足够的知识和能力,来根据实际金融应用程序的需求扩展这个例子,使其细节和复杂度能够完全满足实际所需。
当然,在讲述这些之前,首先要安装SQL Server。
1.5  安装
本章将介绍SQL Server Developer Edition的安装过程,事实上在每一种版本的安装过程中所看到的几乎都一样。本书要讲述的选项和组合可以在一个安装过程中完成。安装过程中包含有SQL Server提供的许多不同的工具。先来看看这些工具,以便对它们有基本的了解,从而决定将安装什么。
安装包含很多不同的范围:
q  安全问题。
q  不同的安装类型——是首次安装并且安装的是SQL Server的第一个实例,还是用于开发、测试或生产的后续实例的安装。
q  自定义安装。
q  只安装少许有用的产品。
本章介绍的安装过程将涉及这些范围中的大多数,因此,到本章末,读者将具备足够的自信和知识来根据自己的需要完成任何后续的安装。
1.6  标准安装
现在,是时候在机器上安装SQL Server 2005了。微软在http://www.microsoft.com/sql/ evaluation/trial/提供了120天试用版,如果手头没有SQL Server 2005,可以使用这种试用版来学习本书的例子。
本书选择使用Developer Edition,因为该版本最符合开发者所需,它没有Enterprise Edition对于操作系统的种种要求。在CD-ROM中插入Microsoft SQL Server 2005所选择版本的光盘,启动安装程序。接下来讲述标准安装。
准备安装
首先,确认以管理员身份登录,从而能够在机器上创建文件和文件夹,这显然是成功安装所必需的。
如果是使用CD-ROM进行安装,并且安装进程没有自动启动,就打开Windows资源管理器并双击autorun.exe(位于CD-ROM根目录)。如果并非使用CD-ROM进行安装,则双击可执行的安装程序。
现在,将看到所选择版本的Microsoft SQL Server 2005的安装界面,如图1-1所示。在接受SQL Server最终用户协议(End User Agreement)后,SQL Server将先安装一些支持文件。这些文件是SQL Server的一部分,包含在SP服务包中,构成安装进程的一部分。主要的文件有setup文件以及必需的 .NET Framework版本(如果尚未安装 .NET Framework的话)。
图1-1  开始安装
.NET是微软创建的一种框架,允许用不同编程语言(如VB.NET、C#以及其他)编写的程序有一个公共编译环境。SQL Server 2005在其自身内部的一些工作要使用 .NET,当然,开发者也可以用任何微软的 .NET语言编写 .NET代码,放入SQL Server中。
注解    包含.NET代码是超出本书讲述范围的高级主题。更多相关信息请参看Pro SQL Server 2005 Assemblies(Apress,2006)。
然后,SQL Server 2005安装向导显示欢迎界面。单击“下一步”。
接着是“系统配置检查”界面,如图1-2所示,其主要作用是检查计算机是否满足硬件和软件要求。安装特定的部件有特定的要求,例如,SQL Server Reporting Services(随SQL Server 2000附加的一个工具,用于从SQL Server产生报表)要求安装IIS(因特网信息服务)。IIS是运行在计算机上的一个进程,用以提供运行Web服务器的能力。SQL Server Reporting Services是基于Web的。
然后,如图1-3所示,需要输入注册信息。
图1-2  带警告的系统配置工具
图1-3  注册信息页面
1.选择要安装的组件
接着,来到“要安装的组件”界面,需要作出一些决定。如图1-4所示,此处的安装会安装所有的组件,因为这将是一个开发实例,开发者将脱离所有正在进行的项目开发来测试SQL Server的各个方面。不过,也可以通过单击“高级”,有选择性地安装需要的组件部分。
图1-4  选择安装所有的组件
下面,简要说明一下图1-4中的每一个组件:
q  SQL Server Database Services:这是SQL Server 2005的主要核心,安装SQL Server运行所需的主要引擎、数据文件等。
q  Analysis Services:通过使用该工具,获取数据集并对数据切块、切片,分析其中所包含的信息。
q  Reporting Services:该服务允许从SQL Server生成报表,而不必借助第三方工具,如水晶报表(Crystal Report)。该组件将在第14章详细讲述。
q  Notification Services:该服务允许将通知(如消息)发送到目标区域(如SMS或任何在侦听的进程),这样当特定动作发生时便能“获悉”。
q  Integration Services:该组件允许用数据源(不仅可以是SQL Server,而且可以是Oracle、Excel等)导入和导出数据。
q  工作站组件、联机丛书和开发工具:在工作站上进行工作的一些工具。选择该组件将安装在SQL Server中使用的GUI(图形用户界面),也可以安装帮助和联机丛书等。
在以上这些组件中,Analysis Services、Notification Services和Integration Services超出了本书的范围,故本书将不会就这些组件作进一步的讨论。
在“要安装的组件”界面中,单击“高级”,将更详细地显示组件的各个部分,以便更精确地选择要安装的组件,如图1-5所示。在其他软件(如Microsoft Office)的安装中,也会遇到类似这样的界面。确保选中所有的选项,这样当本书提及SQL Server 2005的某种特性时,能确知该特性当前可用。将滚动条拖到界面底端,确保安装示例数据库。
注解    除了用于学习SQL Server的数据库服务器外,其他服务器上不必安装示例数据库。
图1-5  高级选择界面,在这里可以精细地定义安装选项
2.为实例命名
众所周知,SQL Server是安装在计算机上的,那么在一台计算机上多次安装SQL Server是完全有可能的。如果服务器功能强大,有足够的资源(如内存、处理器等)运行二三个不同的应用程序,这种情形就可能出现。这些不同的应用程序都想拥有自己的SQL Server。每一个安装称为一个实例(instance)。现在应该为安装的实例命名。每一个实例必须有一个属于它的唯一的名字,就连“无名”的默认实例(Default Instance),其“无名”也算作是一个唯一的名字。
作为建立外部环境的第一步,为实例命名是很重要的。例如,可能有一个实例用于开发,一个实例用于系统测试,最后还有一个实例用于用户测试。
当没有为安装指定明确的名字时,将选定为默认实例。一旦在学习环境之外安装SQL Server,则应避免这种情况,因为这样会导致没有命名的安装,从而关于它的使用也没有任何提示。因为目前尚在学习阶段,而最易于理解的选项是使用默认实例,所以如图1-6所示,选择“默认实例”,并单击“下一步”。
如果这是一个后继的安装,那么,将显示当前已存在的组件,如图1-7所示。
图1-6  为安装的实例命名
图1-7  罗列任何已安装的组件
3.服务账户
正如用户在使用系统前必须先登录到Windows一样,SQL Server以及在“功能选择”界面(见图1-5)中定义的其他服务在启动前必须先登录到Windows。SQL Server、Reporting Services等服务不需要任何人登录到安装SQL Server的计算机上就可以运行,只要计算机成功启动即可。当SQL Server安装在位于远程服务器机房中的服务器上时,这种情况极为平常。
无论如何,若没有某种形式的登录,任何程序都不能在Windows上运行的。如果确实登录到了计算机上,那么,可以将该Windows用户ID用于SQL Server,以进行登录并启动其服务。在学习本书的过程中,很可能会采用这种方式,因为SQL Server是运行在本地系统上的。这种账户叫做本地系统账户(local system account)。
另一方面,也可以创建完全由SQL Server使用的Windows登录。这种方式的存在有几点理由。举例来说,Windows账户可能配置成使密码在设置后一定天数过期,或者在数次不正确的密码输入后将其锁定。这样做是为了在许多其他区域中保护计算机和网络。无论如何,SQL Server将使用单独的账户,该账户同样具有密码期限,并且具有在多次不正确的密码尝试后锁定账户的能力。这种非用户特定的、“普通”的账户去除了SQL Server与机构中某个人之间的联系。
SQL Server安装于何处将影响到这里所作的决定。鉴于现在正处于SQL Server 2005的学习阶段,就不必弄得太复杂。假定安装是用于学习SQL Server的,因此,如图1-8所示,选择“使用内置系统账户/本地系统”。还可以定义当计算机启动时需要启动的服务。眼下保持界面中的默认值即可,因为以后可以通过“控制面板”里的“管理工具”中的“服务”随时进行更改。单击“下一步”。
4.身份验证模式
现在,将定义如何在SQL Server的安装中强制实施安全性。如图1-9所示,这里有两个选择:Windows身份验证模式和混合模式。在本章的后面,你将了解更多关于模式的知识。这十分简单明了:Windows身份验证模式表明将使用Windows的安全机制维护SQL Server的登录;混合模式则或者使用Windows的安全机制,或者使用SQL Server定义的登录ID和密码。此外,还需要为名为sa的特殊登录ID设置密码。关于这些,很快你将了解到更多,但目前必须为其输入一个有效的密码,请使用有意义的、难以猜测的密码。
图1-8  选择服务账户
图1-9  选择身份验证模式
5.排序规则设置
排序规则指明在SQL Server中如何对数据行进行排序和比较。例如,排序规则设置将告知SQL Server关于系统是否区分大小写等细节。如之前的设置步骤所示,可以为每一种SQL Service设置不同的排序规则,因此,在Analysis Services中使用的排序方法可以不同于主要的SQL Server安装所定义的排序规则。当在不止一种服务上进行这种处理时,会导致额外的处理复杂性,因而仅在特殊情况下才这样做。图1-10显示了Windows排序规则被选中的情形。
6.Reporting Services数据库
由于前面选择了安装Reporting Services,所以需要创建报表服务器所使用的数据库。根据你的需求以及使用SQL Server安装的程度,或许会希望报表脱离单独的、有特定用途的SQL Server安装来运行。当前,Reporting Services是安装在同一个SQL Server上的(如图1-11所示)。
图1-10  选择排序规则
图1-11  安装为默认Reporting Services
7.错误和使用情况报告设置
在SQL Server中,可以自动报告任何错误并把错误报告发送到微软,其中包含SQL Server异常关闭时的致命错误。推荐启用图1-12中的错误设置。因为不会发送组织机构的任何信息,所以数据依然是安全的。这与在Excel崩溃时发送报告是类似的。最好是使该功能处于激活状态。
当安装完成时,将显示最后一个界面,如图1-13所示。可以通过单击“摘要日志”链接来查看安装日志。页面底部有一个滚动文本框,其中列出了一些建议和信息。在这两个区域之间,有一个到SQL Server新工具的链接,这个新工具称作外围应用配置器工具(Surface Area Configuration tool)。该工具可用于启用或禁用功能、服务等,这将在第2章讲述。现在不必去点击那个链接,因为以后将从“开始”菜单直接使用这一工具。
图1-12  错误和使用情况报告设置
图1-13  安装完成详情
就这样,现在可以准备安装了。
1.7  安全性
为了透彻地讨论安装中遇到的“服务账户”对话框,需要深入研究Windows安全性。
本节中,首先考查Windows服务(而非程序)的概念,然后讨论在安装SQL Server时可以选择的不同的身份验证类型。
1.7.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完全能够通过服务进程来巧妙地处理发生的问题。
现在,来进一步讨论在安装过程中对于身份验证模式所做的选择。
1.7.2  身份验证模式
将要应用于服务器上的身份验证模式,或许是整个安装过程中最至关重要的信息以及要作出的最重大的决定。正如在前面的设置过程中看到的,关于身份验证模式有两个选项:Windows身份验证模式(Windows authentication mode)和混合模式(mixed mode)。
1.Windows身份验证模式
要登录到Windows 2000/2003/XP机器上,必须提供用户名。关于这一点,没有选择的余地(不像Windows 9x/ME那样,用户名是可选的)。因此,要登录到Windows,必须先验证用户名和密码。当完成这一步时,Windows事实上是在域控制器中根据用户名凭据验证用户;或者,如果SQL Server是在本地的独立机器上运行,则进行本地验证。凭据检查用户所属的访问组(用户权限)。用户可以上至管理员,具有改变计算机中任何事物的能力,也可以下至基本用户,只拥有极其有限的权限。于是这就给出了一种信任连接,换句话说,在登录Windows之后启动的应用程序可以相信,经Windows校验,账户已经通过了必要的安全检查。
一旦登录到Windows,SQL Server就将使用信任连接。如前面所述,这意味着SQL Server相信已经验证过用户名和密码了。可是,如果用户名不存在,则不能登录。而其他用户使用他们的用户ID和密码能够登录到机器上,并且,可以通过找到C驱动器上的可执行文件到达SQL Server,但SQL Server首先要检查其在SQL Server中是否拥有有效的登录。如果登录无效,那么将检查用户所属的Windows组,并检查其安全性,以确定该组是否可以访问SQL Server。如果该用户具有管理员权限,则至少连接到SQL Server上是完全不成问题的。
目前的情况有点进退维谷。在安装过程中,需要了解安全性,可是要充分说明它意味着要在SSMS(SQL Server Management Studio)中进行工作,而这是下一章要讲述的内容。为了使其简单,现在先看一个涉及安全性的例子。
练习:Windows身份验证模式
(1) 确保以管理员身份登录到机器上。如果是本地计算机,有可能当前的登录就是管理员ID;如果是网络中的计算机,并且不能确定访问权限,请求助于计算机管理人员,以帮助解决ID和密码的问题。
(2) 单击“开始”→“控制面板”,选择“用户账户”。
(3) 当出现“用户账户”对话框时,单击“创建一个新账户”。
(4) 如图1-14所示,当出现“为新账户起名”对话框时,输入用户名AJMason。完成后,单击“下一步”。
(5) 确保指定的账户类型是“受限”(如图1-15所示)。这意味着该账户没有管理员权限。
(6) 因为要添加第二个用户名,故停留在“用户账户”对话框中。重复前述的步骤,并使用如下资料:
用户名:VMcGlynn
账户类型:计算机管理员
(7) 从Windows中注销,然后用刚才创建的第一个ID(AJMason)登录。
图1-14  创建新的用户账户
图1-15  选择新用户的账户类型
(8) 登录后,通过选择“开始”→“所有程序”→“Microsoft SQL Server 2005”→“SQL Server Management Studio”,启动SSMS。
(9) 查看出现的错误消息,错误消息应该与在图1-16中所看到的类似。AJMason作为一个登录没有在SQL Server中明确定义,并且也不属于允许访问的组。当前唯一的组是在Windows的Administrators组中的一个用户。回想前面,AJMason是受限用户。
图1-16  登录到服务器失败
(10) 接下来测试刚才创建的另一个用户。关闭SQL Server,从Windows中注销,使用创建的第二个ID登录——VMcGlynn。登录Windows以后,启动SSMS并连接到服务器上。这一次可以成功登录。
前面创建的两个用户名,一个具有受限的访问权限(AJMason),另一个具有管理权限(VMcGlynn)。无论怎样,这两个用户名都不存在于SQL Server中(毕竟没有在SQL Server中输入它们,它们似乎也没有因为某种魔力而出现)。那么,何以一个能成功登录而另一个会失败呢?
Windows安全模式确保了两个ID都是有效的。如果ID或密码不正确,根本就不能登录到Windows。因此,当试图连接到SQL Server时,唯一进行的检查是:用户是通过操作系统的组成员资格访问SQL Server的?还是通过特定的登录用户账户访问的?正如图1-17所示,AJMason和VMcGlynn都不存在于SQL Server中。
图1-17  SQL Server的对象资源管理器
但是,在SQL Server的对象资源管理器中,可以看到一个名为BUILTIN\Administrators的Windows组。这意味着任何属于Administrators组的用户名都能够登录到SQL Server上。 从而避免了将用户设置为他们自己的计算机上的管理员(如果可能的话)。
在生产环境中,如果允许用户成为管理员,则将该组从系统中移除或许是可取的。由于VMcGlynn是Administrators组的成员,因而该用户名也是BUILTIN\Administrators组的成员。
2.混合模式
如果将SQL Server安装为混合模式,意味着既可以使用Windows身份验证(如前面所述),也可以使用SQL Server身份验证。
混合模式与Windows身份验证模式有何不同?首先,需要提供用于连接的用户ID和密码,而非Windows登录账户的ID;其次,并不认定提供的ID都是有效的。当工作中用到ISP时,混合模式在许多情况下都是适宜的。为阐明这一观点,假设用户要在本地客户端机器上使用远程数据进行工作,那么远程的机器需要知道登录凭据,因而使用SQL Server身份验证将是最简单的方法。
关于混合模式,还有一点要说明。出于某些原因(例如为了审核),可能希望用户使用不同于其Windows账户的用户名登录SQL Server。假定正在进行一个很大的SQL Server开发工程,当有需要时,开发人员将加入或离开团队。在这种情况下,可能必须创建临时的用户名,而不是链接到开发者的Windows用户名的永久ID。在SQL Server中,可以创建Developer1、Developer2等用户名,这些用户名在SQL Server中可以有不同的访问权限。另一种情形是:在基于因特网的应用案例中,绝不可能为站点的所有访问者一一创建用户名。因此,可以创建一个通用的登录ID,该ID是为网站特定创建的。无论原因是什么,总之,有时需要SQL Server用户名不与Windows用户名相关联。
当在第4章谈论安全性时,将学习到如何向SQL Server中添加用户名(而不是添加Windows用户)。
关于安全性,还有一点需要讨论,这就是:sa登录
1.7.3  sa登录
sa登录是默认的登录,对SQL Server有完全的管理权限。如果启用SQL Server身份验证模式的安装,在安装过程中将强制为该账户设置密码,因为sa是功能十分强大的登录,它存在于所有的SQL Server安装中。当用sa登录到SQL Server时,将能够完全控制SQL Server的任何一个特性。无论安装采用何种身份验证模式,SQL Server中都将加入这一ID。如果有一个Windows账户定义为sa,例如Steve Austin定义为sa,当服务器设置为采用Windows身份验证模式,对该用户没有任何干预时,该用户就可以登录SQL Server。所以应该尽量避免名为sa的登录ID。
在混合模式安装中,sa将是一个有效的用户名,并经证实如是。可以想像,如果其他用户获得了这一用户名和密码,他便具有完全访问的能力,可以查看、修改或删除任何数据项。最坏的情况下,该用户可能毁坏所有的数据库,并毁掉SQL Server本身。该用户甚至可以设置任务,通过邮件向远程计算机发送数据。
如果在“身份验证模式”界面选择了混合模式身份验证,则必须为sa账户设置强密码。在这一点上,SQL Server 2005有了很大的改进,它强制要求为账户设置密码,尽管设置的密码可能是极易被猜出的。例如,不要使用类似password或adminpwd的密码。不仅要始终保证密码安全,而且要在安全的地方记下密码。否则,如果忘记了sa的密码,而sa是当前存在的唯一的管理ID,那么只有重装SQL Server。妥当的密码应该是混合了数字和字母的,但不要总包含可以转化成数字的字母或者可以转化成字母的数字。例如,pa55word是很容易由password来猜出的,4pr355则类似Apress。
不用sa用户名登录的原因还有一个。有时,必须要了解是谁在SQL Server数据库上运行特定的查询。例如,在生产数据库中,某人可能正在进行数据更新,进而填满了磁盘空间或者填满了事务日志。这时,需要联系那个人以核实是否能终止进程。如果此人是以sa登录的,则将无从知道他是谁。但是,如果此人是以一个可确认的名字登录,那么将会在SQL Server中有其ID,从而就可以进行追踪。通过限制sa登录,人们不得不使用他们自己的账户,这样就能确保更高级别的系统监控和完整性。
有时需要使用混合模式身份验证,这是一种完全可以接受的需求。例如,由于很多应用程序可能运行在一台Web服务器上,因此因特网提供商使用混合模式。如果ISP是转售商(换句话说,世界各地的许多人都使用同一台计算机),谁也不会希望同样使用该计算机的其他用户能看到自己的数据。可是已经决定了不以sa身份登录,那么该怎么做呢?可以这样,创建一个具有用户需要的访问权力的登录ID,也就是说,该ID具有刚好能够看到数据并用所需要的数据进行工作的能力,不多也不少。ISP可能要求提供用户ID和密码,以便在其SQL Server实例上创建账户。第4章中将遇到更多这方面的内容。
注解    无论身份验证模式是什么,始终使用强密码是十分重要的。
1.8  小结
至此,读者应该了解了各种版本SQL Server之间的细微差别,同时还应该知道怎样检查计算机是否适合安装SQL Server。
在前面所讲述步骤的指引下,读者应该已经在计算机上成功安装了SQL Server。甚至可能已经完成了两次安装,从而既安装了一个开发服务器又安装了一个测试服务器。这是个好主意,如果到目前为止只有一个安装的话,可以考虑安装另一个。无论在大型公司工作,还是在人数极少的小公司工作,保持生产代码和开发代码的分离将极大简化复杂性(如果在开发时,需要为生产做准备的话)。
本章介绍了SQL Server中的安全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。虽然目前可能还没有什么数据,但需要确保一旦有了数据,只有合适的人才能够查看到数据。
现在,已经做好了系统学习SQL Server 2005的准备。管理SQL Server最好的方法之一是使用SQL Server工作台(SQL Server Workbench),接下来将讨论这方面的话题。
2.1 SSMS概览 
在机器上成功安装SQL Server 2005之后,就可以开始系统地研究SQL Server 2005的各个部分了,这些部分使该产品具有易用性和高效性。SQL Server 2005将所有的管理界面都归总到studio中,如SSMS(主要包含用于开发数据库解决方案的工具)以及SQL Server Business Intelligent Development Studio(为使用Analysis Service分析数据而设计)。本章集中讲述SSMS(SQL Server Management Studio)工具,此外还会讲述SAC(Surface Area Configuration)工具。
SSMS是用来建立数据库解决方案的GUI(图形用户界面)。这是一种易于使用且直观的工具,通过使用它能快速而高效地在SQL Server中进行工作。
SSMS对于你成功地成为一名开发者至关重要。因此,到本章末,你将了解关于SSMS的使用技能,并将精通如下几个方面的知识:
q  SSMS的组件。
q  如何配置SSMS。
q  如何保护SQL Server的外围应用,使其免受攻击。
接下来,开始讲述SSMS,先来看看如何用它在SQL Server中进行工作。
2.1  SSMS概览
SQL Server是作为单独的Windows进程在基于Windows的计算机上运行的(在第1章已涉及这方面的内容),它可以运行在独立的桌面计算机上,也可以运行在服务器或者网络计算机上。打开“任务管理器”并切换到“进程”选项卡,可看到许多进程,其中有sqlservr.exe。该进程(或服务)在它自己的进程空间中运行,与机器上的其他进程相隔离。SQL Server不应受任何不与其组件通信的其他软件影响。如果必须关闭其他组件的进程,SQL Server引擎仍将继续运行。
SQL Server作为服务运行,该服务由Windows自身进行监控。Windows确保给了服务恰当的内存、处理能力和处理时间,保证所有一切都运作良好。因为SQL Server是作为服务运行的,所以它没有供用户使用、与用户进行交互的界面。因此,至少要有一个单独的工具,能够将用户的命令和函数传递到SQL Server,进而再传到底层数据库。完成这一使命的GUI工具就是SSMS。
SSMS能够在一个应用程序中进行多个SQL Server安装中的开发和工作。这些SQL Server可以安装在一台计算机上,也可以安装在通过局域网(LAN)、广域网(WAN)甚至是因特网(Internet)连接起来的多台计算机上。因此,从SSMS的一个实例来处理SQL Server的开发、系统测试、用户测试和生产实例是有可能的。SSMS在开发数据库解决方案中提供帮助,包括创建和修改数据库组件、修改数据库本身以及处理安全问题。了解这一工具对于成功地成为一名专业的SQL Server开发者以及数据库管理者至关重要。
在完成任务时,要用到的SSMS中的工具之一是查询编辑器(query editor)。该工具可用于编写和执行程序代码。代码可以是对象,也可以是用来操作数据的命令,甚至可以是完整的任务(如备份数据)。这里的程序代码称为Transact SQL(T-SQL)。T-SQL其实是微软专有的语言,尽管它与美国国家标准化组织(ANSI)发布的标准有紧密的联系。微软的编程代码目前所基于的规范是ANSI-92。
查询编辑器是SSMS中的一个工具,它通过编程方式创建动作,达到与拖放或使用向导一样的效果。相对而言,在查询编辑器中使用T-SQL将让开发者在特定命令的特定方面获得更多的控制。注意,查询编辑器得名于这样一个事实——它用T-SQL向数据库发送查询(query)。若对此不甚了解,也无需多虑,后面很快就会明白的。
下面,将花点时间来更详细地看看SSMS。
练习:漫游SSMS
(1) 依次选择“开始”→“所有程序”→Microsoft SQL Server 2005→SQL Server Management Studio,启动SSMS。
(2) 单击“选项”按钮,打开与图2-1类似的“连接到服务器”对话框。在对话框中注意如下几点:
q  为了练习本书中的例子,将“服务器类型”保持为“数据库引擎”。
q  第二个组合框包含“连接到服务器”对话框所能找到的(或知道的)SQL Server安装的列表。图2-1所示的对话框显示的是本地安装所在的计算机名。打开“服务器名称”组合框,将能够搜索更多本地的或网络上的服务器。
q  最后一个组合框指明要使用的连接类型。第1章用Windows身份验证模式安装了SQL Server,因此,这是连接本地服务器唯一可用的选项。
(3) 单击“选项”按钮,切换到“连接属性”选项卡。在这里,将看到连接的特定属性,如图2-2所示:
图2-1  SSMS的“连接到服务器”对话框
(没有展开选项)
图2-2  SSMS的“连接属性”
q  要看的第一个区域是“连接到数据库”组合框,它基于“登录”选项卡中服务器和登录的细节,提供一个数据库列表。单击组合框的下拉按钮,查看并选择要连接的服务器上的数据库。只有Windows账户或SQL Server登录名能够连接的数据库才会出现在列表中。另外,登录细节的任何问题将导致此处显示错误消息而不能列出数据库。
q  “网络”区域详细说明了将怎样与SQL Server建立连接。此时,无需更改当前设置。
q  第三个区域(“连接”区域)处理连接超时。第一项是“连接超时值”,定义在返回错误之前等待建立连接的时间。对于本地安装以及大多数的网络安装而言,设置为15秒已是绰绰有余了。唯一需要增加该设置值的情况是,连接是通过WAN建立的或者是连接到ISP的SQL Server上。第二个选项是“执行超时值”,它定义了在T-SQL代码执行完成前等待的时间。
设置为0秒意味着无超时。对于这里的设置,很少需要更改。
(4) 一旦对于“连接属性”选项卡中的所有设置都感到满意,就单击“连接”,这样将连接到SSMS上。如果读者曾经使用过Visual Studio .NET,会发现SSMS有十分相似的布局。这是微软有意而为之的,为了使SQL Server成为与.NET更为融合的工具。你的SSMS布局应该与图2-3中的类似,除了名字有细微差别,这基于所连接的服务器以及所使用的连接。图2-3显示使用Windows账户XP-PRO\rdewson连接到服务器XP-PRO SQL Server的情况。
图2-3  SSMS
(5) 首个SSMS区域是“已注册的服务器”资源管理器。通过选择菜单“视图”→“已注册的服务器”或者按下快捷键Ctrl+Alt+G,可以访问到该资源管理器,如图2-4所示。该资源管理器详细显示了所有已注册到当前SSMS的SQL Server服务器。目前,只有刚刚注册的服务器。该资源管理器也将显示注册到其他服务(如Reporting Services,该服务将在第14章详细讲述)的服务器。
(6) 如果需要注册另一个服务器,右键单击“数据库引擎”节点,选择“新建”→“服务器注册”,此时将打开一个对话框,该对话框与前面看到的“连接到服务器”对话框非常相似。接下来,将了解如图2-5所示的“新建服务器注册”对话框。
图2-4  已注册的服务器列表
图2-5  “新建服务器注册”对话框
(7) 可以看出,“新建服务器注册”对话框与“连接到服务器”对话框真正的不同在于:前者的“服务器名称”组合框是空的,并且多了一个新的区域,叫做“已注册的服务器”。在这个新区域中,可以给注册重命名,例如Development Server或者User Testing Region,随后再给该注册一个说明。现在没有服务器要注册,因此单击“取消”。
(8) 转回到“已注册的服务器”下方的SSMS“对象资源管理器”窗口,当第一次打开SSMS时,该窗口应该已存在于此。如果看不见该窗口,可以选择菜单“视图”→“对象资源管理器”或按下F8键来重新显示该窗口。由于对象资源管理器详细列出了所有的对象、所有的安全条目以及关于SQL Server的许多其他方面,因此很可能会被频繁地使用。SSMS利用节点(可通过单击加号+展开)来使对象资源管理器的布局(层次结构)简洁,在需要时才显示。接下来讨论图2-6中所示的各个节点。
图2-6  对象资源管理器节点
q  数据库:包含连接到的SQL Server中的系统数据库和用户数据库。
q  安全性:显示能连接到SQL Server上的SQL Server登录名列表。相关内容将在第4章详细讲述。
q  服务器对象:详细显示对象(如备份设备),并提供链接服务器列表。通过链接服务器把服务器与另一个远程服务器相连。
q  复制:显示有关数据复制的细节,数据从当前服务器的数据库复制到另一个数据库或另一台服务器上的数据库,或者相反。
q  管理:详细显示维护计划(第7章会介绍更多),并提供信息消息和错误消息日志,这些日志对于SQL Server的故障排除将非常有用。
q  Notification Services:通过电子邮件或短消息服务(SMS)等通信媒介,将数据或对象改变的通知发送到“外部世界”。人们可以订阅这些通知。该节点中包含这些处理的详细信息。
q  SQL Server代理:在特定时间建立和运行SQL Server中的任务,并把成功或失败的详细情况发送给SQL Server中定义的操作员、寻呼机或电子邮件。SQL Server代理处理作业的运行以及成功或失败通知,该节点中包含了相关的细节。
(9) 在对象资源管理器中选中最上面的节点,将看到与图2-7类似的摘要页。摘要页所在的区域称为文档窗口(document area)。并非只能在最高节点才能看到摘要页,对象资源管理器中的所有节点都有其摘要。这有点类似于Windows资源管理器,可以在各项之间导航,获取节点中对象详情的摘要。
图2-7  摘要页
(10) 现在来看SSMS的菜单栏,首先要注意的是“视图”菜单。如图2-8所示,“视图”菜单的前三个选项分别打开了两个资源管理器窗口(对象资源管理器窗口和已注册的服务器资源管理器窗口)以及前面讲过的摘要页。有时,为了获得更多的屏幕空间,不得不关掉这些组件窗口,这时就可以通过这个菜单或者已定义的快捷键重新打开这些组件。“视图”菜单的其他选项如下:
q  模板资源管理器:提供可使用的代码模板。在本书的例子中,将用T-SQL来创建对象,通过使用包含基本代码的代码模板,而不是完全从零开始创建对象。
q  解决方案资源管理器:显示解决方案。解决方案是对象、T-SQL或称为存储过程的特殊程序在其他项之间的便利的分组。
q  属性窗口:显示每个对象的属性。
q  书签窗口:允许创建书签,将书签放置于代码中的不同位置,就可以快速跳转到这些位置。
q  工具箱:存放数据库维护计划对象列表,也可以在这里更改这些计划。
q  Web浏览器:在SQL Server中打开Web浏览器。若在解决SQL Server问题时,需要从网上寻找相关的信息,这将十分方便。
q  其他窗口:当从查询编辑器中运行T-SQL时,允许访问产生的其他窗口,这些窗口可能包含错误消息或查询结果。
q  工具栏:打开用于查询编辑器、数据库关系图以及集成Visual SourceSafe的源代码管理的工具栏(如果它们默认没被打开的话)。
q  全屏显示:移除标题栏和资源管理器窗口,然后最大化SSMS以尽可能多地显示主要的页面。
(11) SQL Server有两个内置的工具,在启动后还能包含其他工具。这些可以通过“工具”菜单(如图2-9所示)得到。同时,通过“工具”菜单还能自定义键盘命令、显示或隐藏工具栏按钮等,这与微软的其他产品(如Word)类似。特别地,要注意如下的菜单项:
q  SQL Server Profiler:有时,需要监视SQL Server的状态。该工具被告知要核查的事件,当事件在SQL Server中发生时,监视并记录事件、运行代码等。
q  数据库引擎优化顾问:该工具能够在解决方案中使用并处理数据的工作负荷。数据库引擎优化顾问能提出优化建议,以提高处理性能。
q  选项:通过该菜单项,可以访问不同选项,来根据需要配置SSMS的设置。各个选项将在下一节中进行讲述。
图2-8  “视图”菜单项
图2-9  “工具”菜单项
(12) 关于SSMS,要看的最后一部分是标准SSMS工具栏,如图2-10所示。尽管一些图标(如“保存选定项”图标)一眼就能辨识,但为了更好地理解所有这些图标的含义,下面将一一讲述这些图标。
图2-10  标准工具栏
(13) 在下一部分,将了解如何才能书写添加对象、操作数据等的代码。单击“新建查询”按钮,可以使用已经与SQL Server建立的连接,打开一个新的查询窗口。
(14) 与“新建查询”按钮类似,单击“新建数据库引擎查询”按钮也将产生一个新的查询窗口。不过,这种方式允许通过另外一个到SQL Server的连接运行代码。当需要使用另外的连接测试代码以确保通过那个连接不能看到被保护的数据(如工资)时,这种“新建数据库引擎查询”将是不错的方式。
(15) 对于称为Analysis Services数据库的专用数据库中的数据,可以进行查询,并分析数据中所包含的信息。通过下图所示的三个“新建Analysis Services查询”按钮,可以创建不同的analysis查询。由于Analysis Services数据库已超出了本书的讲述范围,所以这里只稍作提及,仅供参考。
(16) SQL Server还包含称为SQL Server Mobile的版本,这种版本的SQL Server可以在PDA等设备上运行。如果安装了SQL Server Mobile版,则可以通过单击“SQL Server Mobile查询”按钮来运行SQL Server Mobile查询。同样,本书不会就这种特殊的功能作进一步的讲述。
(17) 与所有基于Windows的产品一样,我们也可以打开和保存文件。通过“打开文件”按钮(下图中的第一个按钮)可以查找T-SQL文件。接下来的两个按钮,其功能会随着当前情况而有所变化,但大致来说,“保存选定项”按钮用来保存SSMS主文档区域中活动窗口的详细内容,“全部保存”按钮用来保存文档窗口中所有打开的选项卡。
(18) 最后一组按钮用于打开前面讲述的资源管理器以及选项卡。下图中的按钮,从左到右分别用来访问已注册的服务器资源管理器、摘要页、对象资源管理器、模板资源管理器和属性窗口。
至此,已经了解了SSMS的主要区域,接下来将更进一步讲述“工具”菜单的“选项”菜单项,因为确有必要对此作详细讨论。
2.2  SSMS的选项
前面讲过,“工具”菜单有一个“选项”菜单项,通过该菜单项,可以配置SSMS的部分设置。除了目前不关心的有关Analysis Services的选项,下面将一一讲述其他每一个节点和选项。
2.2.1  “环境”节点
首先,来看“环境”节点,这其中的选项涉及SSMS的环境和外观。该节点包含“常规”、“字体和颜色”、“键盘”以及“帮助”节点,如下所述。
1.“常规”节点
如图2-11所示,“常规”节点包含如下选项:
q  启动时:设置SSMS启动时的操作。这里有四个选项:在启动时提示输入连接信息,然后“打开对象资源管理器”;在启动时提示输入连接信息,然后“打开新查询窗口”;启动时提示输入连接信息,然后利用该连接“打开对象资源管理器和新查询”;启动时“打开空环境”,即不打开查询编辑器窗口,也不将对象资源管理器连接到服务器上。
q  在对象资源管理器中隐藏系统对象:隐藏SQL Server中的系统对象。对于非数据库管理员来说,激活该选项是有益的。
q  环境布局:环境布局可以是“选项卡式文档”(有点儿类似Excel),或者是“MDI环境”(有点儿类似Word)。
q  停靠工具窗口行为——“关闭”按钮只影响活动选项卡:若选中此复选框,当单击“关闭”按钮时,只关闭当前活动的窗口。未选中时,所有的窗口都将被关闭。
q  停靠工具窗口行为——“自动隐藏”按钮只影响活动选项卡:可以保持工具箱打开或者通过“自动隐藏”按钮来隐藏窗口。当选中此处的选项时,“自动隐藏”只影响当前活动的窗口。
q  显示N个文件(在最近使用的列表中):定义“文件”菜单显示的最近使用文件的数量。
图2-11  “环境”节点的“常规”选项
2.“字体和颜色”节点
可以想见,“字体和颜色”选项将影响SSMS不同用户界面元素的字体和颜色,如图2-12所示。“显示项”列表框列出了所有可设置字体和颜色的不同用户界面元素。从列表中选择某项后,就可以为其定义前景色、背景色、字体和大小。
图2-12  “环境”节点的“字体和颜色”选项
3.“键盘”节点
如图2-13所示,在“键盘”节点部分,可以为经常使用的命令定义快捷键。可以为任何T-SQL存储过程定义快捷键。本书中的例子假定使用“标准”键盘方案。
注解    存储过程是存储在SQL Server中的代码集合,有点儿类似于程序。
图2-13  “环境”节点的“键盘”选项
4.“帮助”节点
SQL Server的整个帮助系统比以前有所改变。现在,不仅可以使用安装在本机上的帮助,也可以使用联机帮助,从而能访问到最新的信息。如图2-14所示,可以通过“帮助”节点选项配置帮助系统。
图2-14 “环境”节点的“帮助”选项
2.2.2  “源代码管理”节点
当创建代码或对象时,可以在SQL Server中集成源代码管理系统,从而使改动能立即存储起来以保证安全。对于每一个源代码管理系统,可以定义插件,随后插件将出现在下拉列表框中,如图2-15所示。然后,就可以随同源代码管理按钮和菜单选项一起使用源代码管理。
图2-15  “源代码管理”选项
2.2.3 “文本编辑器”节点
“文本编辑器”节点包含的选项将影响如何用文本进行工作。
1.文件扩展名
微软特定产品的文件有其自身特有的文件扩展名,这样用户就能立即识别它们,并把它们与相关的产品联系起来。当从“文件”菜单的“打开”命令访问它们时,由于这些产品经过了过滤,因此只能看到具有相应扩展名的文件。在SQL Server中也是如此,但是可以在“文件扩展名”选项中改变这些扩展名(如图2-16所示),不过,强烈建议不要这样做。在本书中将遇到少许更改扩展名的例子,但是大部分情况是用于较高级的工作。
图2-16  “文本编辑器”→“文件扩展名”默认值
2.所有语言→常规
来看“文本编辑器”节点的第四个选项,将会发现可以怎样设置文本编辑器的选项。如图2-17所示,“所有语言”节点设置位于其上的“XML”节点和“纯文本”节点的选项。下面所讨论的常规选项中,前三个选项是用于XML编辑器的:
q  自动列出成员:在键入内容时,列出可用的成员、属性和值。
q  隐藏高级成员:显示经常使用的项。
q  参数信息:显示当前过程的参数。
q  启用虚空格:在使用文本编辑器时,加入空格使得注释位于固定的位置。
q  自动换行:指定当输入超出了可见区域时,文本将自动显示在下一行。
q  显示可视的自动换行标志符号:选中“自动换行”将启用该选项。在长行换行处,显示返回箭头指示符。这种逻辑字符并非真实存在,因此不会出现在任何打印输出中。
q  没有选定内容时对空行应用剪切或复制命令:如果选中此复选框,“复制”空白行时,将粘贴一个空白行。如果没有选中此复选框,则没有任何内容插入。
q  行号:仅对代码显示行号。当发生错误并返回报告时,由于错误消息会提及行号,因此显示行号将很有帮助。
q  启用单击URL定位:当用数据进行工作并显示了一个URL时,光标在该URL上方移动将会变成手形,表明这是一个URL,单击它将打开浏览器。
q  导航栏:在代码编辑器的顶端显示导航栏。
图2-17  “文本编辑器”→“所有语言”→“常规”选项
3.所有语言→制表符
“制表符”节点针对编辑器里的制表符作设置。如图2-18所示,该选项页面只有两个区域:
q  缩进:前两个选项适用于纯文本和XML。当按回车键时,此处的设置决定了新行是起始于最左端(“无”),还是与上一行的缩进距离相同(“块”)。“智能”选项只适用于XML,该选项根据XML元素的上下文决定是否要缩进。
q  制表符:(通过“制表符大小”)设置物理制表符之间的字符数,(通过“缩进大小”)设置自动缩进的字符数。如果要在按Tab键或进行缩进时插入空格字符,单击“插入空格”选项;否则将使用制表符。
图2-18  “文本编辑器”→“所有语言”→“制表符”选项
2.2.4  “查询执行”节点
“查询执行”节点包含影响T-SQL代码的选项。通过这些选项,可以改变书写T-SQL的环境,以及运行T-SQL时SSMS如何与SQL Server交互。
1.SQL Server→常规
如图2-19所示,当在查询编辑器中运行T-SQL代码时,有许多选项将影响运行。这里的设置只针对SSMS,不会应用到其他连接上(如 .NET程序到数据的连接)。
q  SET ROWCOUNT:定义在停止前返回的最大行数。设置为0意味着要返回所有的行。该选项更常定义在T-SQL代码的顶端,以减少该查询返回的行数——例如,有一个很大的表,而只需要看到其中几行时。
q  SET TEXTSIZE:设置可以在结果中看到的数据的最大长度。
q  执行超时值:指定在强迫查询结束前,允许查询运行的最长时间。在生产环境中,当不希望查询占用大量的处理时间时,这个选项尤为有用。
q  批处理分隔符:用来分隔代码的词或字符。目前的批处理分隔符是GO。尽管可以改变批处理分隔符,但最好不要做改动,因为GO是众所周知的批处理分隔符。
q  默认情况下,在SQLCMD模式下打开新查询:选中此复选框,将打开命令提示符工具,创建基于SQLCMD代码(而非T-SQL代码)的查询。这将允许创建内含扩展的代码,该代码可以通过SQLCMD实用工具作为批文件运行。本书中不会涉及SQLCMD,但是,如果想以批文件的方式运行代码,可以参阅联机丛书。
图2-19 “查询执行”→“SQL Server”→“常规”选项
2.SQL Server→高级
这一部分的设置针对SQL Server如何在SSMS中执行T-SQL代码,可设置的选项如图2-20所示。对于那些与创建数据库时的SQL Server学习有关的选项,将在第3章讲述。第3章中没有涉及但应该了解的选项只有如下两个:
q  取消提供程序消息标头:正在运行的查询的状态消息中,不显示数据提供程序。因此,选中此选项将不显示SQL Server的数据提供程序( .NET SqlClient数据提供程序)的消息。
q  执行查询后断开连接:查询完成后,将断开与SQL Server的连接。当连接数目有限或者要降低连接数时,这一选项是不错的选择。
图2-20  “查询执行”→“SQL Server”→“高级”选项
3.SQL Server→ANSI
与上一部分的选项一样,关于ANSI的选项也将在第3章中讨论。目前,只注意一下图2-21所示的默认设置即可。
图2-21  “查询执行”→“SQL Server”→“ANSI”选项
2.2.5  “查询结果”节点
运行T-SQL代码时,数据库将把结果返回给SSMS。在“查询结果”节点可以更改结果的显示方式。
1.SQL Server→常规
如图2-22所示,这里的选项详细说明了如何显示结果以及在何处保存查询结果。
q  显示结果的默认方式:该选项定义了返回数据的查询结果的显示方式。
q  保存查询结果的默认位置:该选项定义了用于保存查询结果的默认目录。
q  当查询批处理完成时发出Windows默认提示音:如果希望在查询结束时发出提示音,则选中此选项,然而,当运行大量查询时,过多的提示音会令人生厌。因此,除非要运行的查询需要花费较长的时间,选中此选项能够在查询完成时发出提示音作为通知,否则,不选中此选项。
图2-22 “查询结果”→“SQL Server”→“常规”选项
2.SQL Server→以网格显示结果
当运行T-SQL检索数据时,SSMS能将数据置于网格中显示(有点类似Excel中的数据,但这里的数据是只读的),也能以文本的形式显示(类似Notepad中的显示方式,同样,这里的数据是只读的),也可以基于“以文本格式显示结果”选项的设置,把数据保存到文件中。如图2-23所示,“以网格显示结果”选项涉及输出到网格时结果的外观。
q  在结果集中包括查询:将用于运行查询的T-SQL显示在结果的前面。
q  在复制或保存结果时包括列标题:如果需要从结果中复制信息(例如,要把数据放在电子邮件里),选中此复选框将既复制数据又复制列标题。
q  执行后放弃结果:查询执行时,显示的任何结果都将被立即放弃,因此,无可显示。
q  在单独的选项卡显示结果:选中该选项时,结果将不在查询的底部显示,而是在单独的选项卡中显示,这样可以给较大的结果集以更多的显示空间。
q  检索的最多字符数:指定结果中每个单元显示的最大数据量。
图2-23  以网格显示结果时的“查询结果”选项
3.SQL Server→以文本格式显示结果
另一种结果显示方式选项如图2-24所示,这里的设置将影响到结果如何以文本格式显示。
q  输出格式:此处的下拉列表框提供了5种不同的格式选项:列对齐、逗号分隔、制表符分隔、空格分隔和自定义分隔符。通过这些不同的格式选项,可以根据需要设置输出的分隔符,从而能够将数据导入到其他系统中。
q  在结果集中包括列标题:如果只需要得到结果,则清除此复选框。当要将数据传递到其他系统中时,该选项十分理想。
q  在结果集中包括查询:选中此复选框时,将把用于运行查询的T-SQL置于结果之前。
q  接收到结果时滚动:若选中此复选框,在返回记录时,如果记录超出了页面的最底端,将滚动结果集使最后一行的数据得以显示。
q  右对齐数值:所有数值右对齐(而非左对齐)。
q  在执行查询后放弃结果:查询执行时,显示的任何结果都将被立即放弃,因此,无可显示。
q  在单独选项卡显示结果:选中该选项时,结果将不在查询的底部显示,而是在单独的选项卡中显示,这样可以给较大的结果集以更多的显示空间。
q  每列显示的最大字符数:指定结果中每个单元显示的最大数据量。
图2-24  以文本格式显示结果时的“查询结果”选项
至此我们介绍完了本书中所关注的选项,下一节将讨论SSMS文档窗口中的查询编辑器。
2.3  查询编辑器
随着对本书学习的深入,既会遇到通过图形界面和对象资源管理器提供的选项来创建对象、操作数据以及执行代码的情形,也会遇到通过书写T-SQL代码来实现的情形。要编写代码,需要有一个形式自由的文本编辑器,可以在其中键入任何需要的文本。SSMS恰好提供了这样的编辑器,该编辑器以选项卡窗口的形式存在于右边的文档窗口中。这就是所说的查询编辑器,可以通过如下方式来找到它:单击标准工具栏的“新建查询”按钮,或者选择菜单“文件”→“新建”→ “数据库引擎查询”。
在前面一节中,讨论了影响查询编辑器的一些选项,例如,怎样输入文本以及怎样显示T-SQL代码的运行结果。就查询编辑器本身而言,并没有大量可讨论之处,因为它在键入需要SQL Server执行的命令和语句方面,的确非常自由。然而,查询编辑器的工具栏倒是很值得在这里讲述。图2-25显示了查询编辑器工具栏。
图2-25  查询编辑器工具栏(SQL编辑器工具栏)
该工具栏的前三个按钮(如下图所示)处理的是到服务器的连接。第一个按钮请求一个到服务器的连接(如果当前尚未建立任何连接的话),第二个按钮断开当前查询编辑器与服务器的连接,第三个按钮允许更改当前使用的连接。
接下来的项是一个下拉列表框,该列表框列出了当前与查询编辑器建立连接的服务器上的所有数据库。如果要在不同的数据库上运行查询,可以在这里选择那个数据库。这里所显示的数据库,就是代码将要在其上执行的数据库(假设已具有相应的权限)。
随后的三个按钮与在查询编辑器中所键入代码的执行有关。标有红色感叹号和“执行”字样的按钮用于执行代码。单击蓝色勾号按钮将对代码进行语法分析,但并不真正运行它。语法分析并不能找到所有可能发生的错误,但可以保证代码在语法上的正确性。最后一个按钮项是个灰色按钮,在执行代码时它将变成红色。如果要向SQL Server发送取消命令,就点击该按钮。查询不一定总能立即取消,这要取决于当前在执行什么以及服务器在本地还是远程。命令的发送将会有延迟,SQL Server将“暂停”接收该命令。
接下来的两个按钮用于分析T-SQL查询以进行优化。本书不会涉及这方面的主题。
在创建查询时,可以使用向导,通过用复选框选择表和列等方式来生成查询,而不必手工输入T-SQL代码。点击下图所示的按钮将启动该向导,该向导称为查询设计器,在第9章将看到其具体的运作。
通过下图所示的按钮可以使用代码模板进行工作。模板包含有基本的命令或操作,其中的选项为其默认值。可以通过点击下图所示的按钮,在打开的对话框中指定每个模板参数的值。
接下来的按钮组用于查询。前两个按钮在输出中加入了代码如何执行的细节以及代码统计信息的详情。第三个按钮以命令提示符的方式运行代码,就好像代码是通过SQLCMD运行一样(SQLCMD是一种命令行实用工具,用于执行SQL批处理)。本书中不对这些方面作进一步的讲述。
下图中的前两个按钮将影响查询结果的显示方式,分别将查询结果以文本格式显示和以网格显示。第三个按钮将查询结果保存到文件。
最后,可以通过单击下图中的第一个按钮来注释掉多行代码,或者单击第二个按钮来取消对代码的注释。第三个和第四个按钮用于减少或增加代码的缩进。所有这些按钮只作用于当前选中的代码行。
以上我们认识了查询编辑器的工具栏,下面把注意力集中到需要了解的安全工具上。
2.4  外围应用配置器工具
本章的这一节将首次接触SQL Server中的安全性。外围应用配置工具(或称SAC)是SQL Server 2005的新功能,单看名字,可能会以为SAC是用于配置要把SSMS的什么部件显示在屏幕上或者怎样显示的工具,事实却并非如此。该工具是用于减少SQL Server的服务数或组件数的一种方法,以帮助保护SQL Server,避免出现安全缺口。为达到这个目的,也可改变SQL Server的运行方式。
该工具有许多可以配置的区域,但这里只讲述这些服务中的4个,通过这里的学习,当需要对其他服务和组件进行配置时,就具备了良好的基础。
SAC工具里的所有项都可以通过其他工具来处理。例如,SAC工具对于服务所进行的操作,也可以通过“控制面板”→“管理工具”→“服务”来实现。然而,使用外围应用配置工具的好处在于:它把保证SQL Server具有最优安全性所必需的项目集合到一起,在一个地方、提供一个统一的界面进行处理。
练习:使用外围应用配置器工具
(1) 要启动外围应用配置工具,可以通过如下方式:选择“开始”→“所有程序”→“Microsoft SQL Server 2005”→“配置工具”→“SQL Server外围应用配置器”。打开的SAC工具如图2-26所示,在这里,对于要工作的区域可以有两个选择。单击第一个选择,即“服务和连接的外围应用配置器”。
图2-26  SAC工具选择
(2) 接着将显示如图2-27所示的对话框。注意,在该对话框的标题栏有一个localhost后缀,这表明该工具配置的是SQL Server的本地安装。如果要配置一个不同的安装,需要返回图2-26所示的页面,并单击“更改计算机”选项。如图2-27所示,首先要讨论的是“Database Engine”→“服务”。在这里将看到SQL Server数据库引擎是如何在计算机上定义的,它是如何启动的,以及当前的服务状态是怎样的:
q  首先要讨论的是“启动类型”,可以将其设置为“自动”(正如图2-27所示),意味着SQL Server将在机器重启时启动;设为“手动”,意味着当启动服务时,SQL Server才启动;设为“禁用”,意味着禁止启动该服务。
q  “服务状态”框显示了服务的状态(表明服务是否在运行)。可以通过状态框下面的四个按钮,根据需要改变服务的状态。
图2-27  用于配置组件的服务的SAC工具
(3) “远程连接”节点管理客户端连接,图2-28显示了此处的默认设置。安装可能只允许本地连接,这意味着即使将这台独立的计算机转换到网络上,网络上的其他计算机也不能连接到该机器,除非选择了“本地连接和远程连接”单选按钮选项。选中 “仅限本地连接”选项,SQL Server将不能被网络上的其他用户访问到(例如,定义为当前计算机管理员的用户),从而保证了SQL Server的安全。在该页面作好选择后,单击“应用”或“确定”(单击“确定”将返回到图2-26所示页面)。
(4) 回到图2-26所示主页面后,单击“功能的外围应用配置器”。在打开的页面中,首先来看“即席远程查询”,如图2-29所示。可以从SQL Server执行其他没有明确定义的数据源上的即席远程查询,并从函数中返回数据。默认情况下,该选项是禁用的,并且,只应在需要远程查询时才启用。
图2-28  用于配置组件的连接的SAC工具
图2-29  用于即席远程查询的SAC工具
(5) 最后要讲述的是影响专用管理员连接(DAC)的选项,如图2-30所示。有时,由于SQL Server工作状况不佳或者出现问题,不能通过SSMS与其建立连接。该选项将允许与SQL Server建立一种单独的、专用的连接,可以通过该连接行使管理职责,以帮助SQL Server恢复正常。当要从远程计算机建立这种连接时,就在这里启用该选项。无论如何,只有当SQL Server在防火墙的保护之下时,才启用该选项,否则,将导致出现不希望的到服务器的连接。
图2-30  用于DAC的SAC工具
注意    如果有一个网络安装,那么,对于未使用的Analysis Services、Reporting Services等服务,可能要考虑禁用它们。
至此,完成了对外围应用配置工具的讲述。
2.5  小结
SSMS(SQL Server Management Studio)是为了在SQL Server中进行工作而提供的工具。本书中,无论是要使用图形用户界面进行操作,或是要在查询编辑器中编写T-SQL代码,到处都在使用它。由本章的讲述可知,SSMS工具的主要部分是已注册的服务器资源管理器、对象资源管理器以及主文档窗口(包含数据库中对象的图形表述)。
3.1 数据库的定义
现在,已经安装了SQL Server,并了解了作为SQL Server开发人员或管理人员要使用的主要工具,差不多可以开始建立ApressFinacial数据库解决方案了。然而,由于尚不清楚该数据库要包含些什么,因此还是不能着手进行创建。迄今为止,掌握的所有信息是:要建立一个数据库,用于为个人或公司的金融工具保存一些金融业务。由于SQL Server能够轻而易举地从一名用户扩展到数千名用户,故可以根据公司可能使用的金融工具对数据库进行调整。接下来需要收集更多与解决方案需求有关的信息以及什么信息需要存储到数据库中。一旦完成了信息收集,就可以在SQL Server 2005中创建数据库了。
设计数据库解决方案不是一个简单的任务,完成它需要进行大量的工作。本章将引领读者进入数据库设计的辽阔领域。了解了这些信息后,将进一步深入进行设计:调整数据,使检索尽可能地高效,这称为数据规范化(normalizing);并确保数据复制最少,或者更理想的是完全没有数据复制存在。此外,还必须知道日常工作中将怎样使用系统和系统中的数据。最后,需要明白将要建造什么类型的系统——例如,是要接收即时数据更新的系统,还是仅用于分析已定义数据的系统。一旦完成了这些设计,建立数据库解决方案的过程将更为顺利。良好的设计必须确保收集到了创建正确的表格所需要的所有的、没有冗余的信息。
尽管与设计有关的方法和过程可能无法满足所有公司及其方法的要求,本章还是给出相关过程的概述,同时也将显示如何创建信息并确保设计是经过周密思考的。本章包含如下主题:
q  数据库是什么?数据库由什么构成?它存储在何处?
q  如何定义系统的类型,是关系的还是分析的?
q  如何收集当前系统的数据并找出新系统的信息。
q  如何通过SSMS、向导或查询编辑器窗口创建数据库,如何在查询编辑器窗口设置数据库选项。
q  如何查看数据库的细节。
q  如何用SSMS和查询编辑器窗口移除数据库。
注解    在本章的练习中,将不会使用任何明确的、正式的设计技术,毕竟本书并非是专门讲述数据库设计的图书。然而,到达数据库最终设计的过程(物理的和逻辑的)将是相同的。
3.1  数据库的定义
数据库(database)是对象的容器,它不仅可以存储数据,而且能够使数据存储和检索以安全而可靠的方式进行。SQL Server 2005数据库能够包含如下对象(尽管当数据库刚创建时,这些信息中的一部分尚未创建):
q  表定义。
q  表中的列,组成数据行。
q  程序(存储过程或程序集),用于访问或操作数据。
q  索引,用于加速数据检索。
q  视图,查看真实数据的一种特殊的方式。
q  函数,可以应用到数据行的重复性任务。
上述列表中包含了不少专门术语,因此,下面将花些时间来讲述它们的定义:
q  表:表用于存储数据库中的数据。尽管可以使数据库只包含系统表而没有用户表,但数据库至少应该有一个有用的表。系统表是一种特殊的表,SQL Server用系统表来帮助其进行与数据库有关的工作。表包含位于行和列之中的信息,这很像在Excel中那样,但其能力远比Excel中的单元格强大。临时表是另一种类型的数据库表,可以有几种不同的形式。
q  列:列提供每一个单独的信息项的定义,由列定义构成表定义。列很像Excel中的列,由存放数据的单元格组成。与Excel中的列不同的是,在Excel中,列的每个单元格可以存放不同类型的数据,而对于SQL Server表中的列,可以存放的数据取决于准备让它存放的数据类型以及数量。每个表至少要有一个列,虽然该列不必包含任何信息。
q  行:行由单元格组成,每个单元格来自为表定义的每一个列。表可以有任意数目的行,行的数目只受限于磁盘空间,或者说受限于在数据库创建定义中指定的最大磁盘空间,或服务器上的磁盘空间。每一行描述了一条单独的信息,如用户的银行账户详情或电子商务站点的产品信息。行也称为记录。
q  存储过程:当需要一个程序来操作数据或进行与数据有关的工作,或者需要重复地执行相同的数据密集型任务时,把代码存储到存储过程中常常是较理想的选择。存储过程包含一条或多条T-SQL语句,这些语句已经编译并随时可以在需要时执行。存储过程永久存储在数据库中,随时可供使用。
q  T-SQL语句:SQL Server在进行数据方面的工作时,可以使用的程序语句。
q  程序集:程序集是SQL Server 2005中新增内容。它与存储过程类似,可用于操作数据或进行与数据有关的工作,不同的是,使用程序集,更多地是为了程序逻辑(正如在.NET程序中见到的那样)。程序集不仅可以是存储过程的替代物,还能有许多不同的外观,例如,能够使用程序集创建数据类型。
q  索引:索引可以看成是预定义的信息列,它告知数据库数据是如何被物理排序和存储的,SQL Server使用索引(通过把T-SQL查询所提供的信息与列中的数据相匹配)来快速查找数据行。索引由一个或多个(在其上定义该索引的表的)列组成,但索引不能跨多个表来定义。SQL Server中的索引非常类似于书的索引,使用索引,能够比一页页地翻阅更快地找到资料。
q  视图:可以把视图看作是虚拟表。视图能够包含组合自数个表的信息,它能给数据提供更为用户友好的界面。视图还能极大提高应用的安全性,当然,它也确实削减了使用存储过程和直接访问表的功能。也可以为视图创建索引,从而加快视图中数据处理的速度。
q  函数:函数与存储过程相似,只是在处理多行数据时,函数一次只取一行数据或者一次只生成一行数据。例如,若要创建账目,就使用存储过程产生输出;若要一次一个地细查每一笔交易,以计算出每天的利润,则使用函数。
在所有数据库中都有一组系统表,SQL Server使用这些系统表来维护数据库。系统表中存储了所有列的信息、所有用户的信息以及许多其他信息(即元数据)。不同于以往版本的SQL Server,在SQL Server 2005中,系统表的安全性有了改进和增强,系统表不再能直接访问,而只能通过视图访问。由于系统表中的数据不能修改,并且系统表提供的信息只在使用高级功能时才有用,因此,没有必要在这里研究系统表。
3.2  SQL Server中的数据库
当首次安装完SQL Server后,已经有几个数据库安装并显示出来了。本节将一一讲述这些数据库,以便读者了解每一个数据库的功用,这样当在本书之外碰到这些数据库时就不致困扰。
首先讲述SQL Server中最重要的数据库,即master数据库,然后讲述tempdb、model、msdb以及AdventureWorks/AdventureWorksDW数据库。
3.2.1  master
由于master数据库是SQL Server中最重要的数据库,因此在开始讲述它前必须先做警告:
任何对master数据库的直接改动行为,请自行负责!
深入探究该数据库中的任何系统视图,或者直接修改该数据库的记录信息或列信息都是不明智的。可以通过系统函数以有条不紊的方式对这些数据进行建设性的修改,这是唯一应该用来修改master数据库的方法。
master数据库位于SQL Server的核心,如果该数据库被损坏,SQL Server将无法正常工作。master数据库中包含如下重要信息:
q  所有的登录名或用户ID所属的角色。
q  所有的系统配置设置(例如,数据排序信息、安全实现、默认语言)。
q  服务器中的数据库的名称及相关信息。
q  数据库的位置。
q  SQL Server如何初始化。
q  用于存储下列信息的特殊的系统表(下列信息并非详尽无遗):
n   如何使用缓存?
n   哪些字符集可用?
n   可用语言列表。
n   系统错误和警告消息。
n   程序集,一种特殊的SQL Server对象(所有数据库中的处理SQL Server对象的表不为master数据库所专有)。
master数据库是SQL Server安全卫士,它使用上述信息来确保所有的事都在掌控之中。
注解    定期备份master数据库非常重要。确保备份master数据库是备份策略的一部分。关于备份,将在第7章详细讲述。
3.2.2  tempdb
tempdb数据库,正如它的名字所暗示的那样,是一个临时性的数据库,它存在于SQL Server会话期间,一旦SQL Server关闭,tempdb数据库将丢失。当SQL Server重新启动时,将重建全新的、空的tempdb数据库,以供使用。关于该过程,还有更多可讲述的内容,但是,在深入探讨这些之前,还是先来了解tempdb数据库的用途是什么。
众所周知,数据库能够存储数据,而数据可以存储在多个表中,使用命令和函数来检索和操作这些数据。然而,有时可能想把某个数据集临时存储起来,以便稍后进行处理——例如,当要把得自一个存储过程的数据传递给在该存储过程之后运行的另一个存储过程时,一个选择就是把那些数据存储在tempdb数据库中。在存储过程或查询中创建的所有临时表都将被放置在tempdb数据库中。只要tempdb数据库没被更新,一切将称心如意;一旦重建了tempdb数据库,那么存放于其中的数据将丢失,需要重生成数据。
或许,你会认为这并非一个理想的解决方案,毕竟,如果能把临时信息存储在该数据库之外的某处,不是很完美吗?其实,tempdb不是这样用的,关于tempdb,实际上只应把它看作是过渡的存储空间。
重建tempdb的另一个原因是:不仅开发者要使用该数据库,SQL Server自己也要使用tempdb。实际上,SQL Server始终在使用tempdb,当重新初始化SQL Server时,它需要确认原先正在处理的任何临时性工作都已经清除掉。毕竟,很可能是由于临时性工作的问题导致服务的重启。
正像其他数据库一样,tempdb也有大小的限制,必须确保该数据库的大小对于当前的应用以及所有要存储于其中的临时信息是足够的。阅读随后的章节,将看到数据库的大小有最小值和最大值。tempdb也不例外,应该确保该数据库大小可以扩展,这样当需要时就可以增加其大小。
注意    因为tempdb的大小是有限的,所以在使用它时必须当心,不要让tempdb被来自不好的存储过程(对于创建有太多记录的表没有明确限制)的表中的记录所填满。如果发生了这种情况,不仅当前的处理不能继续,整个服务器都可能无法工作,从而将影响到在该服务器上的所有用户。
第一段中提过,关于tempdb的更新过程还有更多可讲述的内容,这将在下一节中进行阐述。
3.2.3  model
创建数据库时(很快就要在本章的学习中创建数据库),总是以一套预定义的标准为模型。例如,若希望所有的数据库都有确定的初始大小,或者都有特定的信息集,那么可以把这些信息放在model数据库中,以model数据库作为其他数据库的模板数据库。如果想要使所有的数据库都有一个特定的表,可以把该表放在model数据库里。
model数据库是tempdb数据库的基础。对model数据库的任何改动都将反映在tempdb数据库中,所以,在决定对model数据库有所改变时,必须预先考虑好并多加些小心。
3.2.4  msdb
msdb给SQL Server代理提供必要的信息来运行作业,因而,它是SQL Server中另一个十分重要的数据库。
SQL Server代理是SQL Server中的一个Windows服务,用以运行任何已创建的计划作业(例如包含备份处理的作业)。作业是SQL Server中定义的自动运行的一系列操作,它不需要任何手工干预来启动。
既然有了tempdb及model数据库,就不应该直接调整msdb数据库,也的确无此必要。许多进程使用msdb。例如,当创建备份或执行还原时,将用msdb来存储有关这些任务的信息。
3.2.5  AdventureWorks/AdventureWorks DW
AdventureWorks和AdventureWorksDW是SQL Server中的示例数据库(如果在安装过程中选择了安装它们的话)。这些数据库基于一个自行车生产公司,以一种简单的、易于理解的方式来展示SQL Server 2005的新功能,如Reporting Services、CLR(公共语言运行时)特性以及许多其他特性。
下一段文字摘录自微软的文档资料,简要地给读者提供了AdventureWords数据库相关背景的概览:
Adventure Works Cycles是AdventureWorks示例数据库所基于的虚构的公司,该公司是一家大型跨国生产公司。公司生产金属和复合材料的自行车,产品销往北美、欧洲和亚洲市场。公司总部位于华盛顿州的伯瑟尔市,有290名雇员,公司还拥有一些遍及其销售市场的地区性销售团队。
尽管示例数据库不是为SQL Server新手准备的,但在学习完SQL Server基础知识后,使用它们也不会有困难。
认识了SQL Server中的数据库以后,终于可以开始创建数据库了!接下来将从决定要创建的数据库的类型入手,数据库的类型取决于数据库的用途。
3.3  决定数据库系统类型
在能够设计数据库之前,必须先确定该系统是联机事务处理(OLTP)系统,还是联机分析处理(OLAP)系统。可以在第一次接触用户之前、或者在第一次接触用户期间找出答案,但对于OLTP或OLAP的选择可能在初次提议中已经指明。
做出决定以前,需要先理解这两个关键的系统类型。
3.3.1  OLTP
OLTP系统提供数据的即时更新。OLTP数据库系统极有可能有一个用.NET语言(如Visual Basic .NET(VB.NET)、C#或ASP.NET)编写的独立用户前端。用户前端调用数据库,并且立即更新用户对底层数据所做的任何改变。
对于OLTP系统,需要进行许多考虑以确保系统快速而可靠,并能保证数据完整性。设计OLTP系统时,至关重要的是:不仅要有正确的数据库结构,还要有正确的物理存放位置。规范化为第三范式(该术语的意思将在本章的后面做详细讲述)的OLTP系统是很常见的,尽管并非每个案例都是如此。通过规范化数据,将有助于达到OLTP系统的其中一个主要目的:使数据更新尽可能地快。在通过移除冗余或重复列来规范化数据时,应确保数据尽可能地简洁。规范化在许多OLTP系统中是极为重要的。
1.备份
许多OLTP系统是一天24小时、一周7天永不停歇地在使用。在这样的系统中,数据改动极为频繁,这就意味着备份数据库是一项必须进行的任务。
尽管可以在SQL Server正在使用时对数据库进行备份,但最好还是在不使用SQL Server时或者只有少量的数据更新活动发生时执行备份。理想的时间段也许是在午夜,或者甚至是中断时期。
当决定执行备份时,至关重要的是:要经常在OLTP系统中监视和检查备份,以确定系统仍然能如希望的那样工作。下面这种情形并不鲜见:那些被认为能够在灾难发生时用于还原的有效的备份,事实上却是损坏的、不完整的或者可能根本没有创建的备份。因此,应该定期从生产中执行备份,并将其重载入安全的开发场所以确保其有效性。
2.索引
速度对于一个成功的OLTP系统十分关键。在OLTP系统中,存在比OLAP系统数量更多的索引,索引不仅有助于使一个表中的数据与另一个表相关联,而且借助索引能够在表中快速访问到数据行。
注解    第6章将讲述如何创建索引、索引如何工作以及如何在解决方案中运用索引。
3.3.2  OLAP
当考虑OLTP系统时,必须紧记对数据库的更新随时可能发生,而且,更新必定是即时反映在数据库中的。此外,另一个要点是:在这样的系统中,许多更新会同时发生,此时并不会对任何数据有所损害。
OLAP系统的设计基于如下前提,即数据保持相对静止、没有频繁发生的更新。这些更新可能发生在每晚、每周、每月或者任何其他时间,只要更新不像在OLTP系统中那样频繁发生即可。正如其名字“联机分析处理”所暗示的那样,在OLAP系统中,大量的处理涉及对现有数据的分析。OLAP系统中的数据只应有极少的更新,或者完全没有更新——表面上看,只有当在分析中发现数据错误时,或者如前面提及的那样,当有更多的数据要用于分析时,才进行更新。数据备份多半只在对数据库有所改动时,作为“最终操作”执行。在OLAP系统中,没有必要定期进行备份。
设计用作OLAP的系统有时不遵循任何设计标准或规范化规则,并且大多数确实只拥有比OLTP系统数量更少的索引。在OLAP系统中往往不存在规范化,因为若不必从规范化的表中提取数据,将更容易获取数据并对数据切片和切块。由于在OLAP系统中只有极少的或者几乎没有更新,因此不必考虑事务的执行及事务的紧凑性。大多数OLAP系统中不存在规范化。在OLAP系统中发现一两个大型的平面表(而不是几个关联在一起的表)是很寻常的,因此,只会有较少的关系,也将只有较少的索引。
注解    OLAP系统也称数据仓库,尽管在整个OLAP系统设计中,数据仓库只是其中的一部分。简言之,数据仓库存放OLAP系统中要使用的数据。
3.3.3  示例系统类型选择
那么,综合考虑上一节中给出的所有信息,不难发现,尽管在示例系统中数据更新相对不频繁(换句话说,只有当发生金融事务或产生账目时才会有更新),但系统中确实存在联机更新,并产生即时效果。因此,本书中的示例系统将是一个OLTP系统。
3.4  收集数据
在创建数据库前,首先应该做的事情之一是,找出数据库系统中必须要保存的信息是什么以及应当怎样保存那些信息(例如,用数字或文本的形式保存、信息的长度等等)。要完成这一任务,需要进行数据收集,数据收集可能涉及:与作为系统所有者的人士进行交谈,以及与要使用系统的用户进行交谈。
对于比较大的系统,可能需要数次会议,每一次的会议针对系统的一部分进行讨论和研究。即便如此,对于每一部分,可能还要花费数次会议反复讨论。此外,还可以安排面谈、分发调查表,或者甚至只是观察所有活动着的现有过程,所做这一切,都是为了尽可能多地收集关于数据库以及将要如何使用数据库的信息。
一个数据库解决方案是否成功,其关键主要不在创建系统,而是在收集信息的过程中、在真正写下第一行代码之前。如果取用了错误的信息,或者遗漏了可能对最终解决方案至关重要的元素,那么此时这个系统已经有了缺陷。使尽可能多的用户介入到早期的阶段,并接着使他们参与到设计进程中,将极大减少错误的发生以及最终产品的部件的遗漏。
对于本书中的示例金融程序,首先想要与之交谈的是将要显示的数据的所有者。这些人是银行中处理支票、现金提取、信用卡交易等业务的工作人员,以及那些处理股票份额买卖、单位信托、人寿保险单等业务的人员。这些人了解要给哪一位客户发送什么文件或账目清单,以及这些账目清单中要包含什么信息。此外,这些人对于客户想要如何核对这些账目清单多半有不错的想法,并且他们清楚什么数据允许下载并插入到SQL Server数据库中。
在第一次会议中,将研究所有的文档,以明确要在当前系统中存储什么信息。会议中会认识到,当前的系统要发送不同的账目清单:一份是客户活期存款账户的账目清单,其余的是客户所拥有的每一种金融产品的独立账目清单。当研究账目清单时,将注重每一种账目清单所包含的信息,需要捕获这些信息以产生类似的账目清单。这可能不仅是与客户相关的信息,也是监管的账目信息。
有了源自手中所有文档资料的信息后,就可以开始讨论什么信息是系统所必需的。显然,在这些会议中将讨论大量的信息,其中一些是有用的,而一些则没有用处。确保讨论是以在场人士提出建议的顺序进行记录的,而不是以“合乎逻辑”的顺序记录的。这样可以模拟会议,在这里,人们将“回忆”起必须满足的项目;在这里,一个观点的提出可能使某人想到其他要点。
从最初的讨论中,记录如下的要点:
(1) 该软件必须能处理多个金融产品。主要的产品是活期存款账户(银行或个人用户用以保存业务详情)。该系统也必须能管理附带产品(如贷款、人寿保险单、汽车保险单),并且,系统还应能记录股市上的所有股票交易情况。
(2) 每月或在客户提出请求的任何时候,产生账目清单。如果客户曾在当月内请求账目清单,仍将产生一份那个月的账目清单。
(3) 每天,在有存款的账户上增加利息,从透支的账户中扣除利息。
(4) 客户可以以系统独立版的形式拥有年度保险费、月保险费或一次收付清保险费的产品。需要知道何时开始收款以及何时停止收款,也需要确定要为哪一个产品发出提醒(例如,一份给客户的通知,告知客户他的汽车保险单需要续约)。
(5) 如果某一项产品的托收失败了,系统必须进行具结,使得下次收款时,能征收到该笔款项。
(6) 每一项产品有自己的账目清单,但只有银行业务账目清单是可以请求产生的。
(7) 由于允许进行股票份额的交易,因此系统必须在任何时间记录和显示客户特有股票的现值。
注意上述列表中的信息完全没有固定的顺序,因为信息往往就是这样显露出来的。还要注意,第(2)点和第(6)点,多少有一些信息上的重复;如果没有认识和理解到这一点,可能将引发问题。
注解    这里对示例数据库只执行了数据收集任务。在这里所收集到的信息应该在稍后的设计阶段与用户进行反复查对,不过这已超出了本书的讲述范围。
3.5  决定要存储在数据库中的信息
现在将使用前一节中记录下的要点,试着找出每一个要点关注的所有领域。通过观察这一系列需要记录信息并把信息存储到数据库中的领域,很明显会发现,需要把它们以某种方式进行排序归类。目前,仍然是以逻辑的视点来观察解决方案,尚不准备开始创建数据库中的任何事物。
首先,浏览列出的这些要点,试着把信息分组到特定的相关领域。因为列出的项目是进行了编号的,所以很容易示范。下面的列表显示了一些最初的分组以及这样分组的原因:
q  金融产品(financial product)
n   (1) 当前处理的产品不止一种。需要记录每一种产品。
n   (2) 将为每一种产品产生账目清单,并将为那些账目清单标明特定的产品信息(例如产品名称)。
n   (4) 需要记录与该产品相关联的保险费类型是什么。
n   (5) 处理金融产品的费用托收。
n   (6) 再次处理账目清单的产生。
q  客户(customer)
n   (2) 客户能够请求账目清单。
n   (3) 需要为客户记录其利息数额。
n   (4) 需要与每个客户相关联的不同产品的列表。
n   (7) 对于每一种股票,要记下其现值。
q  客户地址(customer address)
n   (2) 需要每个客户的地址,以便给他们寄账目清单。
n   (6) 与第(2)点一样,需要客户的地址来寄账目清单。
q  股票(share)
n   (1) 由于要在股市中进行股票交易,因此需要记录股票的信息。
n   (7) 需要记录给定股票的价格。
q  交易(transation)
n   (2) 要产生账目清单,需要有交易列表。
n   (4) 要记录定期的和专门的保险费。
n   (5) 必须记录失败的托收交易。
n   (6) 要为每一种产品产生账目清单。
以上5种不同的分组,能够转化成要创建的数据库中的5个不同的表。相应的逻辑设计过程将基于这5个表。从这时起,可以开始研究应该加入到这些逻辑表中的信息。如果列存在于“不恰当”的表中,并且多个列持有“相似”的信息,或者多个表中存在相同的列,可能会导致数据的重复。
接下来,依次查看下面的小节中列出的要点,研究每个“表”中应该存储什么信息。下面小节中列出的信息来自与用户的讨论,其所给出的一系列列表或许能形成表的基本雏形。每个列都有相应的描述,这样当回去与用户交流时他们将能明白列的用途。在这一阶段,也将添加用来保存所有标识符(用于找寻记录)的列,在接下来的小节中,用(K)来指示这样的列。这些列是潜在的键,详细的内容将在3.7节中讲述。
3.5.1  金融产品
该表是用来存储公司销售的不同产品的。从银行账户到人寿保险,所有的产品都将存储于此。当生成账目清单时,以及当产生交易、用户结余发生改变时(如购买更多的股票),将用到该表。
q  金融产品ID (K):这是唯一标识符。
q  金融产品名称:这是产品的名称,如活期储蓄账户、股票、贷款等。
q  付款的频率:对于那些需要征收钱款的产品(如贷款、定期储蓄账户等),指示其收款的频率。
3.5.2  客户
该表用以保存客户的详细资料,如客户所拥有的产品以及结余。再次重申,一旦对数据进行规范化,当前表中的一些项将不再存在。例如,现在表中存在 “每一个产品的账号” 属性,当进行规范化处理时,将看到这类属性是如何“销声匿迹”的。
q  客户ID (K):每个客户的唯一ID。
q  金融产品结余:每一个产品的当前结余。
q  称谓:客户的称谓(先生、女士等)。
q  名:客户的名字。
q  姓:客户的姓氏。
q  地址:客户的联系地址。
q  每一个产品的账号:客户所拥有的每一个产品的账号。
q  金融产品的详情:客户所拥有的每一个金融产品的详情。
3.5.3  客户地址
该信息将从第三方的地址数据库中获取,因此该表不会存在。
3.5.4  股票
该表存储每一种股票的详细资料,如股票的当前价格和价格历史记录。
q  股票价格ID (K):每一种股票的唯一ID。
q  股票名称:股票的名称。
q  当前价格:股票当前的价格。
q  早前价格:股票早前的价格。
q  价格日期:在当前级别,设置价格的日期。
q  股市行情自动收录机ID:该股票在股市上的ID。
3.5.5  交易
该表为每一个产品存储发生的每一笔金融交易的详细资料。
q  金融交易ID (K):每一笔金融交易的唯一ID。
q  客户ID:在前面的“客户”小节中定义的客户的唯一标识符。
q  交易日期:交易发生的日期。
q  金融产品:指向金融产品表的链接。
q  总额:该笔交易的总额。
q  借/贷:一个标记,用以表明该交易是一笔取款交易还是一笔存款交易
3.5.5  交易
该表为每一个产品存储发生的每一笔金融交易的详细资料。
q  金融交易ID (K):每一笔金融交易的唯一ID。
q  客户ID:在前面的“客户”小节中定义的客户的唯一标识符。
q  交易日期:交易发生的日期。
q  金融产品:指向金融产品表的链接。
q  总额:该笔交易的总额。
q  借/贷:一个标记,用以表明该交易是一笔取款交易还是一笔存款交易
3.7  建立关系
数据库跟人很相似,也可能会喜怒无常,需要得到那么一点温柔的呵护。良好的关系恰能给数据库这样一种悉心的照料。
目前,示例数据库中的表是本质上孤立的、相互之间没有联系的个体。当然,在不同的表中,也有名字相同的列,但没有什么事物把它们连接到一起。于是,就需要进行表之间关系的定义。通过定义表之间的关系把表约束在一起,确保一个表中的改动不会导致另一个表中的数据失效。
3.7.1  使用键
在数据库的表中,键是标识记录的一种方式。因为键涉及的是全部的记录,所以,可以使用键来建立表之间的关系——例如,当要用到不同表中的同名列进行工作时,可以利用这种特性。以键作为一种捷径,能够很容易地在两个表之间建立链接。当唯一地标识表中的记录是数据库设计中的重要部分时,键也能被使用。
当单独一个列足以标识记录时,可以将键定义在单一的列上,否则,将键定义在多个列上。接下来的部分介绍可以在数据库中使用的三种类型的键:主键、外键/引用键以及候选键/备用键。另外,还将介绍一种可以用来替代主键的SQL Server方法,称为约束。
1.主键
主键或许是最重要的键的类型。首要地(也是最重要地),要在其上定义主键的列必须只包含唯一的值。主键不能定义在不返回任何行的列(或列的序列)上。为此,不可能在任何允许NULL值的列上定义主键。关于主键的另一个限制是,一个表只能有一个主键。
可以利用主键把一个表中的数据与另一个表中的数据相关联。例如,在本书的示例数据库中,有两个表:一个表存储客户,另一个表存储客户的银行交易。在客户表的客户ID(每当加入新客户记录时,将产生一个唯一的客户ID)上定义了主键。那么主键将用来关联银行交易表中的多个记录,为客户ID返回其所有的银行交易。这两个表之间的链接是客户ID(正如前面所述,它被定义为客户表的主键)。
稍后,将看到如何把表联接到一起并在它们之间定义关系。联接和关系在本质上指的是同一件事,即:可以在两个(或多个)表之间通过特定的列(或列的集合)定义的逻辑链接。
2.外键/引用键
以一种关系把两个(或多个)表链接到一起,这种情形时有发生。正如上一部分中的例子所示范的那样,在客户表和交易表之间建立链接的是客户ID列。该列在客户表中返回唯一的行,因此定义为主键。然而,在交易表中必须要有相应的外键(或引用键),以链接回客户表的客户ID列。
当要在本书的示例数据库中创建关系时,将看到为何创建外键将在两个列之间创建一种链接(或关系)。这种链接是通过约束创建的,约束是SQL Server使用的一种方法,用来检查建立在关系中的细节。从外键的观点来看,约束(或检查)将确保关系遵循为之设置的条件。在后面 “更多关于外键”一节中,会更深入地探讨外键。
3.候选键/备用键
前面讲过,一个表只能有一个主键。然而,可能会有另外的键也能轻而易举地定义为主键,这样的键是成为主键的候选,称为候选键。
从根本上来说,在候选键和主键的定义之间没有必然的区别。例如,如果有一个表,用来存储通用(GM)汽车的备件,当在总店为各GM分店订购零件时,可能会有一个内部的GM零件号供使用。该零件号将是唯一的,适于用作主键。另一方面,每一个制造厂商也会为其零件创建(对他们而言)唯一的零件号。如果数据库中包含制造厂商标识符,那么由制造厂商赋予的零件号也能用作主键。由于一个表中不能有两个主键,而且已经选择了GM零件号作为主键,从而可以把制造厂商标识符和制造厂商零件号创建为候选键。
4.替代主键的唯一约束
通过定义这种约束,将确保唯一值只能输入到在约束中定义的一个或几个列中。尽管这似乎很像前面讲过的主键定义,但二者是不同的。
唯一约束不是主键,但在唯一约束中定义的一个或几个列也可能成为主键。此外,唯一约束能够包含NULL值,但主键不能。不过,由于NULL被视为与列中任何其他值一样,因此,当准备插入或更新数据时,必须使构成唯一约束的列保持唯一,从而只允许有一个 NULL值。最后,一个表可以有多个唯一约束,但只能有一个主键。
3.7.2  创建关系
在SQL Server数据库中,关系是两个表之间的逻辑链接。虽然,在后面将看到,设计数据库时,会在两个表之间画出一条物理连线,但表之间是不存在物理链接的。表之间有物理链接意味着,链接两个表的真实数据将只在某个中间位置存储一次,而链接两个表的键的信息要存储多于一次,然而事实并非如此。
当定义逻辑关系时,是在告诉SQL Server:将要把来自主表的主键与另一个表的外键链接起来。如此一来,这就需要有两个键,每个表一个。
接下来的部分,将从观察关系如何对引用完整性概念起作用开始,详细地讲述关系,
1.关系和引用完整性
可以用关系来强制数据完整性。换句话说,如果由于数据在某个表中而希望另一个表中也有这样的数据,就可以在这两个表之间放置一种关系,以确保没有任何SQL命令破坏这种规则。不过,不要把引用完整性与维护数据完整性的其他过程(例如,在列上放置检查或默认值以保证某个特定列的值是有效的)混淆了。
引用完整性围绕如下要旨:数据库中,有两个表包含相同的信息,要求两个表中重复的数据元素保持一致性。例如,如果一个表中有一个主键,另一个表中有一个外键,主键和外键的数据是完全匹配的,那么,重要的是要保证这两部分数据要么一起改变,要么根本不发生改变。要强制引用完整性,并非只有关系一种方法,也可以使用触发器来确保数据有效(这将在第13章中进一步讨论)。
举例来说,本书的示例银行系统中包含客户表和交易表。如果某客户在客户表中没有记录,则不能记录该客户的交易。结果,必须使用引用完整性来强制这两个表之间的数据完整性,因此,当某客户的交易记录还存在时,不能从数据库中删除其客户记录。同样,如果某客户没有交易记录存在,则允许移除其客户记录。
强制引用完整性的另一个结果是,如果某个客户引用号在客户表中不存在,则无法输入具有该客户引用号的交易记录。若要在这种情形下输入客户交易记录,必须先在客户表中创建客户记录,然后才能完成交易记录的输入。
最后,当与某客户记录相关的客户交易记录存在时,如果要修改客户记录中的客户引用号,必须先在客户交易记录中作修改,并检查所修改的客户交易记录的引用已经存在,然后才能在客户记录中修改客户引用号。
因此,要想维护数据的完整性,有许多规则要遵循。如果确实希望如此,就使用引用完整性来强制数据的完整性。不过,与此相对的另一种做法是,不使用引用完整性来强制数据完整性,而是通过创建存储过程或触发器(SQL Server中某种类型的程序)来实现这一任务。相关的主题将在第10章和第13章中讲述。
使用存储过程和触发器来维护数据完整性是可行的,但不是令人满意的解决方案,因为这会使系统暴露在不能保持数据完整性的场合(可能由于系统设计中的漏洞,也可能由于开发者没有用正确的处理顺序来确保所有数据总是有效的)。不仅如此,如果有人直接向表中加入数据,引用完整性将会丧失。当然,在应用程序中进行数据完整性检查确实能减少网络流量,因为所有的验证都是在前端进行的。
在讨论数据库关系类型之前,关于引用完整性,还有一个要点需要说明:如果想要通过在两个表之间创建关系来维护引用完整性,这两个表必须在同一个数据库中。在两个数据库间不可能存在引用完整性。
2.关系类型
在数据库中,主要存在如下三种关系类型:
q  一对一关系。
q  一对多关系。
q  多对多关系。
接下来将分别讲述每一种关系类型,这样,当需要创建关系时,就知道应该创建哪一种关系,该在何时创建以及为何要创建。下面先从一对一关系开始讲述,虽然这种关系最不常用,但它可能是最易于理解的一种关系。
3.一对一关系
这种关系在实际运行的数据库中比较罕见。一般来说,没有什么真正的理由来让一个表中的一条记录只与另一个表中的一条记录相匹配。这种情形只会发生在:例如,当要把一个非常大的表拆分成两个单独的表时。
为了说明一对一关系,假设本书的示例银行数据库中有一个为ATM卡存储PIN号码的表,该表与客户记录中的其余部分完全分开(如图3-1所示)。多数情况下,一个客户记录有一个PIN号码记录,不过也可能有例外——如高利息存款账户可能没有ATM卡,因此也就没有相关联的PIN号码记录。
图3-1  一对一关系
4.一对多关系
一对多关系可能是数据库中最常见到的一种关系。这就是一条主记录与子表中0条、1条或多条记录相关联的情形。
以示例银行数据库为例,假设有一条客户主记录以及任意数目的关联交易记录。这些关联交易记录的数量可以从0条(对应于客户是银行新客户的情形,此时尚未进行存款或执行交易)到1条或者多条(对应于账户中已有初始存款的情形,此后该账户又发生了更多的存款或取款交易),如图3-2所示。
图3-2  一对多关系
当在示例数据库解决方案中建立客户对交易关系时,将再次看到这一概念的运用。
5.多对多关系
多对多关系是最后一种能存在于数据库中的关系类型。当主表中0条、1条甚至多条记录与子表中0条、1条或多条记录有关时,多对多关系会较频繁地出现。
多对多关系的一个例子是:某公司从好几个仓库进行发货(视为主表),然后,将货物发送到许多商店(视为子表),如图3-3所示。可以对仓库进行定位和组织,使得不同的仓库都能为同一个商店供货,并且,仓库也能分组(如农产品、冷冻品、易腐败品和保税品)。为了让商店能得到丰富的货物补给,需要有许多不同的仓库对其供货(通常是位于不同地点的仓库)。
图3-3  多对多关系
当在数据库中建立关系时,必须要有外键。在本章的前面曾简要地讲述过外键,下一节将更深入地探讨外键
3.7.3  更多关于外键
外键是子表上的键,定义在该键中的列(一个或一组)能正好与主表中的列在信息和数量上完全匹配。使用外键,能通过关系构建要返回的数据。
此外,外键并非必须映射到主表的主键上。尽管外键映射到主键上十分常见,但是,当主表中被映射的键是唯一键时,也可以在主表与子表之间建立关系。
外键的所有本质在于其映射的过程以及它位于子表上这一事实。仅当创建了从子表到父表的关系以后,外键才得以存在。但是,主表和子表到底是什么?为了说明,回想一下讲述关系时的例子。例如,来看一对多关系。主表将在左边,或者说在关系中的“一”这一边,而子表将在右边,也就是关系中的“多”这一边(如图3-4所示)。
图3-4  外键
关于外键、关系以及主表和子表,还有最后一点需要说明。对于主表和子表而言,完全有可能二者就是同一个表,外键和唯一键也都定义在这同一个表中。这称为自联接或自反关系。这种情形是相当特殊的,因而在数据库中往往并不多见,尽管也可以通过这种关系来确保一个列中的数据与另一个列中的数据完全匹配,就像在任何其他联接中那样。
例如,假设有一个围绕客户的表,其中有两列,一列是父客户ID,保存总公司的ID并用来链接所有的分部。如果把总公司也看作是联合企业的分部,第二个列是具体的分部ID,可以在这两列之间放置一个链接,使得当总公司作为分部时,该链接依然有效(如图3-5所示)。另一个例子是:在所有雇员所在的雇员表中,具有一个从雇员到其经理的自联接。
学习完关系,下面将讨论如何规范化数据库。
图3-5  位于同一表中的外键
3.8  规范化
数据库的规范化是减少表中数据重复的一种技巧。于是,就能建立通过键或索引相互关联的多个表。大量消除重复数据后将得到更小、更紧凑的数据库。这样将减少出现混乱(在存放“相同”数据的列中,哪一列的数据是正确的?哪一列的数据应做修改)的几率,并且,将减少实时更新多列数据的开销。
注解    只是提醒一下,现在仍然还在建立解决方案的逻辑阶段,依然还不准备在SQL Server中创建数据库。
规范化可能会影响数据库以及数据检索的速度,因此数据库设计者不可能无度地规范化。对数据库进行合理而有益的规范化,重复数据的消除将带来更快的数据排序速度,查询也将运行得更快,从而改善性能。尽管通过规范化将产生高效的数据库,但是,也可能会由于创建了太多的关系和太多狭小的表,导致过分规范化数据,以致检索一条信息需要访问许多的表并在这些表之间产生许多联接。高明的设计者知道何时该停止规范化,不会走得太远,例如产生太多的关系。这些知识主要源自经验和实践,但在示例数据库中,读者将学会该在哪里“停止”。
提示    当任何参考表返回一个数据行,没有更多的表查阅检索那条信息,这就是应该停止规范化的信号。
本章的这一节,将以称为逻辑建模的方法对示例数据库建模。建立逻辑模型的目的是显示应用程序为满足商业需求而必须存储的数据。它展示数据如何相互关联,并探究在项目开发领域之外的商业领域中的任何整体需求。在创建逻辑模型时,无需考虑任何特定的计算机环境,因此没有为性能、数据存储等进行优化。
在逻辑模型中,术语实体用于表示表的一种概念形式。鉴于目前仍然在数据库设计的逻辑建模阶段,因此,在讨论中将使用“实体”而不是“表”,因为实体对于实现的依赖较少。同样,在逻辑建模中,把数据列称为属性。为了建造示例数据库的逻辑模型,将汇总本章之前的所有信息,并在实体中实现属性。这样一来,将明白需要如何修改设计。
剩下的问题是:实体中应该包含什么?下面的三个原则决定着实体的内容:
q  每一个实体应该有一个唯一的标识符。
q  只存储与实体直接有关的信息。
q  避免重复值或重复列。
在后面的小节中,将更详细地讲述以上每一个原则。
3.8.1  每一个实体应该有唯一的标识符
在每一个实体中必须能找到唯一的行。可以通过使用唯一标识属性(或几个属性的组合)来实现这一目标。然而,无论使用什么方法,在唯一标识属性(组)中,一定不能有两个行包含相同的信息。
考虑到实体中可能没有属性的组合能够使行唯一,或者,可能希望从单独的属性中构造唯一值,此时需要有其他的解决方案。SQL Server中有一种特殊的数据类型,称为唯一标识符(unique identifier)数据类型,通过它可以使行唯一;不过,更常用的解决方法是,先创建一个整数列,然后把该列设置为标识(identity)列。关于这种方法,将在第5章讲述构建表时学习到更多。
3.8.2  只存储与实体直接有关的信息
在某些情况下,把非常多的信息放在一个实体中可能很容易,因此几乎改变了这个特定实体存在的理由。这样做的话,将不得不在实体中插入重复的信息,这可能会降低OLTP系统的效率。并且,当为一件事情所设计的实体事实上包含了另一事情的数据时,可能会带来混乱。
3.8.3  避免重复值或重复列
当一个属性包含的信息是同一个实体(或相关实体)中另一个属性的严格副本时,是空间和资源上的浪费。但是,往往容易在两个(或多个)表中出现重复属性或重复值,因而产生重复的信息。正是在这种情形下,需要避免重复值并把重复值移走。
3.8.4  范式
现在,已经知道应该在实体中包含什么数据,那么,该如何对数据进行规范化呢?本章要讲述如下几种规范化形式:
q  第一范式(1NF)。
q  第二范式(2NF)。
q  第三范式(3NF)。
虽然还有很多别的、“更高”的规范形式,但它们在学术研究之外很少用到,因此本书将不涉及。
1.第一范式
要使数据库满足第一范式,就要消除所有重复信息组。任何重复的数据组将被移至新表。依次查看示例数据库中的每一个表,会发现有两个表可能违反第一范式的基本要求,分别是:客户表和股票表。
l   客户
该表中,有两个列可能会有重复值:
q  称谓:客户的称谓会是先生、小姐、女士或夫人,可以把所有这些的称谓放到一个参考表中。一些公司是这样做的,而一些却不这样。这全取决于是否要限制用户能进入的区域。
q  地址:应该把地址拆分成单独的行,每一行表示地址的一个部分(如街道、区等)。或许,很值得拥有一个城市、州和国家的参考表。
l   股票
该表中有一列可能会重复,即股票名称列。出现这种情况的根本原因是由于股票表事实上在做两项工作:存储股票详细资料(如名称、股市行情自动收录机信息等),这是唯一的;存储股票历史价格明细。实际上,股票表应拆分为股票详情(Share Details)表和股票价格(Share Prices)表,在讲3NF时将进行这种拆分。
2.第二范式
要满足2NF,表中的每一列必须依赖于所有主键。这意味着,对于表中任何单独的列,需要弄清楚:要得到该列的信息,需要通过所有主键,还是只需要使用部分的主键?如果只需用到部分主键,则必须考虑拆分该表,使得所有的列确实匹配所有主键。因此,要查看表中的每一列,并问一问“只使用部分的主键就可以获取到列中包含的信息吗?”。若所有的表都用ID作为主键,并且只有一个列定义为ID列,那么这种情形是不可能违反2NF的。当用几个列作为主键时,才可能违反2NF。
查看本书示例数据库中的所有表,每一个表中的所有列都确实需要通过所有主键来查找,因此是满足2NF的。
3.第三范式
现在,若要满足3NF,表中没被定义为键的列必须不能依赖表中任何其他列。更进一步地说,任何数据都不能衍生自表中其他数据。
Customers表中有数据是衍生自该表中其他数据的:客户购买的每一个产品的账户号码以及金融产品的详情。这就是说,账户号码和该产品的详情(如开户日期、每次支付的费用、产品类型)不应在Customers表中。如果Customers表中没有了这些信息,那么对应每一位客户表中将会有多行信息。因此,Customers表还需要拆分为客户详情表(包含客户姓名、地址等)和客户产品表(每一行代表客户购买的一种产品及该产品的详情)。
现在,示例数据库中的表满足了3NF。接下来要花点时间说明一下现在的状况。图3-6表明了现在正从逻辑模型设计转向物理模型设计,此时要开始具体定义数据库中要存储的物理信息了。
图3-6  物理数据库模型
3.8.5  非规范化
尽管使数据规范化会带来更高的效率,有时,使数据非规范化将会是更好的选择。使非规范化与规范化完全相反:此时要在表中引入数据冗余,以减少表联接的数目,潜在地加速数据访问。使非规范化的例子可以在生产系统中找到:系统中的表联接会减慢查询速度,或者,系统里不需要规范化(例如,系统中的数据不会经常更新)。
不要只因为别人认为数据应该彻底规范化,就这样去做,具体如何应该根据需要而定。尽管使数据非规范化的缺点很多,它将会带来重复和多余的信息(这些信息可以通过规范化放置在另一个表中,然后在查询时联接表即可)。这既会产生性能问题,又要占用较大的数据存储空间。然而,如果查询运行速度提高了,那么进行使非规范化所付出的代价也算是合理的。当系统中最重要的是数据完整性时,使数据非规范化将毫无意义,因为这样会导致数据重复,进而当需要对数据作修改时,一个地方的数据已经更新而另一个地方的数据尚未更新。
在本书的示例数据库中,并不准备进行使非规范化,于是,现在有了构造系统的所有数据,可以开始学习如何将这些表链接在一起了。
3.9  创建示例数据库
现在,开始创建示例数据库。在本节中,要考查SQL Server里两种不同的创建数据库的方法:
q  使用SSMS图形界面。
q  使用T-SQL代码。
在学习中将发现,这两种创建数据库的方法各有其优缺点,不过,本书中两种方法都会使用(只要可能的话),使用中会发现,对于某项任务很好的方法也许并不适合于另一项任务。对于所有的任务而言,没有哪一种方法是对的或错的,选择使用什么方法主要取决于个人的喜好以及当前要完成的任务。也许你会觉得用T-SQL代码来创建对象效果最好,因为能立即了解可能的不同选择。然而,如果对命令的语法不熟,可以选择使用向导或SSMS。当对命令的语法驾轻就熟以后,使用查询编辑器窗口或许将成为你喜爱的方式。
本节中,还会学习如何在SSMS中删除数据库。
3.9.1  在SSMS中创建数据库
首先要学习的创建数据库的方法是使用SSMS(在第2章中已介绍)来创建数据库。
练习:在SSMS中创建数据库
(1) 在创建数据库之前,先要启动SSMS,通过选择“开始”→“所有程序”→Microsoft SQL Server 2005→SQL Server Management Studio。
提示    本书的所有例子都是在名为XP-PRO的服务器的默认安装实例上进行操作的。读者应根据自己的练习环境对服务器和实例作相应替换。
(2) 确认已注册并连接到服务器上。如果SQL Server服务尚未启动,进行连接时它会自动启动,这可能需要花一些时间。
(3) 在对象资源管理器中,展开“数据库”节点直到看见前面安装的那些单个的数据库。此时也会发现其他的节点,如“系统数据库”(其中有master、msdb等数据库)。确保“数据库”文件夹是突出显示的并准备好进行接下来的操作,如图3-7所示。
创建数据库最少需要如下的信息:
q  要给出数据库的名称。
q  如何对数据排序?
q  数据库的大小。
q  数据库的存放位置。
q  用于存储数据库中所包含信息的文件的名称。
SSMS使用“新建数据库”菜单项收集这些信息。
(4) 在“数据库”文件夹上单击右键,打开有许多不同选项的快捷菜单。选择“新建数据库”,如图3-8所示。
图3-7  对象资源管理器中的“数据库”节点
图3-8  选择创建一个新数据库
(5) 现在,打开了“新建数据库”窗口的“常规”页。首先,输入要创建的数据库的名称,这里是ApressFinancial。注意到,在输入的时候,“数据库文件”列表框中的两个文件也有了相应的名称。这只是一个辅助。也可以改变文件的名称(如图3-9所示)。窗口中创建的名称是根据标准而来的,除非有充分理由,否则应当采用这里的名字。
通过“常规”对话框中的选项,收集到新建数据库所需的最初两条信息。所需的第一条信息是数据库名称。此时不会检查数据库是否存在(当单击“确定”时才会进行检查),但是,在此处会进行某种验证,以保证不会有非法字符输入。
图3-9  “新建数据库”对话框的“常规”设置
注解    以下字符不能用于数据库名称:
可以使用字母、数字、下划线或短线。此外,由于在SQL Server中的很多地方必须手工输入数据库名,因此,数据库名尽量保持简短。
在“数据库名称”的下方是“所有者”。数据库的所有者可以是任何具有创建数据库权限的登录名。在许多(但不是全部)安装中,服务器可以有属于不同开发组的数据库。每一个组要有一个账户,在此处指定这个账户为数据库所有者。目前,默认其为<默认值>账户,该账户是当前登录到SQL Server上的账户,后面将学习如何更改它。如果是使用Windows身份验证登录的,那么当前的用户ID是 Windows用户账户,如果是使用SQL Server身份验证登录的,那么当前的用户ID是连接时所使用的ID。数据库的所有者具有该数据库的全部管理权限,能够创建数据库、修改数据库或其内容、甚至删除数据库。对于数据库管理员类型的账户(如属于Builtin\Administrators组的用户,Builtin\Administrators是sysadmin角色的成员,具有创建数据库的权限)来说,创建数据库是很平常的。
忽略“使用全文索引”复选框。如果想让数据库具有能搜索特定的词或短语的列,则选中此选项。例如,搜索引擎可能有一个列,列中包含来自网页的一组短语,可以用全文搜索来找到哪些页面包含正在搜索的词。
“文件名”条目(图3-9所示窗口右侧没显示出的部分)是用于存储数据库中数据的物理文件的名称。默认情况下,SQL Server用数据库名称加上_Data后缀来创建物理文件名。
数据库文件以.MDF为扩展名存储在硬盘上,例如ApressFinancial_Data.MDF。热衷于自行其事的人们也许不会用.MDF,但它实际上代表了Master Data File,是主数据文件(primary data file)的名字。所有的数据库都必须至少有一个主数据文件。该文件不仅用来为数据库保存数据,也存储了构成数据库的所有其他文件的位置。
同样,也能有辅助数据文件(secondary data file),其后缀可以是.NDF。可以用任何喜欢的名字为辅助数据文件命名,事实上,可以使用完全不同于主数据文件的名字。然而,如果真这样做了,将会引起大量的混乱。因此,要尽量使用与主数据文件一样的名字,当需要为第三、第四(或更多)个辅助数据文件命名时,就在名字后面加上数字后缀。
单击“添加”按钮,将在数据库文件列表框中ApressFinacial_Data条目下增加一行,可以在该行中给出辅助数据文件的名称。
“文件类型”列显示文件是数据文件,还是日志文件,数据文件用来存放数据,而日志文件用来存放对数据所做操作的记录。
接下去一列的列标题是“文件组”。可以在这里为数据库中的文件指定文件组——主文件组(PRIMARY)或任一辅助文件组(SECONDARY)。所有数据库都必须有一个主文件组。若要为辅助数据文件指派文件组,先单击“添加”按钮以添加一个新的数据文件或日志文件,然后单击第三个单元格中的向下按钮。选择<新文件组>后,将打开“新建文件组”对话框,在对话框的“名称”文本框中输入SECONDARY(如图3-10所示)。尽管可以为辅助文件组任意命名,但明智的做法是选择与主文件组很类似的名称。在该对话框中,还可以让新建的文件组成为默认文件组,这样当再次添加数据文件时,将为其选择这个文件组。同样,如果使新建的文件组成为了默认文件组,该文件组将是表、视图等的默认文件组(除非另有指派)。
图3-10  新建文件组
辅助数据文件背后的逻辑较为直截了当。主文件组总是(而且必须总是)包含系统表,系统表存储关于数据库的信息(如表、列等)。如果关闭了“自动增长”(很快将要讲到)文件选项,那么在某些情形下,主文件组很可能会耗尽空间。当主文件组耗尽空间且没有指派辅助数据文件时,数据库将渐渐停止运作直到空间增大。不过,大多数情况下,尤其是目前刚接触SQL Server时,可以让数据库只有主文件组。注意不要把文件组和存储空间混淆了:文件组是在数据库的存储中帮助组织文件的,为提高性能,文件组中所包含的文件可以是位于几个硬盘上的文件。为了速度、效率、安全性、备份以及很多其他原因,要在几个文件组间转移文件。然而,也可以仍然让所有的文件都在一个文件组(主文件组)中,本书中就是这样。
注解    要记住,主文件组不仅要存储数据,而且要存储系统表,因此,仅仅关于表、列等的信息就可能把主文件组填满。
下一列是“初始大小(MB)”列。如果数据库全空,则数据库的初始大小就是其大小。但不要忘了,数据库的空间一开始就会被系统表占用一些,因此数据库是不会彻底为空的。说“我正在创建一个数据库,它的初始大小一定是nnMB”是不行的——数据库的大小依赖于很多因素,如表的数目、存储了多少信息、希望数据库增长到多大等等。
再看下一个(可能是最重要的)列,“自动增长”列。该选项显示SQL Server是否能在数据库到达其初始大小极限时自动应对。如果没有设置这一选项,将不得不监视数据库,并在需要时手动扩充其大小。先不管必须增长数据库大小的问题,单想想在必须对数据库大小进行监视上的开销吧!如果从一开始就让SQL Server来处理,这一问题将非常容易,而且混乱也较少,风险则更是极低。
注解    在生产环境中,甚至在以后进行开发时,更常见的是关闭“自动增长”并使用固定大小。这样可以防止耗尽硬盘,也能避免系统无法继续运行。至少,如果使用固定大小,当开发团队试图清理多余的数据时,能保存一些硬盘空间供SQL Server继续运行之用。
当SQL Server负责增长数据库的大小时,它必须知道按照多大数量来增长。这需要在自动增长选项中设置。可以让SQL Server每次增加预先设定的数量(以MB为单位),也可以按百分比来增长。默认是设置为“按百分比”,在目前的阶段,这确实没什么问题。本书的示例数据库中,第一次将增长2MB,第二次将增长2.2MB。对于本书的示例而言,这种增幅是足够的,因为不会有太多的数据输入到数据库中。但是,“按百分比”增长实在是一种不平均的增长,如果比较喜欢有秩序,就采用“按MB”的增长方式。要改变这些选项的设置,请单击位于当前设置右边的自动增长选项按钮(上面标示有省略号),在打开的对话框中,可以禁用数据库的自动增长,也可以将自动增长的方式从“按百分比”改变为“按MB”(正如前面讨论的那样)。
在“更改自动增长设置”对话框中,“最大文件大小”选项为允许数据库增长到的最大大小设置了上限。默认是“不限制文件增长”,换句话说,对文件增长唯一的限制是硬盘的空闲空间大小。这种“不限制文件增长”的好处是可以不必过分担心数据库的维护,但如果一段“危险”的代码引起了数据的无限循环,后果会是怎样呢?虽然这种情况很少出现,但并非绝无可能。或许,要花比较长的时间才能填满硬盘,但硬盘终将会被填满,而且,清理这样一块彻底填满的硬盘将是非常麻烦的。当一个数据库系统要迁移到生产环境中时,应设置“限制文件增长(MB)”选项以防止出现上述的情形。
关于“新建数据库”对话框的“常规”页面,要讲述的最后一列是“路径”,把滚动条拖向右边即可看到。可以在该列中定义数据库文件在硬盘上的存放位置。如果SQL Server安装在C驱动器,并且没有对任何数据存放路径做过修改,将发现默认的路径是C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data。图3-9表明工作在给定驱动器号为C的映射驱动器上。单击路径右边带有省略号(…)的命令按钮,打开一个资源管理器风格的对话框,可以在该对话框中更改数据库文件的位置。例如,如果要向更大的SQL Server安装版本迁移,也许必须要把这些文件的存放位置改到符合数据库需求的服务器上。
“文件类型”选项为“日志”的行与为“数据”的行所包含的信息差不多,只有一两处很小的不同。这里,“文件名”是通过在数据库名称后面加_log后缀而得到的,并且,不能修改“文件组”列,因为事务日志中实际上没有系统表,所以它只可能填满操作记录。不过,可以定义多个日志文件位置。若填满了事务日志,会因为日志满而导致SQL Server停止处理,因此将不能处理更多的信息。指定多个日志位置则可以避免这种情况。在大型生产系统中采用故障转移日志文件是可取的。
现在开始讨论“新建数据库”对话框的“选项”部分(如图3-11所示)。
图3-11  “新建数据库”对话框的“选项”页
“选项”页的第一个区域是“排序规则”。在第1章安装SQL Server时曾讨论过该选项。需要时,可以更改数据库的排序规则,只是要多加小心。注意,只应由SQL Server系统管理员来更改服务器上的排序规则,系统管理员了解问题并有执行特定任务的权限。
接下来要设置的是“恢复模式”。第7章将讲述数据库的备份和恢复,此处的选项构成了决策的一部分。在开发过程中,“简单”恢复模式是最好的选择,因为应该在本地硬盘上开发并保存最新的资料。这里可以设置的三种恢复模式如下:
q  完整:能使数据库恢复到故障发生点。该模式中,所有事务都被记入日志,因此,可以恢复数据库备份,然后使用事务日志来把数据库恢复到需要的单个时间点。
q  大容量日志:对于大容量操作,日志只进行最简单记录,因此,当执行大容量操作(如大容量复制到SQL Server,或插入大量的数据行)时,不记录每一个行的插入,只记录大容量操作的动作。这样将提高这类大容量操作的性能,但如果出现问题,只能恢复到最后一次日志备份的结尾处。
q  简单:在每一次数据库备份后,截断事务日志。这种模式下,没有做任何事务日志备份,因此只能恢复到最后一次成功的数据备份时的状态。在生产环境中,不应当使用这种模式。
“选项”页的第三个可设置部分是“兼容级别”。如果甘愿牺牲新的功能,也能够创建支持以前版本SQL Server的数据库。这样将允许从SQL Server 2005连接到SQL Server 2000定义的数据库。
在接下来的选项中,目前我们感兴趣的是如下4个,其余的选项将保留到用T-SQL创建数据库时讲述。
q  自动创建统计信息:该选项涉及在进行数据查询时创建要用到的统计信息。标准惯例是设置为True,然而,在生产环境中,特别是当有一个每夜或每周在数据上产生统计信息的过程,或许要把该选项设置为False。正在使用系统时创建或更新统计信息必定会增加服务器上必需的处理,并且,如果服务器大量用于数据插入,那么将“自动创建统计信息”设置为True会使其性能下降。简单明了地说,要根据需要在系统上进行数据查询的频繁程度来权衡。
q  自动更新统计信息:即使是在生产服务器上,将该选项设置为True也是极为常见的,尽管这样依然会带来性能上的降低。该选项会在插入数据、修改数据或删除数据时为表更新统计信息,以便在索引中使用,它同样也会更新表中列的信息。关于索引,将在第6章中进一步讨论。
q  自动关闭:如果希望数据库在最后一个用户退出后关闭,则将该选项设置为True。标准的惯例是设为False,必须有足够的理由才能将该选项设为True,特别是在远程服务器上。
q  自动收缩:数据库和事务日志的大小不仅会随着数据输入的增加而增大,也会由于其他的操作而增大,详细情形将在第7章讨论。可以通过某些操作来收缩日志文件的大小,这些操作中的一些能够由T-SQL激发,一些则是作为操作的副产品来执行的。
(6) 单击窗口中的“确定”按钮,创建新数据库。
此时,SQL Server会执行数个操作。首先,它将检查数据库是否已经存在,若存在,则必须为数据库选择另一个名称。验证过数据库的名称后,SQL Server要进行安全检查,以确认用户有创建数据库的许可。眼下这是不成问题的,因为本书的学习中,总是以正确的许可登录到SQL Server上的。通过了安全审查,就开始创建数据文件并放置在硬盘上。假设有足够的空间,文件已成功创建,直到此时,才用内部系统表中的数据库信息更新SQL Server。一旦完成了这一步骤,数据库就可以使用了。可以看出,整个创建数据库的过程是相对简单明了的,很容易完成。恭喜!
提示   如果此时不想创建数据库也可不必创建。这里有几个其他的选择可供使用:把底层的T-SQL保存到文件中、保存到剪贴板上或保存到查询窗口。前两个选择非常有用,可以作为一种存储操作的方法,把操作保存在源代码库中,如Visual SourceSafe。当希望向数据库中添加(比创建数据库向导中所定义的选项)更多的选项时,第三个选择十分理想。所有这些选择都能让用户看到底层代码并明白创建数据库所必需的是什么。我们很快将开始学习代码。
当回到SSMS中的对象资源管理器时,刷新其中的内容,会看到列出的新数据库,如图3-12所示。
SSMS完全就是一个在后台运行T-SQL脚本的GUI前端。随着本书学习的深入,将看到为每一种对象类型产生的T-SQL代码,以及图形化界面中该对象的创建过程,正如前面所看到的那样。要获取数据库的脚本,有如下两种方式:
q  注意“新建数据库”窗口顶部有一个用于产生脚本的“脚本”按钮。单击该按钮右边的向下箭头,可以指示要把脚本发往何处。
q  一旦已经创建了数据库,可以在该数据库上右击,如图3-13所示,选择“编写数据库脚本为”,然后选择把脚本发送到可选的三个目标位置之一。
图3-12  对象资源管理器中显示的新数据库
图3-13  从SSMS中编写数据库脚本
无论选用哪种方法,脚本总是一样的,除了用第二种方式创建的脚本有一个注释行。在这里,列出了通过这种方法产生的用于生成数据库的脚本,接下来可以逐一查看脚本,以了解整个创建过程都发生了什么。
首先,SQL Server指向一个已知的数据库,如下面的代码段所示。master数据库必须存在,否则SQL Server将无法运行。USE语句指示SQL Server把连接更改为默认的USE语句后面的数据库,这里通过USE语句让后面的语句在master数据库中执行。
接着,脚本基于已选择的选项,构建了CREATE DATABASE T-SQL语句。(由于CREATE DATABASE语句没有涉及所有的可能性,因此这里只草草带过CREATE DATABASE的语法,该语法在3.9.3节中可能要用到。)注意到在代码中,数据库名称被方括号([])括了起来。SQL Server以这种方式来表明:方括号中的信息要类似文字那样来使用,而非一个变量。此外,它也表示了方括号中的信息要当作一个单元来对待。为了详细说明,假设想把数据库命名为Apress Financial(即在Apress与Financial之间有一个空格),那么,必须要有一种方法来说明数据库名称的起止点。这时就需要括号标识符来发挥作用了。
注解    回忆第2章中遇到过的引用标识符选项,该选项用T-SQL命令SET QUOTED_IDENTIFIER ON/OFF进行设置。通过使用该命令,可以用双引号来代替方括号分隔标识符。因此,如果QUOTED_IDENTIFIER设置为ON,则任何由双引号包围的事物将被视为标识符而非文字。为了分隔文字字符串,可以用单引号来实现,就像本例中这样。当文字中必须要输入一个单引号时(如don’t),可以在文字中的单引号前再添加一个单引号。如此一来,情况可能变得有点混乱。所以,笔者倾向于将QUOTED_IDENTIFIER设置为OFF,以减少这种混乱。
不知道读者是否留意到,这里时常会出现GO命令语句。该命令向SQL Server(或任何其他的SQL Server实用工具)发出一批T-SQL语句结束的信号,实用工具将把这一批语句发送到SQL Server。某些语句必须在它们自己的批里,不能与别的语句组合在同一个批中。明白地说,GO语句决定了一批语句的结束,并限定SQL Server应该先处理完当前这一批语句,然后才能继续处理下一批语句。
注解    GO语句只使用在即席T-SQL中,也就是这里所演示的情形。在本书后面,将创建称为存储过程的T-SQL程序。GO语句不能用在存储过程中。
接下来定义新数据库的兼容性级别。此处的语句定义了该数据库的基准级别是SQL Server 2005。可以通过更改参数@new_cmptlevel中的版本值,把数据库定义为与SQL Server的早期版本(早至SQL Server 6.0版)兼容。该代码的更多详情将在第10章中讲述。
然后,可以定义其余的数据库选项。这些语句之间以GO语句来分隔,不过在目前这种情况下,GO语句似乎有点过多了。为何要使用这么多的GO语句呢?当SQL Server配置向导时,在每一条语句后加GO会比较安全,因为这样可以不必预知下一条语句是什么,也因此不必理会是否定义了这批语句的结尾。
能够将数据库设置为允许搜索表中的列里的值。如果有需要的话,这一功能会非常有用,但该功能在操作数据时也有一定的处理开销。
有时,列中没有数据。这就是大家知道的特殊值NULL。ANSI标准规定,如果进行比较的两列中有这一特殊的NULL值,那么比较将失败。列中有NULL值的情况与有数据的情况是不同的。将该值设置为OFF可以改变标准的规定,从而比较两个NULL值时,能取得成功。
现在还是针对NULL值,将ANSI_NULL_DEFAULT设置为OFF意味着列的默认值为NOT NULL(非空)。将在第5章讨论创建表时探究NULL值。
有一些字符列能存储可变长度的数据。在第5章创建表时,将遇到这种情况。如果将ANSI_PADDING选项设置为ON,则会让所有列的数据包含最大的字符数,无论输入的是一个或多个字符的数据。通常将其设置为OFF。
如果将ANSI_WARNINGS设置为OFF,当发生ANSI标准警告或错误(如被零除)时,将不发出警告或错误。此时,在任何存在该错误的列中会返回NULL值。
如果ANSI_WARNINGS设置为ON,当执行被零除操作时,该查询会被终止。为了避免这一情况,可以告诉SQL Server当有算术错误时不退出。
如果希望数据库只在有用户登录时处于活动状态,则将AUTO_CLOSE设置为ON可以关闭数据库。这种情况比较罕见,因为常常希望数据库是24/7(一天24小时一周7天)保持活动状态的,不过,当需要的时候,关闭不必要的数据库能够释放资源以供服务器上的其他数据库使用。一个要将该选项设置为ON的例子是:数据库是供用户全天分析数据之用(例如,要用于分析死亡率的保险精算部门的数据库)。
SQL Server在返回数据时要使用统计信息。如果SQL Server在运行查询时发现缺少统计信息,将下面的选项设置为ON将自动生成统计信息。
将下面的选项设置为ON,可以在数据库的数据量减少时(例如,当有一个每天或每周的存档处理时)自动减小数据库的大小。不过,数据库中会一再加入数据,其大小只会增长,因此该选项标准的设置是OFF。只有当需要缩小数据库时(如由于磁盘空间的要求)才将该选项切换至ON,然而,让该选项介入到使用中的数据库里绝不会是个好主意,所以,最好还是设置其为OFF。
当加入或修改数据时,SQL Server会创建统计信息,以便在进行数据查询时使用。可以在每次修改时更新统计信息,也可以在特定的时间通过T-SQL代码来完成。在插入、修改或删除数据时,这会使性能降低,但当要返回数据时,性能将大为提高。是否要将该选项设置为ON取决于应用程序是一个纯插入类型、纯查询类型还是混合类型。例如,如果是一个纯插入的应用,可能希望该选项为OFF,但这只是最优选择。
游标是数据库中的特殊类型,只有在定义了之后才会存在。本质上,游标是驻留在内存中的临时表。游标可以存在于整个程序的生命期,但如果将下面的选项设置为ON,当事务中一批数据提交或回滚时,将关闭游标。
游标能够存在于局部或全局。这意味着,如果该选项设置为GLOBAL,则程序中创建的任何游标可以由其所调用的任何子程序使用。如果设置为LOCAL,则游标只能存在于创建它的程序中。
如果下面的选项设置为ON,在连接字符域时,若进行连接的列中有任意一个为NULL值,则返回值也是NULL。
当操作一些数值数据类型时,可能会丢失数字的精度。例如,当把浮点值移动到固定小数位的区域时,如果浮点值有太多的有效数字,就可能会出现这种情况。如果下面的选项设置为ON,当有精度损失时将生成错误;设置为OFF意味着数值会被截掉。
前面讲过,当定义数据库的名称时,如果名称中有空格或名称是一个保留字,可以通过把该名称用方括号括住,让SQL Server忽略这种情况并把方括号中的内容看作一个文字。当用双引号来替代方括号时,是在使用引用标识符。关于这一选项,有很多细节可以讨论,在第8章讲述插入数据时将更深入地探究该选项。
接下来的选项涉及一种特殊类型的程序,称为触发器。当发生数据修改时可以激发触发器,并且,一个触发器可以调用另一个触发器。若该选项设置为OFF,则意味着不允许这种情况的发生。
在前面,讲述过关于统计信息的另一个选项,并讲述了修改数据时更新统计信息的方式。下面的选项类似于AUTO_UPDATE_STATISTICS。如果将该选项设置为ON,触发统计信息更新的查询将不等待统计信息的更新。统计信息更新会启动,但更新是在后台异步进行。
下面的选项控制在相关表的时间日期列之间是否存在关联。
下面的选项定义如何将文件组设置为READ_WRITE或READ_ONLY。当有一个备份数据库用来供用户查看数据时,READ_ONLY很适宜。如果数据库是一个生产数据库的严格镜像,那么数据库上的安全性要设置为允许更新,而将该选项设置为READ_ONLY则可以确保没有任何更新发生。
接下来的选项决定当发生故障时(如停电)怎样恢复数据。换句话说,下面的选项定义了前面讨论过的恢复模式。在第7章讨论数据库维护时将更详细地讲述相关内容。
下面的选项定义了数据库的用户访问。MULTI_USER是标准的设置,允许数据库中有多个用户。其他设置是SINGLE_USER和RESTRICTED_USER,只允许有特权的用户连接到数据库。在发生媒体故障或电源故障后,数据库管理员必须连接到数据库并确认一切正常,因此应将数据库设置为RESTRICTED_USER。
当发生I/O错误时(例如硬盘快坏的时候),下面的选项将在校验结果不匹配时报告错误。
最后,下面一行用于控制当引用另一个数据库中的对象时,是否需要进行许可检查。
3.9.2  在SSMS中删除数据库
为了在随后的一节中使用代码创建示例数据库,需要移除刚才所创建的数据库。无论如何,在发生错误或想要删除不再使用的数据库时,知道如何删除数据库也是有用的,删除数据库也称为丢弃(dropping)数据库。
练习:在SSMS中删除数据库
(1) 如果没有启动SSMS,则启动它,并展开节点直至看到ApressFinancial数据库。
(2) 右键单击ApressFinancial数据库,打开上下文菜单。
(3) 单击“删除”选项,如图3-14所示。
图3-14  在SSMS中删除数据库
(4) 在如图3-15所示的对话框中,选择“关闭现有连接”,然后单击“确定”。
图3-15  在“删除对象”对话框中选择删除数据库
第一个复选框是“删除数据库备份和还原历史记录信息”,通过该选项,可以选择保留或删除完成数据库备份或还原后所产生的历史记录信息。如果想要保留这些信息用于审核,则清除该复选框。
第二个复选框非常重要。如果某个程序是基于要删除的数据库运行的,或者有打开的设计窗口或查询窗格是连接到那个数据库上的,则选择该选项将关闭这些连接。若要删除数据库,的确应该没有到该数据库的连接存在。这是一个不错的选项,可以防止发生意外,它也允许不必追踪到恶劣数据库的连接就删除数据库。
(5) 单击“确定”。此时永久删除了数据库。
当单击“确定”按钮时,SQL Server实际上要执行几项操作。首先,要发送命令到SQL Server以告知要删除的数据库的名称。然后,SQL Server将核实当前没有任何到数据库的连接。若有人通过SQL Server查询编辑器或ADO.NET之类的数据访问方法连接到数据库上,SQL Server将拒绝删除。除非选择了“关闭现有连接”,这样将略过该过程。
用户连接到数据库上是否真正在做什么并不是SQL Server拒绝删除所关注的,它所在意的只是是否有到数据库的连接存在。例如,如果在查询编辑器中选择ApressFinancial数据库,然后返回到SSMS并试图删除该数据库,将看到发生错误,如图3-16所示。
图3-16  删除数据库失败
提示    图3-16所显示的这种错误会给出一个到文档的超链接,以提供进一步的帮助。
一旦SQL Server检查到没有任何到数据库的连接,接着要验证用户是否有删除数据库的许可。如果当前的用户ID是创建数据库的用户ID,SQL Server将允许删除,因为在这种情况下,用户拥有该数据库,SQL Server允许该用户对数据库进行任何操作。不过,数据库的所有者并非当前一个用户。
回顾第1章,曾在安装SQL Server时提过sa账户。由于该账户是SQL Server中最强大的ID,能够控制SQL Server中的所有事情,切记不能给sa账户设置空密码,并且,通常也不能把sa账户作为任何形式的登录ID。本节中也提到过,sa账户实际上是sysadmin服务器角色的成员。角色用于把对数据集访问权限相似的用户组织在一起。sysadmin角色中的任何成员都有完全的管理权限(这其中也包括删除服务器上的任何数据库的权力)。
因此,无论是以自己的用户ID还是以sysadmin登录到SQL Server,在使用SSMS删除数据库时都要小心。
3.9.3  在查询编辑器中创建数据库
下面将介绍第二种创建数据库的方法,使用这种方法之前,首先要删除前一节中创建的ApressFinancial数据库。
练习:在查询编辑器中创建数据库
(1) 在SSMS的“标准”工具栏上,选择“新建查询”。
(2) 在查询编辑器中,输入如下T-SQL脚本:
(3) 按F5键或Ctrl+E键或单击“执行”查询工具栏按钮,执行上面输入的代码。
(4) 执行了代码后,将看到下面的结果:
命令已成功完成。
解析:在查询编辑器中创建数据库
本章的这一节主要关注上面练习中列出的代码:CREATE DATABASE命令。
当在查询编辑器中放置代码时,是在创建SQL Server要执行的指令集。在本书的学习中,将遇到许多可以放置在查询编辑器中的命令,所有这些命令的创建都是为了提供强有力的工具或方法来进行数据方面的工作。第2章中对查询编辑器做过深入的讨论,如需要复习,可以返回第2章去浏览相应的资料。
在实际查看代码本身前,需要先来了解CREATE DATABASE命令的语法:
该命令的参数如下:
q  database name:CREATE DATABASE命令要在SQL Server中创建的数据库的名称。
q  ON:关键字ON用于告诉SQL Server该命令将显式地说明要把数据文件放在何处,以及数据文件的名称、大小和文件增长。ON关键字后面跟以更多的、用逗号分隔的选项列表:
n   NAME:数据文件的逻辑名称,用于在SQL Server中引用文件。
n   FILENAME:数据文件的物理文件名及其完整存储路径。
n   SIZE:指定数据文件的初始大小,默认是以MB为单位。该参数是可选的,如果省略了该参数,将使用模型数据库中定义的大小。可以用KB、MB、GB或TB(terabyte)作为文件大小的后缀。
n   FILEGROWTH:当数据文件填满后每次增长的空间量。可以用MB或百分比为单位指定数据文件增长的数值,正如在前面讲述在SSMS中创建数据库时所讨论的那样。
q  LOG ON:LOG ON关键字告诉SQL Server该命令将指定把日志文件放在何处,以及文件的名称、大小和文件增长量:
n   NAME:在SQL Server中引用日志文件所使用的文件名称。
n   FILENAME:日志文件的物理文件名称及其完整的存储路径。必须包含.LDF后缀。该名称可以不同于前面指定的数据文件的FILENAME名称。
n   SIZE:指定日志文件的初始大小,默认是以MB为单位。该参数是可选的,如果省略了该参数,将使用模型数据库中定义的大小。可以用KB、MB、GB或TB作为文件大小的后缀。
n   FILEGROWTH:当日志文件满时每次增长的空间量,与数据文件的FILEGROWTH相同。
q  COLLATE:数据库所使用的排序规则。前面讲述在SSMS中创建数据库时讨论过排序规则。
现在,可以开始查看在查询编辑器中输入的用于创建ApressFinancial数据库的代码了。
代码以CREATE DATABASE为开始,用于告诉SQL Server接下来的语句都是在SQL Server中新建数据库要考虑的参数。一些参数是可选的,当没有输入这些参数时,SQL Server将使用默认值。但是,SQL Server要使用什么值?回忆在本章开始处讨论过的SQL Server内置数据库中的模型数据库。SQL Server将在没有指定参数值时,从该数据库中取得参数的默认选项。因此,在对模型数据库进行任何修改时务必仔细考虑。
显然,数据库的名称是必须的,这里选择的名称是ApressFinancial。
ON参数给SQL Server提供要创建的数据文件的细节,而不是采用默认值。当然,在本例中,没有必要指定这些细节,通过默认值,SQL Sever也能获取到列出的这些参数。
对于接下来在LOG ON后面的关于事务日志的参数集也是一样。同样,在本例中,没有必要提供这些参数,这里所提供的参数值都是SQL Server的默认值。
最后,这里所指定的排序顺序实际上也是服务器的默认值。
综上所述,用来建立示例数据库的命令事实上只需要像下面这样输入,然后从SQL Server中取用所有的默认设置即可:
接着,可以按本章前面讨论脚本时给出的概要设置数据库。
类似地,如果要用T-SQL删除数据库,只需确保没有在查询窗格中通过USE命令连接到ApressFinancial数据库。然后,使用DROP命令,后面跟以要删除的对象,再后面是对象的名称。
3.10  小结
本章研究了示例数据库的设计和创建。这里讨论的步骤在开发前端是极为重要的。对于数据库本身,要仔细考虑它的一些初始化设置,但随着时间的推移,会对数据量以及人们将如何使用数据方面有更好的认识,可能会发现需要修改其中一些选项。当进行用户验收测试时,要留意这里讲过的统计信息选项。
下一章将开始充实示例数据库,创建用于保存数据的表。