摘要本文是为希望将其应用程序转为 Microsoft SQL Server 应用程序的 Oracle 应用程序开发人员所写的文中讲述了成功地进行转换所需要的工具过程和技巧并突出强调了创建高性能高并发性 SQL Server 应用程序的基本设计原则
本文的目标读者应该具有
坚实的 Oracle RDBMS 基础知识背景
全面的数据库管理知识
熟悉 Oracle SQL 和 PL/SQL 语言
实际使用 C/C++ 编程语言的知识
sysadmin 固定服务器角色的成员身份
本文假定您熟悉与 Oracle RDBMS 有关的术语概念和工具有关 Oracle RDBMS 及其体系结构的详细信息请参见 Oracle Server Concepts Manual(Oracle Server概念手册)至于使用 Oracle 脚本和示例还假定您熟悉 Oracle Server Manager 和 Oracle SQL*Plus 工具有关这些工具的详细信息请参见 Oracle 文档
目录
开发和应用程序平台
概述
本文组织结构
体系结构和术语
安装和配置 Microsoft SQL Server
定义数据库对象
实施数据完整性和业务规则
事务锁定和并发性
死锁
SQL 语言支持
游标的实现
优化 SQL 语句
使用 ODBC
开发和管理数据库复制
迁移数据和应用程序
数据库示例
开发和应用程序平台
为了清楚和便于表述假定开发和应用程序平台是 Microsoft Visual Studio 版Microsoft Windows NT (Service Pack )SQL Server 和 Oracle Oracle 使用 Visigenic Software ODBC 驱动程序( 版)SQL Server 使用 Microsoft Corporation ODBC 驱动程序( 版)Microsoft SQL Server 包括用于 Oracle 的 OLE DB 驱动程序但在本章中不予详细讨论
概述
应用程序迁移过程似乎很复杂两种 RDBMS 之间有很多体系结构方面的差异描述 Oracle 体系结构的词汇和术语在 Microsoft SQL Server 中其含义常常完全不同此外Oracle 和 SQL Server 都有许多专有的 SQL 标准扩展
从应用程序开发人员的角度来看Oracle 和 SQL Server 管理数据的方式是相似的但是Oracle 和 SQL Server 之间内部的差异是相当大的如果管理得当它对迁移应用程序造成的影响就会微乎其微
开发人员面临的最严峻迁移问题是SQL SQL 语言标准的实现和每种 RDBMS 提供的扩展一些开发人员只使用标准的 SQL 语言语句并倾向于使其程序代码尽可能通用通常这意味着把程序代码限定在初级 SQL 标准该标准在许多数据库产品中均得到了一致的实现其中包括 Oracle 和 SQL Server
这种方法可能给程序代码带来不必要的复杂性并显着影响程序性能例如Oracle 的 DECODE 函数是 Oracle 特有的非标准 SQL 扩展Microsoft SQL Server 的 CASE 表达式已不止是初级 SQL 的扩展并未在所有的数据库产品上实现
如果不使用这两个函数则可以编程方式实现其功能但可能需要从 RDBMS 检索更多的数据
此外SQL 语言的过程扩展也可能带来困难Oracle PL/SQL 和 SQL Server TransactSQL 语言功能相似但语法不同各 RDBMS 及其过程扩展之间不存在精确的对等关系因此您可能会放弃使用存储程序例如过程和触发器这是令人遗憾的因为这些程序能够提供极好的性能和安全性而这些用任何其它方式均无法实现
使用专用的开发接口也会带来其它的问题使用 Oracle OCI(Oracle 调用接口)转换程序通常需要大量的资源投入当开发的应用程序可能使用多个 RDBMS 时应考虑使用开放式数据库连接 (ODBC) 接口
ODBC 是专为使用多种数据库管理系统而设计的ODBC 提供一致的应用程序编程接口 (API)它通过数据库特有驱动程序的服务与不同的数据库一同工作
一致的 API 是指不论程序与 Oracle 还是与 SQL Server 交互它在建立连接执行命令和检索结果时所调用的函数是相同的
ODBC 还定义了一个标准调用级接口并使用标准转义序列指定执行公用任务的 SQL 函数但该函数在不同的数据库中语法不同不需要修改任何程序代码ODBC 驱动程序就可以自动地把 ODBC 语法转换成原本的 Oracle 或 Microsoft SQL Server SQL 语法在某些情况中最好的方法是编写一个程序使 ODBC 在运行时进行转换
ODBC 并不是一个神奇的解决方案不能对所有的数据库均实现完全的数据库独立性完备的功能以及较高的性能不同的数据库和第三方厂商提供不同级别的 ODBC 支持一些驱动程序只实现了映射在其它接口库顶层的核心 API 函数其它驱动程序例如 Microsoft SQL Server 驱动程序在原本的高性能的驱动程序中提供全面的级别 支持
如果程序只使用核心 ODBC API它可能放弃了一些数据库带有的功能和性能再者并不是所有原本的 SQL 扩展都可以用 ODBC 转义序列表示例如 Oracle DECODE 和 SQL Server CASE 表达式就是这样
此外通过编写 SQL 语句使用数据库优化程序也是通常的做法在 Oracle 中用来提高性能的技巧和方法在 SQL Server 中并不一定最好ODBC 接口无法将技巧从一个 RDBMS 转化到另一个 RDBMS 中
ODBC 并不禁止应用程序使用数据库特有的功能也不禁止优化性能但是应用程序需要一些数据库特有的代码部分有了 ODBC要使程序结构和绝大部分程序代码在多个数据库上保持一致就变得十分简单
OLE DB 是下一代的数据访问技术Microsoft SQL Server 利用了 SQL Server 自身组件中的 OLE DB此外应用程序开发人员在 SQL Server 新的开发过程中应考虑使用 OLE DBMicrosoft 在 SQL Server 中加入了用于 Oracle 的 OLE DB 提供程序
OLE DB 是 Microsoft 的一个战略性系统级编程接口用于管理整个组织内的数据OLE DB 是建立在 ODBC 功能之上的一个开放规范ODBC 是为访问关系型数据库而专门开发的OLE DB 则用于访问关系型和非关系型信息源例如主机 ISAM/VSAM 和层次数据库电子邮件和文件系统存储文本图形和地理数据以及自定义业务对象
OLE DB 定义了一组 COM 接口对各种数据库管理系统服务进行封装并允许创建软件组件实现这些服务OLE DB 组件包括数据提供程序(包含和表现数据)数据使用者(使用数据)和服务组件(处理和传送数据例如查询处理器和游标引擎)
OLE DB 接口有助于平滑地集成组件这样OLE DB 组件厂商就可以快速地向市场提供高质量 OLE DB 组件此外OLE DB 包含了一个连接 ODBC 的桥梁对现用的各种 ODBC 关系型数据库驱动程序提供一贯的支持
本文组织结构
为了帮助您实现从 Oracle 向 SQL Server 的逐步迁移每节都包括一个 Oracle 和 Microsoft SQL 之间相关差异的概述此外还包括转换时要考虑的因素SQL Server 的优势以及多个示例
体系结构和术语
要成功地迁移开始之前应该了解与 Microsoft SQL Server 有关的基础体系结构和术语本节中的许多例子均取自 Oracle 和 SQL Server 应用程序示例(附在文中)
在 Oracle 中数据库指整个 Oracle RDBMS 环境并包括以下组件
Oracle 数据库进程和缓沖区(实例)
包含一个集中系统编录的 SYSTEM 表空间
其它由 DBA 定义的表空间(可选)
两个或多个在线重做日志
存档的重做日志(可选)
各种其它文件(控制文件Initora 等等)
Microsoft SQL Server 数据库从逻辑上将数据应用程序和安全机制分离这一点与表空间非常相似Oracle 支持多个表空间SQL Server 则支持多个数据库表空间还可用于支持数据的物理存放SQL Server 使用文件组提供相同的功能
Microsoft SQL Server 还默认安装下列数据库
model 数据库是所有新创建的用户数据库的模板
tempdb 数据库与 Oracle 临时表空间相似它用于临时工作存储和排序操作与 Oracle 临时表空间不同的是用户可以创建临时表并在用户注销时自动删除
msdb 支持 SQL Server 代理及其计划的作业警报和复制信息
pubs 和 Northwind 数据库作为培训示例数据库提供
有关默认数据库的详细信息请参见 SQL Server Books Online
每个 Oracle 数据库均在一个集中系统编录或数据字典上运行它驻留在 SYSTEM 表空间中每个 Microsoft SQL Server 数据库均维护其自身的系统编录它包含下列信息
数据库对象(表索引存储过程视图触发器等等)
约束
用户和权限
用户定义的数据类型
复制定义
数据库使用的文件
在 master 数据库中SQL Server 还加入了一个集中系统编录它包括系统编录以及有关每个数据库的一些信息
数据库名称和每个数据库的主文件位置
SQL Server 登录帐户
系统消息
数据库配置值
远程和/或链接的服务器
当前活动信息
系统存储过程
与 Oracle 中的 SYSTEM 表空间一样要访问任何其它数据库SQL Server master 数据库必须可用因此当 master 数据库做重大修