设为首页
加入收藏夹

把Oracle数据库移植到Microsoft SQL Se
浏览选项:

  应用程序的移植似乎非常复杂。在不同的关系数据管理系统之间有太多的结构差异。用来
  用词和术语通常与该词在Microsoft SQL Server中的意思完全不同。另外,Oracle和SQL
  标准做了许多自有的扩展。
  从一个应用程序开发人员的观点来看,Oracle和SQL Server是以相似的方法来管理数据的
  Server之间有着重大的内部区别,但是如果管理得当,可以把这些区别对移植的影响减到
  SQL语言扩展
  开发人员面临的最重要的移植问题是执行SQL-92语言标准和每一个关系数据管理系统提供
  些开发人员只使用标准的SQL语法,喜欢尽可能的保持他们的程序代码的普遍性。通常,
  码限制在SQL-92标准的登录级别(entry-level)上,而这个级别是被许多的数据库产品
  Oracle和SQL Server。
  这种方法将会产生一些不必要的程序代码复杂性而且还会对程序的性能造成很大的影响。
  DECODE函数是一个非标准的SQL扩展。Microsoft SQL Server的CASE表达式是一个超越了
  扩展,而且在所有其他的数据库产品中都没有实现。
  Oracle的DECODE和SQL Server的CASE都是可选的,你可以不用这两个函数而实现它们的功
  系数据管理系统中提取更多的数据。
  还有,对SQL语言的程序扩展也会造成困难。Oracle的PL/SQL和SQL Server的
  相似的,但是在语法上不同。在两种数据库和程序扩展中间没有明确的对称性。因此,你
  想程序和触发器这样的存储的程序。这是很不幸的,因为它们提供了别的任何方式都无法
  性上的优点。
  私有开发接口的使用带来了新的问题。用Oracle OCI(Oracle Call Interface)进行程
  资源。开发一个可能用到多个关系数据管理系统的应用程序,最好是考虑使用开放数据库
  Database Connectivity,ODBC)接口。
  ODBC
  ODBC是为同多个数据库管理系统协同工作而设计的。ODBC提供了一个一致的应用程序编程
   programming interface,API),该接口使用一个针对数据库的驱动程序同不同的数据
  一致的应用程序编程接口意味着程序用来建立连接、执行命令以及获取结果的函数是一样
  Oracle还是SQL Server对话。
  ODBC同时还定义了一个标准化的调用级别的接口并且针对那些不同数据库里完成同样任务
  数使用标准的出口次序。ODBC驱动器可以自动的把这个ODBC语法转化为Oracle或者SQL
  这个过程不需要对程序代码做任何的修订。在某些情况下,最好的方法是编写一个程序并
  间执行转换处理。
  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来进行新的SQL Server 7.0开发。微软在SQL
  支持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还包含一座连接ODBC的桥梁,如此就可以为今天可以
  相关的数据库驱动程序继续提供支持了。
  本文的组织方式
  为了帮助你一步一步的实现从Oracle到SQL Server的转换,本文的每一部分都有一个关于
  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
  长度(next extent)、最小长度(min extents)、以及最大长度(max extents))来
  大小。一个Oracle长度的大小可以变化,但是要包含一个由至少五个连续的块构成的链。
  Microsoft SQL Server在数据库级别使用文件组来控制表和索引的物理放置。文件组是一
  逻辑容器,一个文件组中的数据按比例填充属于该文件组的全部文件。
  如果没有显明的定义和使用文件组,数据库对象将放置在一个缺省的文件组中,该文件组
  过程中隐含定义的。文件组允许你进行下列操作:
  把大的表分布在多个文件中以提高I/O吞吐量。
  把索引存储在不同的文件中,而不是放在各自的表中,再一次提高I/O吞吐量以及实现磁
  把text、ntext、和image columns(大对象)储存在一个表的不同文件中。
  把数据库对象放置在特定的磁盘锭(disk spindles)上。
  在一个文件组中备份和恢复个别表和表的设置。
  SQL Server把文件格式化为叫做页(pages)的单位。页的大小固定为8192字节(即8K)
  连续页大小的格式组织为长度。当创建表或者索引时,SQL Server自动为其分配一页,比
  来说,储存较小的表和索引,这种方法要更有效些。
  标记数据(Striping Data)
  (译注:Strip--在海量存储系统(MSS)中,可由给定磁头位置访问的数据盒式磁带中的那
  Oracle类型的段对于大多数Microsoft SQL Server安装来说都不需要。取而代之的是,
  用基于硬件的RAID或者Windows NT软件RAID来较好的完成数据的分布或者标记。基于硬件
   NT软件RAID可以设置一个由多个硬盘组成的标记装置,使它们看起来就像一个逻辑驱动
  文件是在这个标记装置上创建的,磁盘子系统就假定为负责通过多个磁盘来进行分布式的
  员使用RAID来将数据分布在多个物理磁盘上。
  针对SQL Server的RAID推荐配置是RAID 1(镜象)或者RAID 5(拥有一个作为冗余的额外
  设备)。RAID 10(对有奇偶的标记设备的镜象)也是推荐的,但它比起前两个来要昂贵
  分散数据库文件上通常的随机I/O来说是很好的。
  如果不能使用RAID,文件组就是一个很有吸引力的选择了,它提供了RAID可以提供的某些
  对于那些可能跨越多个物理RAID阵列的非常大的数据库来说,文件组可能是一个很好的选
  种受控制的方式将I/O分布在多个RAID阵列上。
  必须优化事务日志文件(Transaction log files),使之适应连续的I/O,并且必须保护
  失败。因此,建议采用RAID1(镜象)来做事务日志。该驱动器的大小至少应该和在线恢
   redo logs)以及反转段表空间两者加起来的大小一样才行。创建一个或者更多个日志文
  上定义的空间占满。和存储在文件组中的数据不同,事务日志条目总是按顺序写入的,而
  欲获得关于RAID的更多信息,请参看SQL Server联机图书,你的Windows NT服务器文档,
  Windows NT资源指南。
  事务日志和自动恢复(Transaction Logs and Automatic Recovery)
  Oracle RDBMS在每次启动时执行自动修复。它检查表空间文件的目录与在线恢复日志文件
  如果不一样,Oracle就使用在线恢复日志文件覆盖表空间文件(roll forward、前滚),
  段中发现的所有未完成的事务(roll back,后滚)。如果Oracle不能从在线恢复日志中
  Oracle就求助于存档的恢复日志文件。
  Microsoft SQL Server 7.0同样在每次启动时通过检查系统中的每个数据库来执行自动恢
  master数据库,然后启动线程以覆盖系统中的所有数据库。对于每一个SQL Server数据库
  检查事务日志。如果事务日志中包含任何未完成的事务,则该事务后滚。然后自动修复机
  以找出那些还没有写入数据库的未完成事务。如果找到,则执行该事务,前滚。
  SQL Server事务日志包含了Oracle后滚段和Oracle在线恢复日志两者总的功能。每个数据
  日志,该日志记录了数据库发生的任何改变,并且日志由数据库的所有用户共享。当一个
  一次数据修改,则一个BEGIN TRANSACTION事件(同modification事件一样)被记录在日
  过程中使用该事件来确定事务的起始点。每收到一个数据修改事件,改变都被记入事务日
  数据库中。欲了解更多信息,请参看本章后面的"事务、锁定和并行"部分。
  SQL Server有一个自动检查点机制,该机制确保完成了的事务规则的从SQL Server磁盘缓
  文件。从数据库的上一个检查点算起,任何修改过的缓存页将被写入一个检查点。向数据
  (dirty pages,污损页)写入检查点,确保了所有已完成的事务被写到磁盘上。该过程
  如能量损耗,power outage)时修复系统的所花的时间。该设置可以用SQL Server
  ,还可以用Transact-SQL修改(sp_configure系统存储程序)。
  备份和恢复数据
  Microsoft SQL Server提供了几种备份数据的选择:
  完全的数据库备份
  要进行完全的数据库备份,使用BACKUP DATABASE语句或者"备份向导"(Backup Wizard)
  微分备份(Differential backup)
  在经过完全的数据库备份以后,定期使用BACKUP DATABASE WITH DIFFERENTIAL语句或者"
  变过的数据和索引页。
  事务日志备份
  Microsoft SQL Server中的事务日志有一个独立的数据库。该数据库仅在备份或者被删除
  Server 7.0中的缺省设置是事务日志自动增长,直到它用完了所有的可用空间或者达到其
  当事务日志过满时,它会生成一个错误并且阻止任何的数据修改,直到该日志被备份或者
  据库不会受到影响。可以用BACKUP LOG语句或者"备份向导"进行事务日志备份。
  文件或者文件组备份
  SQL Server可以备份文件或者文件组。欲知详情,请参看SQL Server联机图书。
  备份可以在数据库正在使用的时候进行,这样就可以使那些必须不断运行的系统进行备份
  的备份过程和数据结构已经大大的改进,可以使备份在对事务吞吐量影响最小的情况下达
  率。
  Oracle和SQL Server都需要一个特殊的日志文件格式。在SQL Server中,这些叫做备份设
   Server Enterprise Manager、Transact-SQL的sp_addumpdevice存储程序或者等价的
  虽然备份可以通过手工操作进行,但是建议你使用SQL Server Enterprise Manager和/
  划向导"进行定期的备份,或者基于数据库活动进行备份。
  应用事务日志备份和/或者微分备份,一个数据库可以按时储存在一个完全备份数据库(
  上。数据库使用备份中包含的信息恢复数据。可以用SQL Server Enterprise Manager、
  RESTORE DATABASE)或者SQL-DMO进行恢复。
  就像你可以关掉Oracle存档器以跳过备份一样,在Microsoft SQL Server中,db_owner组
  事务日志在检查点发生的时候抹去目录。可以用SQL Server Enterprise Manager(删除
  Transact-SQL(sp_dboption存储过程)或者SQL-DMO来完成。
  网络
  Oracle SQL*Net支持Oracle数据库和其客户端的网络连接。它们通过透明网络层数据流协
  允许用户运行许多不同的网络协议,而不需要编写任何特殊的代码。SQL*Net未包含在核
  产品中。
  在Microsoft SQL Server中,Net库(网络库)支持客户端和服务器的连接,它们通过列
  信。这使得可以同时和运行名字管道(Named Pipes)、TCP/IP套接字或者其他交互处理
   Communication、IPC)的客户端连接。SQL Server CD-ROM包含了所有的客户端Net库,
  产品了。
  SQL Server Net库选项可以在安装后修改。客户端网络工具为运行Windows NT、Windows
  98的客户端配置缺省的Net库和服务器连接信息。除非在ODBC数据源的安装过程中改变或
  显式的标明,所有的ODBC客户端也使用同样的Net库和服务器连接信息。欲了解关于Net库
  看SQL Server联机手册。
  数据库安全性和角色(Database Security and Roles)
  为了把你的Oracle应用程序完整的移植到Microsoft SQL Server 7.0上,你需要明白SQL
  数据库的安全性和角色的。
  登录账号
  登录账号允许一个用户访问SQL Server数据或者管理选项。登录账号允许用户仅仅是登录
  且显示那些可以让访客(guest)访问的数据库。(guest账号不是缺省设置的,必须创
  SQL Server提供了两种类型的登录安全性。Windows NT验证模式(也称为集成的)和SQL
  也称为标准的)。SQL Server 7.0还支持标准的和集成的安全性的联合使用,称为混合的
  Windows NT验证模式在检验登录连接时使用Windows NT内建的安全机制,并且依赖用户的
  任。用户不需要为SQL Server输入登录ID和口令--其登录信息直接从网络连接上截取。当
  条目就被写入syslogins表,并且在Windows NT和SQL Server之间加以验证。这种方式叫
  原理同两台Windows NT服务器之间的可信关系是一样的。此功能同Oracle中用于用户账号
  EXTERNALLY选项是类似的。
  SQL Server验证模式在用户请求访问SQL Server时要求用户输入登录ID和口令。这种方式
  此功能同Oracle中用于用户账号的IDENTIFIED BY PASSWORD选项是类似的。使用标准安全
  供用户访问SQL Server数据库引擎的能力,不允许用户访问用户数据库。
  欲了解关于安全机制的更多信息,请参看SQL Server联机手册。
  组、角色和许可(Groups, roles, and permissions)
  Microsoft SQL Server和Oracle都使用许可来加强数据库安全性。SQL Server用语句级的
  的数据库对象的能力。(同Oracle一样)
  SQL Server还提供了对象级的许可。像Oracle一样,对象级所有权是分配给对象的创建者
  在其他用户可以访问对象之前必须给予他们对象级的许可。sysadmin 固定服务器角色、
  库角色、或者db_securityadmin 固定数据库角色的成员同样可以给予其他用户对某个用
  SQL Server语句级和对象级的许可可以直接赋予数据库用户账号。但是,通常更简单的方
  色管理员许可。SQL Server角色用来赋予或者撤消数据库用户组的特权(同Oracle角色非
  Roles)是一个带有特殊数据库的数据库对象。每次安装都有一些固定的服务器角色,这
  工作。一个固定服务器角色的例子是sysadmin。Windows NT组也可以作为SQL Server登录
  一样。许可可以赋予一个Windows NT组或者一个Windows NT用户。
  一个数据库可以有任意数量的角色或者Windows NT组。缺省的public角色总是可以在任何
  这些角色不能被清除。public角色的功能很像Oracle中的PUBLIC账号。每个数据库用户都
  员。在public角色之外,一个数据库用户还可以是任意数量角色的成员。Windows NT用户
  数量角色的成员,同样,他们也是public角色的成员。
  数据库用户和Guest账号(Database users and the guest account)
  在Microsoft SQL Server中,一个用户登录账号必须被授权使用一个数据库和它的对象。
  面方法中的一种来访问数据库:
  登录账号可以被设定为数据库用户。
  登录账号可以在数据库中使用访客(Guest)账号。
  一个Windows NT组登录可以被映射为一个数据库角色。作为该组成员的单个Windows NT账
  据库上。
  db_owner或者db_accessadmin角色或者sysadmin固定服务器角色的成员可以创建数据库用
  账号可以包含一些参数:SQL Server登录ID,数据库用户名(可选)、以及一个角色名(
  户名不一定要和用户登录ID一样。如果未提供一个数据库用户名,则用户的登录ID和数据
  的。如果未提供一个角色名,则该数据库用户就仅是public角色的成员。在创建了数据库
  以根据需要分配任意的角色。db_owner或者db_accessadmin角色的成员也可以创建一个
  号允许任意有效的SQL Server
  登录账号访问一个数据库,甚至不需要有数据库用户账号。缺省情况下,guest账号继承
  的特权;但是,这些特权可以修改为多于或者少于public账号的特权。
  一个Windows NT用户或者一个组的账号可以被赋予访问数据库的权利,就像SQL Server登
  如果一个Windows NT组的一个成员连接数据库,该用户会收到分配给这个组的许可。如果
  Windows NT组的成员,则他会收到所有这些组对数据库的权限的集合。
  Sysadmin角色(The sysadmin role)
  Microsoft SQL Server sysadmin固定服务器角色中的成员拥有与Oracle DBA组中的成员
   Server 7.0中,如果SQL Server是安装在一台Windows NT计算机上,那么以sa SQL
  账号缺省为该角色的成员,也就是本地Administrator组中的成员。一个sysadmin角色中
  删除Windows NT用户和组,以及SQL Server登录账号。典型的该角色中的成员有以下职责
  安装SQL Server。
  配置服务器和客户端。
  创建数据库。*
  设立登录权限和用户许可。*
  将数据导入或者导出SQL Server数据库。*
  备份和恢复数据库。*
  执行和维护复制。
  安排无人值守的操作。*
  监视和调试SQL Server的性能。*
  诊断系统问题。
  *这些项目可以委派给其他安全性角色和用户。
  在SQL Server 7.0中,对于sysadmin固定服务器角色中的成员能干什么是没有限制的。因
  员可以通过一个特殊的SQL Server实例访问任何数据库、所有的对象(包括数据)。像一
  有一些命令和系统程序是只有sysadmin角色中的成员才能使用的。
  db_owner角色
  虽然Microsoft SQL Server数据库在使用上和Oracle表空间很相似,但是它们在管理上是
  Server数据库都是一个自持的管理域。每个数据库都标明了数据库所有者(dbo)。该用
  数据库角色的成员。其他用户也可以是db_owner角色的成员。该角色中的所有成员都可以
  相关的管理任务。(不象在Oracle中,DBA管理所有数据库的管理任务)。这些管理任务
  管理数据库访问。
  修改数据库设置(只读,单用户,等等)。
  备份和恢复数据库目录。
  授予和取消数据库许可。
  创建和删除数据库对象。
  db_owner角色中的成员可以在他们的数据库上做任何事情。分配给该角色的大多数权利被
  库角色,或者也可以赋予数据库用户。在数据库上行使db_owner特权并不需要赋予
sysadmin服务器范围特权。



Copyright © 2004 wanxu.com All Rights Reserved