第1章 回顾SQL Server中的对象 1
1.1 本书提供什么 1
1.2 数据库对象概览 1
1.2.1 数据库对象 2
1.2.2 事务日志 4
1.2.3 最基本的数据库对象:表 4
1.2.4 模式 5
1.2.5 文件组 5
1.2.6 关系图 5
1.2.7 视图 7
1.2.8 存储过程 7
1.2.9 用户定义函数 7
1.2.10 用户和角色 8
1.2.11 规则 8
1.2.12 默认值 8
1.2.13 用户定义数据类型 8
1.2.14 全文目录 9
1.3 SQL Server数据类型 9
1.4 SQL Server对象标识符 12
1.4.1 对什么命名 12
1.4.2 命名规则 12
1.5 小结 13
第2章 工具 14
2.1 联机丛书 14
2.2 SQL Server配置管理器 15
2.2.1 服务管理 16
2.2.2 网络配置 16
2.2.3 协议 17
2.2.4 客户端配置 18
2.3 SQL Server Management Studio 20
2.3.1 启动 20
2.3.2 查询窗口 22
2.4 SQL Server Business Intelligence Development Studio 25
2.5 SQL Server Integration Services(SSIS) 26
2.6 Reporting Services 26
2.7 大容量复制程序 26
2.8 SQL Server Profiler 27
2.9 sqlcmd 27
2.10 小结 27
第3章 T-SQL基础 28
3.1 基本的SELECT语句 28
3.1.1 SELECT语句和FROM子句 29
3.1.2 JOIN子句 30
3.1.3 WHERE子句 36
3.1.4 ORDER BY 40
3.1.5 使用GROUP BY子句聚集数据 42
3.1.6 使用HAVING子句在组上放置条件 45
3.1.7 使用FOR XML子句进行XML输出 46
3.1.8 使用OPTION子句指定提示 46
3.1.9 DISTINCT 46
3.2 用INSERT语句添加数据 47
3.3 通过UPDATE语句更改现有的数据 50
3.4 DELETE语句 52
3.5 替代的联结语法 54
3.5.1 替代的INNER JOIN 54
3.5.2 替代的OUTER JOIN 54
3.5.3 替代的CROSS JOIN 55
3.6 UNION 55
3.7 小结 58
第4章 创建和修改表 59
4.1 SQLServer中的对象名 59
4.1.1 模式名(又名:所有权) 59
4.1.2 数据库名 61
4.1.3 按照服务器命名 61
4.2 CREATE语句 62
4.2.1 CREATE DATABASE 62
4.2.2 CREATE TABLE 66
4.3 ALTER语句 72
4.3.1 ALTER DATABASE 72
4.3.2 ALTER TABLE 75
4.4 DROP语句 77
4.5 使用GUI工具 78
4.5.1 创建或编辑数据库 78
4.5.2 创建和编辑表 79
4.6 小结 80
第5章 回顾键和约束 81
5.1 约束的类型 82
5.1.1 域约束 82
5.1.2 实体约束 83
5.1.3 引用完整性约束 83
5.2 约束的命名 83
5.3 键约束 84
5.3.1 主键约束 84
5.3.2 外键约束 87
5.3.3 UNIQUE约束 94
5.4 CHECK约束 95
5.5 DEFAULT约束 96
5.5.1 在CREATE TABLE语句中定义DEFAULT约束 97
5.5.2 在现有的表上添加DEFAULT约束 97
5.6 禁用约束 98
5.6.1 创建约束时忽略不正确的数据 98
5.6.2 临时禁用现有的约束 100
5.7 规则和默认值:约束的同类 102
5.7.1 规则 102
5.7.2 默认值 103
5.7.3 确定哪个表或数据类型上使用了指定的规则或默认值 104
5.8 保证数据完整性的触发器 104
5.9 选择应用使用什么 104
5.10 小结 105
第6章 更深入的问题:高级查询 106
6.1 什么是子查询 107
6.2 构建嵌套的子查询 107
6.2.1 使用单值SELECT语句的嵌套查询 108
6.2.2 使用返回多个值的子查询的嵌套查询 109
6.2.3 ANY、SOME和ALL运算符 110
6.3 相关子查询 111
6.3.1 相关子查询如何工作 111
6.3.2 WHERE子句中的相关子查询 112
6.3.3 SELECT列表中的相关子查询 113
6.4 派生表 115
6.5 EXISTS运算符 117
6.6 混合数据类型:CAST和CONVERT 119
6.7 使用外部调用执行复杂的操作 120
6.8 性能考虑 121
6.9 小结 123
第7章 挑战设计 124
7.1 规范化回顾 124
7.1.1 从何处入手 125
7.1.2 达到第三范式 125
7.1.3 其他规范形式 126
7.2 关系 126
7.3 关系图 127
7.3.1 几种关系类型 128
7.3.2 实体框 128
7.3.3 关系线 129
7.3.4 终结器 129
7.4 逻辑设计和物理设计 131
7.4.1 逻辑模型的用途 131
7.4.2 逻辑模型的组成部分 132
7.5 处理基于文件的信息 133
7.6 子类别 135
7.6.1 子类别的类型 137
7.6.2 明了什么是什么——实现子类别 137
7.6.3 子类别的物理实现 139
7.6.4 通过子类别增加可扩展性 140
7.7 数据库重用 140
7.7.1 可重用数据库的候选 141
7.7.2 如何分解事物 141
7.7.3 可重用性的高昂代价 141
7.8 非规范化 142
7.9 为可伸缩性进行分区 142
7.10 SQL Server关系图工具 143
7.10.1 表 145
7.10.2 处理约束 146
7.11 小结 147
第8章 SQL Server——存储和索引结构 148
8.1 SQL Server存储 148
8.1.1 数据库 148
8.1.2 文件 148
8.1.3 区段 149
8.1.4 页 149
8.1.5 行 151
8.1.6 全文目录 151
8.2 理解索引 152
8.2.1 “B”还是非“B”:B树 153
8.2.2 在SQL Server中如何访问数据 156
8.2.3 索引类型和索引导航 157
8.3 创建、修改和删除索引 163
8.3.1 CREATE INDEX语句 163
8.3.2 创建XML索引 167
8.3.3 随约束隐含创建的索引 168
8.3.4 ALTER INDEX 168
8.3.5 DROP INDEX 170
8.4 明智地选择:决定何时何地使用何种索引 171
8.4.1 选择性 171
8.4.2 注意代价:当少变成多时 171
8.4.3 选择聚集索引 172
8.4.4 列顺序问题 174
8.4.5 删除索引 174
8.4.6 使用数据库引擎优化顾问 174
8.5 维护索引 174
8.5.1 碎片 175
8.5.2 检测碎片 175
8.6 小结 179
第9章 视图 180
9.1 简单视图 180
9.2 更复杂的视图 181
9.3 使用T-SQL编辑视图 185
9.4 删除视图 185
9.5 审查:显示已有的代码 185
9.6 保护代码:加密视图 187
9.7 关于模式绑定 188
9.8 使用VIEW_METADATA让视图看起来像一个表 188
9.9 索引(具体化)视图 188
9.10 分区视图 190
9.11 小结 191
第10章 脚本和批处理 192
10.1 脚本基础 192
10.1.1 USE语句 193
10.1.2 声明变量 193
10.1.3 使用@@IDENTITY 195
10.1.4 使用@@ROWCOUNT 196
10.2 批处理 197
10.2.1 批处理中的错误 198
10.2.2 何时使用批处理 199
10.3 SQLCMD 201
10.4 动态SQL:使用EXE命令生成代码 202
10.5 流控制语句 207
10.5.1 IF...ELSE语句 207
10.5.2 ELSE子句 209
10.5.3 CASE语句 211
10.5.4 使用WHILE语句进行循环 216
10.5.5 WAITFOR语句 217
10.5.6 TRY/CATCH块 217
10.6 小结 219
第11章 存储过程和用户定义函数 221
11.1 创建存储过程:基本语法 221
11.2 用ALTER更改存储过程 222
11.3 删除存储过程 223
11.4 参数 223
11.4.1 声明参数 223
11.4.2 创建输出参数 224
11.5 通过返回值确认成功或失败 226
11.6 错误处理 229
11.6.1 应该采取的方式 229
11.6.2 手工生成错误 234
11.6.3 添加你自己的自定义错误消息 236
11.7 存储过程能提供什么 238
11.7.1 创建可调用的过程 238
11.7.2 因安全而使用存储过程 238
11.7.3 存储过程和性能 239
11.8 扩展存储过程 241
11.9 递归概览 241
11.10 用户定义函数 243
11.10.1 什么是UDF 243
11.10.2 返回标量值的UDF 244
11.11 返回表的UDF 246
11.12 调试 252
11.12.1 为进行调试而设置SQL Server 252
11.12.2 启动调试器 253
11.12.3 调试器的组成 254
11.12.4 调试器启动后使用 256
11.13 小结 259
第12章 事务和锁 260
12.1 事务 260
12.1.1 BEGIN TRAN 261
12.1.2 COMMIT TRAN 261
12.1.3 ROLLBACK TRAN 262
12.1.4 SAVE TRAN 262
12.2 SQL Server日志的工作原理 265
12.2.1 使用CHECKPOINT命令 267
12.2.2 在恢复时使用CHECKPOINT 267
12.2.3 正常的服务器关机 267
12.2.4 数据库选项的更改 268
12.2.5 当Truncate on Checkpoint选项活动时 268
12.2.6 当恢复时间超出Recovery Interval选项的设置时 268
12.2.7 失败和恢复 268
12.2.8 隐式事务 270
12.3 锁和并发 270
12.3.1 通过锁可以防止什么问题 271
12.3.2 可锁的资源 274
12.3.3 锁升级以及锁对性能的影响 274
12.3.4 锁模式 275
12.3.5 锁的兼容性 276
12.3.6 指定特定的锁类型——优化器提示 277
12.4 设置隔离级别 279
12.4.1 READ COMMITTED 280
12.4.2 READ UNCOMMITTED 280
12.4.3 REPEATABLE READ 280
12.4.4 SERIALIZABLE 281
12.5 处理死锁(也称作“A 1205”) 281
12.5.1 SQL Server是如何判断存在死锁的 281
12.5.2 死锁牺牲品是如何选择的 282
12.5.3 避免死锁 282
12.6 小结 284
第13章 触发器 285
13.1 什么是触发器 286
13.1.1 ON 287
13.1.2 WITH ENCRYPTION 287
13.1.3 FOR|AFTER与INSTEAD OF子句 287
13.1.4 WITH APPEND 289
13.1.5 NOT FOR REPLICATION 289
13.1.6 AS 290
13.2 为数据完整性规则使用触发器 290
13.2.1 处理来自其他表的要求 290
13.2.2 使用触发器检查更新的差异 292
13.2.3 为定制错误消息使用触发器 294
13.3 触发器的其他常见用途 294
13.3.1 更新摘要信息 294
13.3.2 向非规范化的表中输入数据以用于报告 294
13.3.3 设置条件标记 295
13.4 其他触发器问题 297
13.4.1 触发器可以是嵌套的 297
13.4.2 触发器可以是递归的 298
13.4.3 调试触发器 298
13.4.4 触发器不妨碍修改架构 298
13.4.5 不必删除触发器就能够禁用它 299
13.4.6 触发器激发顺序 299
13.5 INSTEAD OF触发器 301
13.5.1 INSTEAD OF INSERT触发器 302
13.5.2 INSTEAD OF UPDATE触发器 304
13.5.3 INSTEAD OF DELETE触发器 305
13.6 IF UPDATE()与COLUMNS_UPDATED 306
13.6.1 UPDATE()函数 306
13.6.2 COLUMNS_UPDATED()函数 307
13.7 性能考虑 308
13.7.1 触发器是被动的而非先发制人的 308
13.7.2 触发器与激发它们的进程之间没有并发问题 309
13.7.3 保持短小精悍 309
13.7.4 在选择索引时不要忘记了触发器 309
13.7.5 不要试图在触发器中回滚 309
13.8 删除触发器 309
13.9 调试触发器 310
13.10 小结 311
第14章 使用.NET 312
14.1 程序集入门 312
14.2 编译程序集 313
14.3 将程序集上载到SQL Server中 315
14.4 创建基于程序集的存储过程 316
14.5 从程序集中创建标量用户定义函数 317
14.6 创建表值函数 320
14.7 创建聚集函数 323
14.8 从程序集创建触发器 328
14.9 自定义数据类型 332
14.9.1 从程序集创建自己的数据类型 333
14.9.2 访问复杂数据类型 333
14.9.3 删除数据类型 334
14.10 小结 335
第15章 SQL游标 336
15.1 什么是游标 336
15.2 游标的生命期 337
15.3 游标的类型和扩展的声明语法 341
15.3.1 作用域 341
15.3.2 可滚动性 345
15.3.3 游标类型 347
15.3.4 并发性选项 358
15.3.5 游标类型转换检测:TYPE_WARNING 361
15.3.6 FOR〈SELECT〉 363
15.3.7 FOR UPDATE 363
15.4 在游标中导航:FETCH语句 363
15.5 在游标中修改数据 364
15.6 小结 366
第16章 XML集成 367
16.1 XML数据类型 367
16.1.1 定义一个XML数据类型的列 368
16.1.2 XML模式集合 369
16.1.3 创建、修改和删除XML模式集合 370
16.1.4 XML数据类型方法 372
16.1.5 在模式集合上的强制约束 377
16.2 提取XML格式的关系数据 377
16.2.1 FOR XML子句 377
16.2.2 OPENXML 399
16.3 XML索引的快速提示 403
16.4 HTTP端点 403
16.4.1 安全性 404
16.4.2 HTTP端点方法 404
16.4.3 创建和管理HTTP端点 405
16.4.4 最后的思考 406
16.5 小结 406
第17章 报表服务 407
17.1 报表服务入门 407
17.2 构建简单的报表模型 408
17.2.1 数据源视图 410
17.2.2 创建报表 413
17.3 报表服务器项目 417
17.4 小结 421
第18章 BCP和其他基本的大容量操作 422
18.1 BCP实用工具 422
18.1.1 BCP语法 423
18.1.2 BCP导入 426
18.1.3 BCP导出 429
18.2 格式化文件 430
18.2.1 当列不匹配时 432
18.2.2 使用格式化文件 434
18.2.3 最大化导入的性能 435
18.3 BULK INSERT 435
18.4 OPENROWSET(BULK) 436
18.4.1 ROWS_PER_BATCH 437
18.4.2 SINGLE_BLOB,SINGLE_CLOB,SINGLE_NCLOB 437
18.5 小结 437
第19章 集成服务 438
19.1 理解问题 438
19.2 包的概述 439
19.2.1 任务 440
19.2.2 主窗口 442
19.2.3 解决方案资源管理器 443
19.2.4 属性窗口 443
19.3 创建简单的包 443
19.4 执行包 448
19.4.1 执行包实用工具的使用 448
19.4.2 在Management Studio中执行 450
19.5 小结 451
第20章 复制 452
20.1 复制基础 453
20.1.1 考虑在什么时候做出复制计划 453
20.1.2 复制角色 455
20.1.3 订阅 456
20.1.4 订阅服务器的类型 456
20.1.5 筛选数据 456
20.2 复制模型 457
20.2.1 快照复制 457
20.2.2 合并复制 460
20.2.3 事务复制 462
20.2.4 立即更新订阅服务器 464
20.2.5 混合复制类型 465
20.3 复制的拓扑结构 465
20.3.1 简单模型 466
20.3.2 混合模型 468
20.4 为复制制订计划 470
20.4.1 涉及的数据 470
20.4.2 移动设备 471
20.5 在Management Studio中设置复制 471
20.5.1 为复制配置服务器 471
20.5.2 配置发布 475
20.5.3 设置订阅服务器(通过Management Studio) 480
20.5.4 使用复制数据库 483
20.6 复制管理对象 485
20.7 小结 485
第21章 全文搜索 487
21.1 全文搜索的架构 488
21.2 设置全文索引和目录 489
21.2.1 为数据库激活全文特性 489
21.2.2 创建、修改、删除和操作全文特性 490
21.2.3 创建、更改、删除和操作全文索引 492
21.2.4 使用旧的语法来创建全文目录 496
21.2.5 针对索引的旧语法 497
21.2.6 关于索引填充的更多内容 498
21.3 全文查询语法 500
21.3.1 CONTAINS 500
21.3.2 FREETEXT 501
21.3.3 CONTAINSTABLE 502
21.3.4 FREETEXTTABLE 503
21.3.5 处理短语 503
21.3.6 布尔操作 503
21.3.7 邻近词 504
21.3.8 权重 504
21.3.9 特定性 505
21.4 干扰词 506
21.5 小结 506
第22章 安全性 507
22.1 安全性基础 508
22.1.1 一个人,一个登录名,一个密码 508
22.1.2 密码过期 509
22.1.3 密码长度和组成 510
22.1.4 尝试登录的次数 511
22.1.5 用户和密码信息的存储 511
22.2 安全性选项 512
22.2.1 SQL Server安全性 512
22.2.2 创建和管理登录 513
22.2.3 Windows集成的安全性 518
22.3 用户权限 519
22.3.1 授予访问特定数据库的权限 519
22.3.2 授予数据库中对象的权限 520
22.3.3 用户权限和语句级别的许可 524
22.4 服务器和数据库角色 526
22.4.1 服务器角色 526
22.4.2 数据库角色 527
22.5 应用程序角色 530
22.5.1 创建应用程序角色 531
22.5.2 应用程序角色添加许可权限 531
22.5.3 使用应用程序角色 531
22.5.4 删除应用程序角色 532
22.6 更高级的安全性 532
22.6.1 关于guest账户应该怎么办 532
22.6.2 TCP/IP端口设置 533
22.6.3 别使用sa账户 533
22.6.4 xp_cmdshell保持隐秘 533
22.6.5 不要忘记作为安全手段的视图、存储过程以及UDF 533
22.7 证书和非对称密钥 534
22.7.1 证书 535
22.7.2 非对称密钥 535
22.8 小结 535
第23章 性能优化 536
23.1 什么时候进行优化 537
23.2 索引选择 538
23.3 客户端和服务器端处理 539
23.4 战略上的非规范化 540
23.5 例行维护 540
23.6 组织好存储过程 541
23.6.1 让事务尽量短 541
23.6.2 尽可能使用限制性最少的事务隔离级别 541
23.6.3 必要的话实现多个解决方案 541
23.6.4 尽可能避免使用游标 541
23.7 使用临时表 542
23.8 莫以善小而不为 543
23.9 硬件的考虑 543
23.9.1 独占对服务器的使用 544
23.9.2 I/O密集与CPU密集 544
23.9.3 OLTP和OLAP 548
23.9.4 现场的和非现场的 548
23.9.5 挂起的风险 549
23.9.6 丢失数据 549
23.9.7 性能就是全部吗? 549
23.9.8 驱动器支持 550
23.9.9 理想的系统 550
23.10 排错 550
23.10.1 多种多样的显示计划和STATISTICS 551
23.10.2 数据库一致性检查器(DBCC) 555
23.10.3 查询调控器 556
23.10.4 SQL Server Profiler 556
23.10.5 性能监视器 559
23.11 小结 560
第24章 管理 561
24.1 计划作业 561
24.1.1 创建操作员 562
24.1.2 创建作业和任务 565
24.2 备份和恢复 581
24.2.1 创建备份 581
24.2.2 恢复模式 586
24.2.3 恢复 587
24.3 索引维护 590
24.3.1 ALTER INDEX 591
24.3.2 索引名 591
24.3.3 表名或视图名 591
24.3.4 REBUILD 591
24.3.5 DISABLE 592
24.3.6 REORGANIZE 592
24.4 数据存档 593
24.5 小结 593
第25章 SMO:SQL管理对象 595
25.1 SQL Server SMO的历史 595
25.1.1 SQL分布式管理对象 596
25.1.2 SQL命名空间 596
25.1.3 WMI 596
25.1.4 SMO 597
25.2 SMO对象模型 597
25.3 演练实例 598
25.3.1 开始 599
25.3.2 创建数据库 600
25.3.3 创建表 600
25.4 删除数据库 604
25.5 备份数据库 604
25.6 生成脚本 605
25.7 完整的代码 607
25.8 小结 611
附录A 系统函数 613
附录B 连接性 650
附录C 获得服务 659