摘要:本文是为希望将其应用程序转为 Microsoft SQL Server 应用程序的 Oracle 应用程序开发人员所写的。文中讲述了成功地进行转换所需要的工具、过程和技巧。并突出强调了创建高性能、高并发性 SQL Server 应用程序的基本设计原则。
本文的目标读者应该具有:
坚实的 Oracle RDBMS 基础知识背景。
全面的数据库治理知识。
熟悉 Oracle SQL 和 PL/SQL 语言。
实际使用 C/C++ 编程语言的知识。
sysadmin 固定服务器角色的成员身份。
本文假定,您熟悉与 Oracle RDBMS 有关的术语、概念和工具。有关 Oracle RDBMS 及其体系结构的具体信息,请参见 Oracle 7 Server Concepts Manual(Oracle 7 Server概念手册)。至于使用 Oracle 脚本和示例,还假定您熟悉 Oracle Server Manager 和 Oracle SQL*Plus 工具。有关这些工具的具体信息,请参见 Oracle 文档。
目录
开发和应用程序平台
概述
本文组织结构
体系结构和术语
安装和配置 Microsoft SQL Server
定义数据库对象
实施数据完整性和业务规则
事务、锁定和并发性
死锁
SQL 语言支持
游标的实现
优化 SQL 语句
使用 ODBC
开发和治理数据库复制
迁移数据和应用程序
数据库示例
开发和应用程序平台
为了清楚和便于表述,假定开发和应用程序平台是 Microsoft Visual Studio 6.0 版、Microsoft Windows NT 4 (Service Pack 4)、SQL Server 7.0 和 Oracle 7.3。Oracle 7.3 使用 Visigenic Software ODBC 驱动程序(2.00.0300 版);SQL Server 7.0 使用 Microsoft Corporation ODBC 驱动程序(3.70 版)。Microsoft SQL Server 7.0 包括用于 Oracle 的 OLE DB 驱动程序,但在本章中不予具体讨论。
概述
应用程序迁移过程似乎很复杂。两种 RDBMS 之间有很多体系结构方面的差异。描述 Oracle 体系结构的词汇和术语在 Microsoft SQL Server 中,其含义经常完全不同。此外,Oracle 和 SQL Server 都有许多专有的 SQL-92 标准扩展。
从应用程序开发人员的角度来看,Oracle 和 SQL Server 治理数据的方式是相似的。但是,Oracle 和 SQL Server 之间内部的差异是相当大的,假如治理得当,它对迁移应用程序造成的影响就会微乎其微。
开发人员面临的最严重迁移问题是:SQL-92 SQL 语言标准的实现和每种 RDBMS 提供的扩展。一些开发人员只使用标准的 SQL 语言语句,并倾向于使其程序代码尽可能通用。通常,这意味着把程序代码限定在初级 SQL-92 标准,该标准在许多数据库产品中均得到了一致的实现,其中包括 Oracle 和 SQL Server。
这种方法可能给程序代码带来不必要的复杂性,并显著影响程序性能。例如,Oracle 的 DECODE 函数是 Oracle 特有的非标准 SQL 扩展。Microsoft SQL Server 的 CASE 表达式已不止是初级 SQL-92 的扩展,并未在所有的数据库产品上实现。
假如不使用这两个函数,则可以编程方式实现其功能,但可能需要从 RDBMS 检索更多的数据。
此外,SQL 语言的过程扩展也可能带来困难。Oracle PL/SQL 和 SQL Server Transact-SQL 语言功能相似,但语法不同。各 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 驱动程序,在原本的、高性能的驱动程序中提供全面的级别 2 支持。
假如程序只使用核心 ODBC API,它可能放弃了一些数据库带有的功能和性能。再者,并不是所有原本的 SQL 扩展都可以用 ODBC 转义序列表示,例如 Oracle DECODE 和 SQL Server CASE 表达式就是这样。
此外,通过编写 SQL 语句使用数据库优化程序也是通常的做法。在 Oracle 中用来提高性能的技巧和方法,在 SQL Server 中并不一定最好。ODBC 接口无法将技巧从一个 RDBMS 转化到另一个 RDBMS 中。
ODBC 并不禁止应用程序使用数据库特有的功能,也不禁止优化性能,但是应用程序需要一些数据库特有的代码部分。有了 ODBC,要使程序结构和绝大部分程序代码在多个数据库上保持一致,就变得十分简单。
OLE DB 是下一代的数据访问技术。Microsoft SQL Server 7.0 利用了 SQL Server 自身组件中的 OLE DB。此外,应用程序开发人员在 SQL Server 新的开发过程中,应考虑使用 OLE DB。Microsoft 在 SQL Server 7.0 中加入了用于 Oracle 7.3 的 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 7.3 和 Microsoft SQL 7.0 之间相关差异的概述。此外,还包括转换时要考虑的因素、SQL Server 7.0 的优势以及多个示例。
体系结构和术语
要成功地迁移,开始之前应该了解与 Microsoft SQL Server 7.0 有关的基础体系结构和术语。本节中的许多例子均取自 Oracle 和 SQL Server 应用程序示例(附在文中)。
在 Oracle 中,“数据库”指整个 Oracle RDBMS 环境,并包括以下组件:
Oracle 数据库进程和缓冲区(实例)。
包含一个集中系统编录的 SYSTEM 表空间。
其它由 DBA 定义的表空间(可选)。
两个或多个在线重做日志。
存档的重做日志(可选)。
各种其它文件(控制文件,Init.ora 等等)。
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 7.0 数据库均维护其自身的系统编录,它包含下列信息:
数据库对象(表、索引、存储过程、视图、触发器等等)。
约束。
用户和权限。
用户定义的数据类型。
复制定义。
数据库使用的文件。
在 master 数据库中,SQL Server 还加入了一个集中系统编录,它包括系统编录以及有关每个数据库的一些信息:
数据库名称和每个数据库的主文件位置。
SQL Server 登录帐户。
系统消息。
数据库配置值。
远程和/或链接的服务器。
当前活动信息。
系统存储过程。
与 Oracle 中的 SYSTEM 表空间一样,要访问任何其它数据库,SQL Server master 数据库必须可用。因此,当 master 数据库做重大修