本书是一部关于SQL Server 2005 高级开发技术的权威著作,提供了详尽、全面的技术讨论,并给出了详细的应用实例。书中前4 章着重介绍SQL Server 所涉及的软件开发方法学、测试、异常处理和安全;第5 章至第7 章深入研究SQL Server 独具的高级特性,主要介绍加密、SQLCLR 和动态SQL;第8 章至第11 章从数据库体系结构的角度分析问题,深入研究具体的设计和实现问题,包括应用程序并发、空间数据、时态数据和图,这是本书最为复杂的内容,也是最有实际意义的内容。
本书可以作为软件开发人员,特别是数据库设计人员的参考手册,也可供计算机专业、信息系统专业的高年级本科生、研究生作为数据库课程的教材或者参考书。
Adam Machanic,微软SQL Server MVP,著名的SQL Server专家。长期活跃于技术社区,是SQL Server Professional和TechNET等行业杂志的撰稿人,经常在各种技术会议上开设技术讲座、发表演讲。除本书外,他还是Pro SQL Server 2005的作者之一。
..
<< 查看详细
第1章 数据库领域的软件开发方法学
1.1 架构回顾
1.1.1 耦合、内聚和封装
1.1.2 接口
1.2 核心问题:集成数据库和面向对象系统
1.2.1 该何去何从
1.2.2 对象—关系失配
1.3 ORM:一个问题多多的解决方案
1.4 把数据库操作设计为API
1.5 全面权衡
1.5.1 可测试性
1.5.2 可维护性
1.5.3 安全性
1.5.4 性能
1.5.5 步履蹒跚的远期功能
1.6 小结
第2章 数据库例程测试
2.1 黑盒测试与白盒测试简介
2.1.1 单元测试和功能测试
2.1.2 单元测试框架
. 2.1.3 回归测试的重要性
2.2 实现数据库测试过程和测试例程的指导准则
2.2.1 为什么说软件测试很重要
2.2.2 哪种测试重要
2.2.3 需要进行多少测试
2.2.4 管理层是否愿意接受软件测试
2.3 性能测试和数据库系统事件探查
2.3.1 获取基准度量
2.3.2 使用跟踪器及事件探查器进行查看
2.3.3 评估性能计数器
2.3.4 宏观分析
2.3.5 粒度分析
2.3.6 修正问题:仅仅关注明显的错误是否已经足够
2.4 SQLQueryStress性能测试工具介绍
2.5 小结
第3章 错误和异常
3.1 异常和错误
3.2 SQL Server中异常的工作原理
3.2.1 语句级异常
3.2.2 批处理程序级异常
3.2.3 语法分析和作用域解析异常
3.2.4 连接和服务器级异常
3.2.5 XACT_ABORT设置
3.2.6 分析错误信息
3.2.7 SQL Server的RAISERROE函数
3.2.8 跟踪监控异常事件
3.3 异常处理
3.3.1 为什么要在T-SQL中处理异常
3.3.2 使用@@ERROR“处理”异常
3.3.3 SQL Server的TRY/CATCH语法
3.4 事务与异常
3.4.1 事务退出的神话
3.4.2 XACT_ABORT:神话(半)成真
3.4.3 TRY/CATCH和被诅咒事务
3.5 小结
第4章 特权与授权
4.1 最低特权原则
4.1.1 在SQL Server中创建代理
4.1.2 层级数据安全:洋葱模型
4.2 使用Schema组织数据
4.3 使用EXECUTE AS实现基本模拟
4.4 所有权链
4.5 非链式特权提升
4.5.1 存储过程与EXECUTE AS
4.5.2 使用证书对存储过程进行签名
4.6 小结
第5章 加密
5.1 要保护什么
5.2 加密术语:我们需要知道的部分
5.3 SQL Server 2005加密密钥体系
5.3.1 服务主密钥
5.3.2 数据库主密钥
5.4 SQL Server 2005数据保护
5.4.1 HashBytes()
5.4.2 非对称密钥加密和证书加密
5.4.3 对称密钥加密
5.4.4 EncryptByPassphrase
5.5 隔离数据与DBA
5.6 性能优化设计
5.6.1 设计解决方案、定义问题
5.6.2 搜索加密数据
5.7 小结
第6章 SQLCLR:架构和设计注意事项
6.1 填充SQL/CLR鸿沟:SqlTypes库
6.2 包装代码以提高跨层重用性
6.3 SQLCLR的安全性特征和可靠性特征
6.3.1 代码安全性需求
6.3.2 通过程序集引用有选择地提升特权
6.3.3 授予交叉程序集特权
6.4 利用SQLCLR加强Service Broker可扩展性功能
6.5 扩展用户自定义聚合
6.6 小结
第7章 动态T-SQL
7.1 动态T-SQL与ad hoc T-SQL
7.2 为什么要使用动态SQL
7.2.1 编译与参数化
7.2.2 自动参数化
7.2.3 应用程序级参数化
7.2.4 参数化与高速缓存的性能暗示
7.3 支持可选参数
7.3.1 通过静态T-SQL实现可选参数
7.3.2 实现动态化:使用EXECUTE
7.3.3 SQL注入
7.3.4 sp_executesql:一个更好的EXECUTE
7.4 动态SQL在安全方面的考虑
7.4.1 被引用对象的权限
7.4.2 接口规则
7.5 小结
第8章 应用程序并发系统的设计
8.1 从业务角度观察:进程产生冲突时会发生什么情况
8.1.1 SQL Server隔离级别概述
8.1.2 并发控制与SQL Server提供的隔离级别
8.2 做最坏的打算:悲观的并发
8.2.1 在写入过程中使用悲观锁
8.2.2 应用程序锁:对悲观并发控制机制进行泛化
8.3 希望最好的情况发生:乐观的并发控制
8.4 包容冲突:多值并发控制
8.5 通过排队提高可扩展性
8.6 小结
第9章 空间数据处理
9.1 用纬度和经度表示地球空间数据
9.1.1 设置示例数据
9.1.2 计算两点之间的距离
9.1.3 从一个位置点移动到另一个位置点
9.1.4 邻近搜索
9.1.5 边界框
9.1.6 查找距离最近的邻近点
9.1.7 动态边界框
9.1.8 结论
9.2 使用分层三角形网格表示地球空间数据
9.2.1 HTM的简化描述
9.2.2 实现HtmID
9.2.3 Spatial数据库提供的函数
9.2.4 结论
9.3 其他类型的空间数据
9.3.1 三维数据
9.3.2 天文数据
9.3.3 虚拟空间
9.3.4 将区域表达为多边形
9.4 小结
第10章 时态数据处理
10.1 表达的不仅仅是时间
10.2 SQL Server提供的日期/时间数据类型
10.2.1 日期输入格式
10.2.2 格式化输出日期
10.2.3 高效查询日期/时间列
10.2.4 日期/时间计算
10.3 使用日历表定义周期
10.4 设计时态数据存储方案及查询时态数据
10.4.1 处理时区
10.4.2 处理时间区间
10.4.3 为持续时间建立模型
10.4.4 管理双时态数据
10.5 小结
第11章 树、层次结构和图
11.1 术语:万物皆为图
11.2 基础知识:邻接表和图
11.2.1 为边加入约束
11.2.2 针对图的基本查询:给定一个结点,这个结点与其他哪些结点相连
11.2.3 遍历图
11.3 邻接表的层次结构
11.3.1 查询邻接表层次结构:基础知识
11.3.2 查找直接后代结点
11.3.3 在层次结构中向下级层次遍历
11.3.4 在层次结构中向上级层次遍历
11.3.5 插入新结点并重新定位子树
11.3.6 删除已有结点
11.3.7 为层次结构加入约束
11.4 持久保存具体化路径
11.4.1 查找下级结点
11.4.2 在层次结构中向上级层次导航
11.4.3 对具体化路径解决方案进行优化
11.4.4 插入结点
11.4.5 重新定位子树
11.4.6 删除结点
11.4.7 为层次结构加入约束
11.5 嵌套集模型
11.5.1 查找下级结点
11.5.2 在层次结构中向上级层次导航
11.5.3 插入结点
11.5.4 重新定位子树
11.5.5 删除结点
11.5.6 为层次结构加入约束
11.6 小结
SQL Server 2005不仅具有SQLServer数据库的所有优点,而且在性能、可靠性、可用性、可编程性等方面得到了有效的改进,因此,更加适用于进行大型联机事务处理、大规模数据存储和大型电子商务应用。另外,SQL Server 2005与.NET平台高度集成,因此,开发SQLServer应用程序时,不仅可以使用T-SQL语法,还可以将.NET语言开发的程序部署到SQL Server 2005中,程序开发方式、程序的性能、安全性和可扩展性都得到了有效的提高。.
目前,在大型联机事务处理、空间数据处理等应用中,SQL Server 2005已经得到了广泛使用。然而,开发这类应用系统时,开发人员常常会遇到一些意想不到的困难。例如,安全性、加密技术、并发处理等技术,入门似乎很容易,但是一旦涉及如何在确保系统性能和可靠性的前提厂实现相关功能,许多开发人员就不得不在SQL Server的联机手册中苦苦寻找答案。
正是基于卜述原因,本书讨论了在确保数据库执行效率和应用程序可靠性的前提下,如何开发数据库应用程序,而这些主题在别的书籍中很少讨论到。读者可以从本书学习到如何创建高质量的加密方案,如何生成SQLCLR解决方案,掌握如何开发可靠的并发程序,以及空间数据库和时态数据库设计方法等。在翻译本书过程中,我们感到作者对SQL Server 2005认识极为深刻,并深为作者的广博知识所吸引。例如,在翻译第9章的过程中,我们对作者的讨论和技术对比颇为折服,因为作者提到的许多技术正是我们在某大型科研项目中采用过的技术。为了提高系统效率,最终选定某项实现技术时,往往需要集思广益,经过了大量比较后才能确定,而作者的探讨,无疑会为开发这类系统提供一个有益的指南,使未来的开发工作少走许多弯路。..
本书作者均系SQL Server开发界的知名人士,他们对SQL Server架构分析及相关技术细节具有深刻的理解。对于使用SQL Server实现解决方案的开发人员,特别是SQL Server高级开发人员,本书是一部非常好的指导性著作。
在本书的翻译过程中,我们本着对读者认真负责的态度,力求做到技术内涵的准确无误和专业术语的规范统一,力求做到翻译的准确性和灵活性的有效结合。
本书主要由颜炯和薄建禄翻译。参与本书翻译的还有马蓉、焦贤龙、张杰良、韩智文、张聪、闫志强、唐玲艳、肖国尊、岳虹、邓彬、林龙信、李晋文、肖枫涛、邝祝芳、奚丹、刘志忠、陈钢、宋锐、唐扬斌、叶俊、杨明军。BeFlying工作室负责人肖国尊负责本书译者的确定、翻译质量和进度的控制与管理。由于水平有限,错误与不到位之处在所难免,敬请广大读者提供反馈意见,可以发送电子邮件至be-flying@sohu.com。我们会仔细查阅读者发来的每一封邮件,以求进一步提高今后译著的质量。同时欢迎光临BeFlying工作室博客:http://blog.csdn.net/be flying。...
译者
2008年初
一次又一次地在不同的项目中使用SQL Server之后,我发现自己一次又一次地解决了许多同样类型的问题。虽然解决每个问题的方法稍有不同,但是它们通常会有一些共同的特征——编码模式、逻辑过程或通用技术。每一次开发客户的软件时,我就感觉自己正在基于以前做过的东西,创建—个更大的工具集,而这个工具集是我可以应用到以后许多项目中去的。每次我开始感觉白己已经掌握了某些领域的奥秘,就又会突然学到一些新的技巧,并意识到我实际上什么都不懂——这就是使用如SQLServer这样又大又灵活的产品工作所获得的乐趣的一部分。.
本书的核心实际上就是如何构建自己的工具集。在使用SQL Server的过程中,你可以从工具集中获得灵感。我试图说明如何使用这里描述的每个概念,还会说明为何这样使用。本书的许多例子中,我都试图深入探讨我获得我所认为的最佳答案的过程。我的目标是与你分享我对问题的思考方式。无论你是否发现我的方法直接可用,我都希望你可以利用它,将其作为调整你自己的开发方法的手段。
本书从逻辑上可分为3个部分:前4章着重介绍SQL Server中涉及的软件开发方法学,接下来的3章深入研究SQLServer所独具的高级特性,最后4章着重于从架构的角度分析问题,围绕一些我在过去的项目中遇到的更困难的问题,深入研究特定的设计和实现问题。
第1章和第2章的目标是为SQL Server中的软件开发提供一个框架。到目前为止,SQLServer已经远远不只是一个DBMS了,我感觉到大部分时间它没有获得它作为一个应用程序构建的基础所应该获得的尊重。相反,它经常被看作一个“哑(dumb)”对象存储系统,这种看法真的很让人感到羞愧啊!想想应用程序可以利用它做多少事情!在这两章中,我着重讨论软件架构和开发方法学,以及如何像对待其他软件一样正确对待数据库软件,包括对它进行测试。..
软件开发实际上就是将业务问题转化为技术解决方案,但在这条路上存在很多障碍。在我看来,其中的两个主要障碍是:存在于软件或其他组件中的漏洞和那些对破坏或窃取数据感兴趣的入侵者。因此,第3章和第4章将分别介绍异常处理和安全。恰当地预见错误发生的条件并预防安全威胁,你就能够晚上早点休息,因为这时你知道你的软件不会在重压之下轻易崩溃。
第5章至第7章主要介绍加密、SQLCLR和动态SQL的正确使用。这几章不会涉及所有特性(尤其是对于SQLCLR这一章),而是回顾一些最重要的内容,这些内容是你在使用这些特性解决自己的业务问题时所要考虑的。
第8章至第11章介绍应用程序并发、空间数据、时态数据和图。这是本书最为庞大、最为复杂的内容,也是我最喜欢的内容。数据架构是一种只要有一点创新,你就能获得大量回报的领域,这个领域也是研究新问题和解决新问题的好地方。这几章介绍如何使用不同模式解决一些常见问题,这些模式都应该易于修改,以便适应数据库开发人员在门常工作中面临的各种情况。
最后,我要提醒读者的是,数据库开发虽然是一项严肃的工作且对业务至关重要,但应该还是一项很有意思的工作!巧妙而有效地解决技术难题将会给人带来难以置信的满足感。我希望本书能使读者和我一样变得对数据库开发充满热情。...
数据库也是软件。我从1978年就开始从事软件开发了,近十多年来这一理念成了我职业生涯的基点。.
既然你已经在翻看本书,那么你很有可能乐于接受如下观点:数据库及其可编程能力也和应用程序的其余部分一样值得严肃对待和处理。很好!很高兴能和你——起开始这个旅程,让我们先从这个序开始吧!
你很可能和我一样,对于在设计和预算过程中轻视“后端”这样的普遍看法持怀疑态度。那么,你现在肯定在寻找构建或改进SQLServer2005设计和开发过程中比较实用的见解。
你现在拿的这本书就充满了这类见解。在正式开始阅读本书之前,我想向你提一个建议。
我建议我们不要再将数据库称为“后端”了。这个词实际上有一点轻视和贬低的味道。听起来好像我们不太乐意关注它似的,对吧?而“前端”这个词则听起来好像是充满了欢乐和荣誉的地方。毕竟,那是所有人都能看到的地方。后端听起来奸像是一种可以被安全地忽略的东西。因此,当必须减少资源时,可能从人们都看不见的地方着手更容易和更安全些,是这样吗?..
错了。这样的做法忽略了一个事实,即数据库是软件——重要且复杂的软件。如果我们将数据库这个组件称为“基础层”的话,我们的观点会有怎样的变化呢?“基础层”听起来肯定显得有分量多了。例如,当考虑家里房子的地基(基础层)时,我会强烈希望设计、构建它的人知道他们在于什么,尤其是我家后院的山上可能有山泉流下来的时候。如果他们不注意,所有地基上形形色色的东西,从房顶到宽带调制解调器再到我的吉他都将处于危险之中。同样,如果应用程序的基础层没有按照客户独特而精心考虑的要求进行设计和构建,用户界面再漂亮也是没有用的。如果底层基础层不能满足任何逻辑或性能的需求,那么即使拥有当前最敏捷的用户界面也是不会让用户满意的。
我要再重复一遍:数据库是软件。存储过程、用户自定义函数和触发器显然都是软件,而Schema也是软件。主键和外键也是软件。索引和统计信息也同样是软件。整个数据库都是软件。读到这里,可能你会发现这些就是要你关注的。你也许正在探寻一个框架,一种可以利用的、以简洁有序方式深入SQLServer2005开发的思想。看完这本非常易读的书之后,你会发现你的探寻有了答案。
我从1999年起在微软公司供职,这个工作使我成为对数据库设计和构建的所有阶段都应用严格质量标准的提倡者。自从在2005年凭借这一阶段的工作进入公众视野后,我遇到了几个志趣相投的人,其中就包括Adam和Hugo。如果你采纳了作者在书中所提的建议,那么将会创建㈩可扩展性、可维护性都更好的数据库,进而使得应用程序有更好的性能并且更易于维护,这也会使客户更加开心。这种事情,说到底,对业务都有好处。
通过阅读本书,你将成为软件和IT行业中专家级原则的实践者和支持者,这个专家级的原则就是:数据库是软件!...
WardPond
MicrosoftSQLServer资深技术架构师
http://blogs.technet.com/wardpond
sqlwriter@comcast.net
“罕见的深度,书中的所有内容都值得反复咀嚼并实际演练。我向所有想探索SQL Server的读者推荐本书。”
——Bob Beauchemin,微软SQL Server MVP
“数据库方面的书太多了。可是没有一本像本书这样讨论了软件工程、测试等诸多重要主题,包括我自己的收!许多内容对我来说也是全新的,强烈推荐!”
——JoeCelko,SQL标准委员会成员。世界顶尖SQL专家,《SQL解惑》等经典著作的作者
市面上充斥着大量入门性质的SQL Server 2005图书,而许多重要的主题却很少涉及。
本书由几位世界级SQL Server专家撰写而成,他们从亲身开发经验出发,针对实际开发中会一再遇到的问题,讨论了包括微软公司联机文档在内的其他资料中都难以找到的一些重要主题。作者将数据库视为软件开发生态系统中的一个有机组成部分,引导读者对SQL Server开发进行思考。达到从未企及的深度。
通过书中的最佳实践和大量示例,读者可以掌握如何设计高性能、高可维护性的应用程序,从而大大提升自己的数据库开发水平。
第1章 数据库领域的软件开发方法学
数据库应用程序开发是一种软件开发形式,人们应该以软件开发的方式看待数据库应用程序开发。但是在开发小组讨论架构及测试计划时,往往把数据库部分当做次要部分来考虑——似乎很多数据库开发人员都认为,标准的软件开发最佳实践并不适用于数据库应用程序开发。
事实上,几乎每种应用程序都需要某种形式的数据存储,开发社区中的许多人都不只是持久化应用数据,还要创建数据驱动(data driven)的应用程序。所谓数据驱动就是应用程序的行为根据数据的变化而动态变化,事实上可以用一个更好的术语来表达这个概念,即数据依赖(data dependent)。
由于应用程序与数据和数据库如此的密切相关,软件开发高手不仅仅要是能干的软件开发人员,毫无疑问还得是数据访问和管理方面的专家。数据是应用程序中处于中心位置的、控制性的因素,它决定了应用程序对用户的价值。没有数据,也就无需此应用程序。
本书的主要目的正是为了把Microsoft SQL Server开发人员重新拉回软件开发的范畴。本书强调严格的测试、深思熟虑的架构设计,以及对数据彼此依赖性的谨慎考虑。对这些方面的完美驾驭是软件开发专家的重要标志,而作为任何软件开发团队的核心,数据库专家当然不能缺少这个方面的专业技能。
本章将重点介绍软件开发概念和架构相关知识,因为它们完全适用于数据库应用领域。其中有些主题在开发者社区中尚有极大争议,本书将尽量对各种观点并举,即使有些问题似乎已经有了权威答案。不过我建议你认真思考这些问题,而不是把我或者其他人的观点照搬照抄,因为软件架构领域于变万化,只有在对各种案例反复揣摩之后我们才可能奢望找到或许存在的“最佳”答案。
1.1 架构回顾
软件架构是一个庞大、复杂的话题,主要是因为很多软件架构设计师往往喜欢把系统弄得尽可能的复杂。而事实在于,编写一个优秀的软件,并不需要像很多系统设计师提倡的那样使用太多复杂的结构设计,真正高质量的设计往往只需理解并应用其中很少的基本原理就够了。
……