应用程序的移植似乎非常复杂。在不同的关系数据管理系统之间有太多的结构差异。用来描述Oracle结构的
用词和术语通常与该词在Microsoft SQL Server中的意思完全不同。另外,Oracle和SQL Server都对SQL-92
标准做了许多自有的扩展。
从一个应用程序开发人员的观点来看,Oracle和SQL Server是以相似的方法来管理数据的。在Oracle和SQL
Server之间有着重大的内部区别,但是如果管理得当,可以把这些区别对移植的影响减到最小。
SQL语言扩展
开发人员面临的最重要的移植问题是执行SQL-92语言标准和每一个关系数据管理系统提供的语言扩展。有一
些开发人员只使用标准的SQL语法,喜欢尽可能的保持他们的程序代码的普遍性。通常,这种方法把程序代
码限制在SQL-92标准的登录级别(entry-level)上,而这个级别是被许多的数据库产品实现了的,包括
Oracle和SQL Server。
这种方法将会产生一些不必要的程序代码复杂性而且还会对程序的性能造成很大的影响。例如,Oracle的
DECODE函数是一个非标准的SQL扩展。Microsoft SQL Server的CASE表达式是一个超越了登录级别的SQL-92
扩展,而且在所有其他的数据库产品中都没有实现。
Oracle的DECODE和SQL Server的CASE都是可选的,你可以不用这两个函数而实现它们的功能,而这需要从关
系数据管理系统中提取更多的数据。
还有,对SQL语言的程序扩展也会造成困难。Oracle的PL/SQL和SQL Server的Transact-SQL语言在函数上是
相似的,但是在语法上不同。在两种数据库和程序扩展中间没有明确的对称性。因此,你可能会决定不使用
想程序和触发器这样的存储的程序。这是很不幸的,因为它们提供了别的任何方式都无法实现的性能和安全
性上的优点。
私有开发接口的使用带来了新的问题。用Oracle OCI(Oracle Call Interface)进行程序转换通常需要很多
资源。开发一个可能用到多个关系数据管理系统的应用程序,最好是考虑使用开放数据库连接(Open
Database Connectivity,ODBC)接口。
ODBC
ODBC是为同多个数据库管理系统协同工作而设计的。ODBC提供了一个一致的应用程序编程接口(application
programming interface,API),该接口使用一个针对数据库的驱动程序同不同的数据库协同工作。
一致的应用程序编程接口意味着程序用来建立连接、执行命令以及获取结果的函数是一样的,无论该程序是和
Oracle还是SQL Server对话。
ODBC同时还定义了一个标准化的调用级别的接口并且针对那些不同数据库里完成同样任务但语法不同的SQL函
数使用标准的出口次序。ODBC驱动器可以自动的把这个ODBC语法转化为Oracle或者SQL Server的本地语法,
这个过程不需要对程序代码做任何的修订。在某些情况下,最好的方法是编写一个程序并且让ODBC在运行时
间执行转换处理。
ODBC并不是一个万能的可以针对任何数据库实现完全独立的、完整功能和高性能的解决方案。不同数据库和
第三方经销商提供了对ODBC不同级别的支持。一些驱动器仅仅实现了核心的API函数,这些函数映射了顶层或
者其他接口库。其他一些驱动器,例如Microsoft SQL Server的驱动器,在一个本地的、高性能的驱动器中
提供了完整的2级支持。
如果一个程序仅使用核心的ODBC API,它很可能会丢弃某些数据库的特征和性能。此外,并不是所有的本地
SQL扩展都可以在ODBC出口次序中描述的(例如Oracle的DECODE和SQL Server的CASE表达式)。
另外,书写SQL语句来利用数据库优化器是意见很自然的事情。但是在Oracle中用来扩展数据库性能的技术和
方法在Microsoft SQL Server 7.0中不一定是最好的。ODBC接口并不能把一个系统所用的技术翻译为另一个
系统的技术。
ODBC并不影响一个应用程序使用数据库专有的特征和调整来提高性能,但是应用程序需要某些数据库专有的
代码部分。ODBC使得在多个数据库间保持程序结构和多数程序代码一致变得容易。
OLE DB
OLE DB是下一代数据访问技术。Microsoft SQL Server 7.0利用包含在其自身的组件之中的OLE DB。这样,
应用程序开发人员可以考虑使用OLE DB来进行新的SQL Server 7.0开发。微软在SQL Server 7.0中还提供了
支持Oracle 7.3的OLE DB。
OLE DB是微软用来管理跨组织的数据的战略性的系统级编程接口。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的转换,本文的每一部分都有一个关于Oracle7.3和
Microsoft SQL Server 7.0的不同之处的概述。同时还包括转换的考虑,SQL Server 7.0的优势以及多个实
例。
结构和术语
作为成功移植的开始,你应该掌握Microsoft SQL Server 7.0所用的基本的结构和术语。这一部分中的许多
例子都是从本文包含的Oracle和SQL Server应用程序中截取下来的。
数据库的定义
在Oracle中,数据库是指整个Oracle RDBMS环境,并且包含以下组件。
Oracle数据库处理过程和数据缓存(实例)。
包含一个集中的系统目录的SYSTEM表空间。
DBA定义的其它表空间(可选的)。
两个或者多个Redo日志。
存档的Redo日志(可选)
各种其它文件(控制文件、Init.ora等等)。
一个Microsoft SQL Server数据库提供了数据、应用程序以及安全机制的逻辑区分,更像一个表空间(
tablespaces)。正如Oracle支持多个表空间,SQL Server也支持多个数据库。表空间也用来提供数据的物
理放置,SQL Server通过文件组(filegroups)来提供同样的功能。
Microsoft SQL Server将缺省的安装下列数据库。
model数据库是所有新建用户数据库的模板。
Tempdb数据库跟Oracle中的临时表空间很相象,都是用来进行临时的工作储存以及排序操作。不同的是,当
用户退出登录时,Microsoft SQL Server自动删除其创建的临时表空间。
Msdb数据库支持SQL Server代理以及其预定的工作、警报和复制信息。
Northwind和pubs数据库是用于培训的实例数据库。
如果想获得缺省数据库的更多信息,请参看SQL Server联机图书。
数据库系统目录
每个Oracle数据库都在一个集中系统目录(或者是数据字典(data dictionary))上运行,该目录存在于
SYSTEM表空间中。而每个Microsoft SQL Server 7.0数据库都维护一个自己的系统目录,该目录包含下列
信息:
数据库对象(表、索引、存储程序、视图、触发器等等)。
约束(Constraints)。
用户和许可。
用户定义数据类型。
复制定义。
数据库所用的文件。
SQL Server同时在master数据库中保存一个集中系统目录,该目录包含系统目录和每个数据库的某些信息:
数据库名和每个数据库的初始文件位置。
SQL Server登录账号。
系统消息。
数据库配置值。
远程和/或已连接的服务器。
当前活动信息。
系统存储过程。
像Oracle中的SYSTEM表空间一样,SQL Server的master数据库也必须能访问任何其他数据库。同样,对数
据库做了任何重大的改变以后,通过备份master数据库来防止失败是很重要的。数据库管理员也应该能够
为组成master数据库的文件做镜象。
物理和逻辑存储结构(Physical and Logical Storage Structures)
Oracle RDBMS是由表空间组成的,而表空间又是由数据文件组成的。表空间数据文件被格式化为内部的块
单位。块的大小,是由DBA在Oracle第一次创建的时候设置的,可以在512到8192个字节的范围内变动。当
一个对象在Oracle表空间中创建的时候,用户用叫做长度的单位(初始长度((initial extent)、下一个
长度(next extent)、最小长度(min extents)、以及最大长度(max extents))来标明该对象的空间
大小。一个Oracle长度的大小可以变化,但是要包含一个由至少五个连续的块构成的链。
Microsoft SQL Server在数据库级别使用文件组来控制表和索引的物理放置。文件组是一个或者多个文件的
逻辑容器,一个文件组中的数据按比例填充属于该文件组的全部文件。
如果没有显明的定义和使用文件组,数据库对象将放置在一个缺省的文件组中,该文件组是在数据库的创建
过程中隐含定义的。文件组允许你进行下列操作:
把大的表分布在多个文
查看本文来源