第1章 回顾SQL Server中的对象 1
1.1 数据库的构成 1
1.2 数据库对象概述 2
1.2.1 数据库对象 2
1.2.2 事务日志 5
1.2.3 最基本的数据库对象:表 5
1.2.4 模式 6
1.2.5 文件组 7
1.2.6 图表 7
1.2.7 视图 8
1.2.8 存储过程 9
1.2.9 用户自定义函数 9
1.2.10 用户和角色 10
1.2.11 规则 10
1.2.12 默认值 10
1.2.13 用户自定义数据类型 10
1.2.14 全文目录 10
1.3 SQL Server数据类型 11
1.4 SQL Server对象标识符 15
1.4.1 需要命名的对象 15
1.4.2 命名规则 15
1.5 小结 16
第2章 工具 17
2.1 联机丛书 17
2.2 SQL Server配置管理器 18
2.2.1 服务管理 18
2.2.2 网络配置 19
2.2.3 协议 20
2.2.4 客户端配置 21
2.3 SQL Server Management Studio 23
2.3.1 启动Management Studio 23
2.3.2 查询编辑器 25
2.4 SQL Server Business Intelligence Development Studio 29
2.5 SQL Server集成服务(SSIS) 29
2.6 Reporting Services 29
2.7 Bulk Copy Program(bcp) 30
2.8 SQL Server Profiler 30
2.9 sqlcmd 30
2.10 小结 31
第3章 提出更好的问题:高级查询 33
3.1 子查询概述 34
3.2 构建嵌套子查询 34
3.2.1 使用单值SELECT语句的嵌套查询 35
3.2.2 使用返回多个值的子查询的嵌套查询 35
3.2.3 ANY、SOME和ALL运算符 37
3.3 相关子查询 37
3.3.1 相关子查询的工作方式 37
3.3.2 WHERE子句中的相关子查询 38
3.3.3 SELECT列表中的相关子查询 39
3.4 派生表 40
3.5 EXISTS运算符 42
3.6 INTERSECT和EXCEPT运算符 44
3.6 1 EXCEPT 45
3.6.2 INTERSECT 45
3.6.3 比较EXCEPT和INTERSECT与相应的EXISTS和NOT EXISTS语句 46
3.7 通用表表达式(CTE) 49
3.8 递归查询 50
3.9 合并 53
3.10 利用外部调用完成复杂操作 57
3.11 性能考虑 57
3.12 小结 59
第4章 XML集成 61
4.1 XML数据类型 62
4.1.1 定义XML数据类型的列 62
4.1.2 XML模式集合 63
4.1.3 创建、修改和删除XML模式集合 65
4.1.4 XML数据类型方法 67
4.1.5 施加超出模式集合范围的约束 72
4.2 提取XML格式的关系数据 73
4.2.1 FOR XML子句 73
4.2.2 OPENXML 98
4.3 有关XML索引的提示 102
4.4 层次数据概述 102
4.5 小结 103
第5章 细心推敲,大胆设计 105
5.1 进一步了解规范化 105
5.1.1 入手点 106
5.1.2 达到第三范式 107
5.1.3 其他的规范形式 107
5.2 关系 108
5.3 图表 108
5.3.1 几种关系类型 109
5.3.2 实体框 109
5.3.3 关系线 110
5.3.4 终止符 110
5.4 逻辑设计与物理设计 112
5.4.1 逻辑模型的用途 112
5.4.2 逻辑模型的组成 113
5.5 通过经典的BLOB处理基于文件的信息 114
5.6 子类别 117
5.6.1 子类别的类型 119
5.6.2 明确概念——实现子类别 119
5.6.3 子类别的物理实现 121
5.6.4 通过子类别增加可扩展性 121
5.7 数据库重用 122
5.7.1 可重用数据库的候选 122
5.7.2 如何分解事物 122
5.7.3 可重用性的高昂代价 123
5.8 反规范化 123
5.9 通过分区方法进行扩展 124
5.10 SQL Server关系图工具 125
5.10.1 表 126
5.10.2 处理约束 128
5.11 关于日期列 129
5.12 小结 130
第6章 核心存储和索引结构 131
6.1 SQL Server存储 131
6.1.1 数据库 132
6.1.2 文件 132
6.1.3 区段 132
6.1.4 页 133
6.1.5 行 135
6.1.6 全文目录 135
6.1.7 文件流 136
6.2 理解索引 136
6.2.1 “B”还是非“B”:B树 137
6.2.2 如何在SQL Server中访问数据 140
6.2.3 索引类型和索引导航 141
6.3 创建、修改和删除索引 146
6.3.1 CREATE INDEX语句 147
6.3.2 随约束隐含创建的索引 152
6.3.3 ALTER INDEX 152
6.3.4 DROP INDEX 154
6.4 明智地决定何时何地使用何种索引 154
6.4.1 选择性 155
6.4.2 注意代价 155
6.4.3 选择聚集索引 156
6.4.4 列排序问题 158
6.4.5 删除索引 158
6.4.6 使用数据库引擎优化顾问 158
6.5 维护索引 158
6.5.1 碎片 159
6.5.2 检测碎片 159
6.6 小结 166
第7章 更高级的索引结构 167
7.1 XML索引 167
7.1.1 主XML索引 168
7.1.2 辅助XML索引 169
7.1.3 创建XML索引 170
7.2 用户定义的数据类型 172
7.2.1 经典UDT 172
7.2.2 .NET UDT 173
7.2.3 表格式UDT 173
7.2.4 删除用户定义的类型 176
7.3 层次数据 176
7.3.1 理解深度与输出 176
7.3.2 HierarchyID类型结构 177
7.3.3 处理HierarchyID值——HierarchyID方法 178
7.3.4 索引层次数据 188
7.3.5 性能考虑 189
7.4 空间数据 190
7.4.1 空间概念 190
7.4.2 平面数据描述的实现——GEOMETRY数据类型 194
7.4.3 测量数据描述的实现——GEOGRAPHY类型 199
7.5 文件流 201
7.6 启用文件流 202
7.6.1 为数据库启用文件流 203
7.6.2 创建一个启用文件流的表 203
7.6.3 在T-SQL中使用文件流 204
7.6.4 在.NET中使用文件流 205
7.7 表压缩 205
7.8 小结 206
第8章 视图 209
8.1 回顾视图语法 209
8.2 更复杂的视图 210
8.3 使用T-SQL编辑视图 214
8.4 删除视图 215
8.5 审核:显示现有代码 215
8.6 保护代码:加密视图 217
8.7 关于模式绑定 218
8.8 使用VIEW METADATA使自己的视图看起来像一个表 219
8.9 索引(物化)视图 219
8.10 分区视图 221
8.11 小结 223
第9章 脚本和批处理 225
9.1 脚本的基本概念 225
9.2 批处理 226
9.2.1 批处理错误 228
9.2.2 使用批处理的时机 228
9.3 SQLCMD 231
9.4 动态SQL:使用EXEC命令生成即时代码 232
9.5 流控制语句 237
9.5.1 IF...ELSE语句 238
9.5.2 CASE语句 242
9.5.3 使用WHILE语句进行循环 245
9.5.4 WAITFOR语句 246
9.5.5 TRY/CATCH块 246
9.6 小结 249
第10章 高级编程 251
10.1 细看存储过程 251
10.1.1 输出参数 252
10.1.2 处理错误 254
10.2 表值参数(TVP) 264
10.3 调试 267
10.3.1 启动调试器 267
10.3.2 调试器的组件 268
10.3.3 启动后使用调试器 271
10.4 理解SQLCLR及SQL Server中的.NET编程 273
10.4.1 程序简介 273
10.4.2 编译程序集 273
10.4.3 将程序集上载到SQL Server上 276
10.4.4 创建基于程序集的存储过程 277
10.4.5 从程序集创建标量用户定义函数 278
10.4.6 创建表值函数 281
10.5 创建聚集函数 284
10.6 自定义数据类型 293
10.6.1 从程序集创建自己的数据类型 294
10.6.2 访问复杂数据类型 294
10.6.3 删除数据类型 295
10.7 小结 295
第11章 事务和锁 297
11.1 事务 297
11.1.1 BEGIN TRAN 298
11.1.2 COMMIT TRAN 299
11.1.3 ROLLBACK TRAN 299
11.1.4 SAVE TRAN 300
11.2 SQL Server日志的工作方式 304
11.2.1 使用CHECKPOINT命令 305
11.2.2 在服务器正常关机时执行 305
11.2.3 在更改数据库时执行 306
11.2.4 在启用Truncate on Checkpoint选项时执行 306
11.2.5 在恢复时间超过设置的恢复间隔时执行 306
11.2.6 失败与恢复 306
11.2.7 隐式事务 307
11.3 锁和并发 308
11.3.1 通过锁可以防止的问题 309
11.3.2 可锁的资源 312
11.3.3 锁升级以及锁对性能的影响 312
11.3.4 锁模式 313
11.3.5 锁的兼容性 314
11.3.6 指定特定的锁类型——优化器提示 315
11.4 设置隔离级别 318
11.4.1 READ COMMITTED 318
11.4.2 READ UNCOMMITTED 319
11.4.3 REPEATABLEREAD 319
11.4.4 SERIALIZABLE 319
11.4.5 SNAPSHOT 320
11.5 处理死锁(也称作“A 1205”) 320
11.5.1 SQL Server判断死锁的方式 321
11.5.2 如何选择死锁牺牲品 321
11.5.3 避免死锁 321
11.6 小结 323
第12章 触发器 325
12.1 触发器的含义 326
12.1.1 ON 327
12.1.2 WITH ENCRYPTION 327
12.1.3 FOR|AFTER与INSTEAD OF子句 327
12.1.4 WITH APPEND 330
12.1.5 NOT FOR REPLICATION 330
12.1.6 AS 330
12.2 为数据完整性规则使用触发器 330
12.2.1 处理源自其他表的要求 331
12.2.2 使用触发器检查更新的差异 333
12.2.3 使用触发器实现自定义错误消息 335
12.3 触发器的其他常见用途 335
12.3.1 更新摘要信息 336
12.3.2 向反规范化的表输入数据以用于报告 336
12.3.3 设置条件标志 336
12.4 其他触发器问题 339
12.4.1 嵌套触发器 339
12.4.2 递归触发器 339
12.4.3 触发器调试 340
12.4.4 触发器不妨碍架构的修改 340
12.4.5 不必删除就可以禁用触发器 340
12.4.6 触发器的触发顺序 341
12.5 INSTEAD OF触发器 342
12.5.1 INSTEAD OF INSERT触发器 344
12.5.2 INSTEAD OF UPDATE触发器 346
12.5.3 INSTEAD OF DELETE触发器 346
12.6 IF UPDATE()和COLUMNS_UPDATED() 348
12.6.1 UPDATE()函数 348
12.6.2 COLUMNS_UPDATED()函数 348
12.7 性能考虑 350
12.7.1 触发器不是主动的而是被动的 350
12.7.2 触发进程与触发器之间不存在并发问题 350
12.7.3 简洁明了 351
12.7.4 选择索引时不要忘记触发器 351
12.7.5 不要尝试在触发器中回滚 351
12.8 删除触发器 351
12.9 小结 351
第13章 SQL游标 353
13.1 游标的含义 353
13.2 游标的生命期 354
13.3 游标的类型和扩展的声明语法 358
13.3.1 作用域 359
13.3.2 可滚动性 363
13.3.3 游标类型 365
13.3.4 并发性选项 375
13.3.5 检测游标类型转换:TYPE_WARNING 378
13.3.6 FOR<SELECT> 380
13.3.7 FOR UPDATE 380
13.4 在游标中导航:FETCH语句 380
13.5 在游标中修改数据 381
13.6 小结 383
第14章 Reporting Services 385
14.1 报表服务概述 385
14.2 Reporting Services入门 386
14.2.1 管理Reporting Services的工具 386
14.2.2 访问Reporting Services的其他方法 387
14.3 报表服务器项目 387
14.3.1 数据源 388
14.3.2 使用报表向导 390
14.3.3 编辑报表 394
14.3.4 参数化报表 397
14.3.5 提供参数值并控制其使用 398
14.3.6 添加图表 403
14.3.7 链接报表 404
14.3.8 部署报表 405
14.4 有关RDL的简注 405
14.5 小结 406
第15章 bcp和其他基本的大容量操作 407
15.1 bcp实用工具 408
15.1.1 bcp语法 408
15.1.2 bcp导入 411
15.1.3 bcp导出 415
15.2 格式化文件 416
15.2.1 如果列不匹配 418
15.2.2 使用格式化文件 421
15.2.3 尽量提高导入性能 421
15.3 BULK INSERT 422
15.4 OPENROWSET(BULK) 423
15.4.1 ROWS_PER_BATCH 423
15.4.2 SINGLE_BLOB、SINGLE_CLOB或SINGLE_NCLOB 423
15.5 小结 424
第16章 开始集成 425
16.1 理解问题 425
16.2 包的综述 426
16.2.1 任务 427
16.2.2 主窗口 429
16.2.3 解决方案资源管理器 431
16.2.4 属性窗口 431
16.3 创建简单的包 431
16.4 执行包 435
16.4.1 使用执行包实用工具 436
16.4.2 在Management Studio中执行 438
16.5 小结 438
第17章 复制 439
17.1 复制的基础知识 440
17.1.1 计划复制时需要考虑的事项 440
17.1.2 复制角色 442
17.1.3 订阅 443
17.1.4 订阅服务器的类型 443
17.1.5 筛选数据 443
17.2 复制模型 443
17.2.1 快照复制 444
17.2.2 合并复制 447
17.2.3 事务复制 449
17.2.4 立即更新的订阅服务器 452
17.2.5 混合复制类型 452
17.3 复制的拓扑结构 453
17.3.1 简单模型 453
17.3.2 混合模型 455
17.4 制定复制计划 457
17.4.1 涉及的数据 457
17.4.2 移动设备 458
17.5 在Management Studio中设置复制 458
17.5.1 为复制配置服务器 458
17.5.2 配置发布 462
17.5.3 通过Management Studio设置订阅服务器 465
17.5.4 使用复制数据库 468
17.6 复制管理对象(RMO) 469
17.7 小结 470
第18章 全文搜索 471
18.1 全文搜索的体系结构 472
18.2 设置全文索引和目录 473
18.2.1 为数据库启用全文功能 474
18.2.2 创建、修改、删除和操作全文目录 474
18.2.3 创建、修改、删除和操作全文索引 476
18.2.4 针对旧语法的说明 481
18.3 更多有关索引填充的内容 481
18.4 全文查询语法 482
18.4.1 CONTAINS 483
18.4.2 FREETEXT 484
18.4.3 CONTAINSTABLE 484
18.4.4 FREETEXTTABLE 486
18.4.5 处理短语 486
18.4.6 布尔操作 487
18.4.7 邻近词 487
18.4.8 权重 488
18.4.9 屈折性 489
18.5 停止词 489
18.6 小结 491
第19章 安全性 493
19.1 安全性基础知识 494
19.1.1 一个人,一个登录名,一个密码 494
19.1.2 密码过期 495
19.1.3 密码长度和组成 496
19.1.4 尝试登录的次数 497
19.1.5 用户和密码信息的存储 497
19.2 安全性选项 498
19.2.1 SQL Server安全性 499
19.2.2 创建和管理登录 499
19.2.3 Windows身份验证 505
19.3 用户权限 505
19.3.1 授予访问特定数据库的权限 506
19.3.2 授予访问数据库中对象的权限 507
19.3.3 用户权限和语句级别的权限 512
19.4 服务器和数据库角色 513
19.4.1 服务器角色 514
19.4.2 数据库角色 515
19.5 应用程序角色 518
19.5.1 创建应用程序角色 519
19.5.2 向应用程序角色添加权限 519
19.5.3 使用应用程序角色 519
19.5.4 删除应用程序角色 521
19.6 更高级的安全性 521
19.6.1 如何处理guest帐户 521
19.6.2 TCP/IP端口设置 522
19.6.3 不要使用sa帐户 522
19.6.4 保持xp_cmdshell的隐秘性 522
19.6.5 不要忘记把视图、存储过程和UDF作为安全性工具 522
19.7 证书和非对称密钥 523
19.7.1 证书 524
19.7.2 非对称密钥 524
19.7.3 数据库加密 524
19.8 小结 524
第20章 设计性能卓越的数据库 525
20.1 优化时机 526
20.2 选择索引 527
20.3 客户端和服务器端处理的对比 528
20.4 策略上的反规范化 529
20.5 合理组织存储过程 529
20.5.1 保持事务短小 529
20.5.2 尽可能使用限制性最少的事务隔离级别 530
20.5.3 必要时部署多个解决方案 530
20.5.4 尽可能避免使用游标 530
20.6 使用临时表 531
20.6.1 使用临时表分解复杂问题 531
20.6.2 使用临时表以允许在工作数据上创建索引 532
20.7 及时更新代码 532
20.8 注意细节问题 533
20.9 硬件考虑事项 533
20.9.1 独占式使用服务器 534
20.9.2 I/O密集与CPU密集的对比 534
20.9.3 OLTP和OLAP的对比 538
20.9.4 现场和非现场的对比 538
20.9.5 宕机的风险 539
20.9.6 丢失数据 540
20.9.7 性能就是全部吗 540
20.9.8 厂商支持 540
20.9.9 理想的系统 541
20.10 小结 541
第21章 性能优化工具 543
21.1 优化时机(第二部分) 543
21.2 日常维护 544
21.3 故障排除 544
21.3.1 数据收集器 545
21.3.2 各种显示计划和STATISTICS 545
21.3.3 数据库控制台命令(DBCC) 550
21.3.4 动态管理视图 551
21.3.5 活动监视器 551
21.3.6 SQL Server Profiler 554
21.3.7 性能监视器(PerfMon) 556
21.4 小结 558
第22章 管理 559
22.1 计划作业 560
22.1.1 创建操作员 561
22.1.2 创建作业和任务 564
22.2 备份和恢复 580
22.2.1 创建备份——也叫做“转储” 580
22.2.2 恢复模型 585
22.2.3 恢复 586
22.3 索引维护 590
22.3.1 ALTER INDEX 590
22.3.2 索引名 591
22.3.3 表名或视图名 591
22.3.4 REBUILD 591
22.3.5 DISABLE 592
22.3.6 REORGANIZE 592
22.4 数据存档 593
22.5 PowerShell 593
22.5.1 尝试PowerShell 594
22.5.2 在PowerShell中导航 598
22.5.3 关于PowerShell的最后一点说明 599
22.6 基于策略的管理 600
22.7 小结 600
第23章 SMO:SQL管理对象 601
23.1 SQL Server管理对象模型的发展历程 601
23.1.1 SQL分布式管理对象 602
23.1.2 SQL名称空间 602
23.1.3 Windows Management Instrumentation 602
23.1.4 SMO 603
23.2 SMO对象模型 604
23.3 实例演练 605
23.3.1 开始 605
23.3.2 创建数据库 606
23.3.3 创建表 607
23.4 删除数据库 610
23.5 备份数据库 611
23.6 生成脚本 612
23.7 完整的代码 614
23.8 小结 618
第24章 数据仓库 619
24.1 考虑不同的需求 619
24.1.1 联机事务处理(OLTP) 620
24.1.2 联机分析处理(OLAP) 620
24.1.3 数据挖掘简介 621
24.1.4 OLTP与OLAP 621
24.2 维度数据库 622
24.2.1 事实表 622
24.2.2 维度表 623
24.2.3 星形和雪花模式 624
24.2.4 数据立方体 624
24.3 数据仓库的概念 625
24.3.1 数据仓库的特点 625
24.3.2 数据市场 626
24.4 SQL Server的集成服务 627
24.4.1 数据验证 627
24.4.2 数据清洗 627
24.5 创建分析服务解决方案 627
24.6 访问立方体 633
24.7 小结 635
第25章 保证良好的连接性 637
附录A 系统函数 639
附录B 分析元数据 691
附录C 基础知识 713