Oracle 数据库向 MS SQL Server 7.0 的迁移(1)
程序开发人员所写的。文中讲述了成功地进行转换所需要的工具、过程和技巧。并突出强调了
创建高性能、高并发性 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 的
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 提供一致的应用程序编程接口
(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
此外,通过编写 SQL 语句使用数据库优化程序也是通常的做法。在 Oracle 中用来提高
性能的技巧和方法,在 SQL Server 中并不一定最好。ODBC 接口无法将技巧从一个 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 的“桥梁”,对现用的各种
本文组织结构
为了帮助您实现从 Oracle 向 SQL Server 的逐步迁移,每节都包括一个 Oracle 7.3 和
Microsoft SQL 7.0 之间相关差异的概述。此外,还包括转换时要考虑的因素、SQL
体系结构和术语
要成功地迁移,开始之前应该了解与 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 数据库做重大修改后,应对该数据库进行备份以防止数据库出
现故障,这一点非常重要。数据库管理员也可以镜像构成 master 数据库的文件。
Oracle RDBMS 由表空间组成,而表空间又是由数据文件组成的。表空间数据文件被格式
化为称为“块”的内部单元。块的大小是 DBA 在 Oracle 数据库首次创建时设定的,其范围
从 512 到 8192 字节。在 Oracle 表空间中创建一个对象时,用户用称为“扩展盘区”的单
位定义其大小(初始扩展盘区、下一扩展盘区、最小扩展盘区和最大扩展盘区)。Oracle 扩
在数据库一级中,Microsoft SQL Server 使用文件组来控制表和索引的物理存储。文件
组是一个或多个文件的逻辑容器,文件组中包含的数据按比例填充到所有属于该组的文件中。
如果没有定义和使用文件组,数据库对象就会被放在一个默认文件组中,该文件组是数据
把大型表分布在多个文件上,以提高 I/O 吞吐量。
把索引存储在不同的文件上,而不是它们各自的表上,从而进一步提高了 I/O 吞吐量和
将 text、ntext、image 列(大对象)从表中存储到不同的文件上。
把数据库对象放在特定的磁盘上。
备份和恢复文件组中单个表或一组表。
SQL Server 将文件格式化为称为“页”的内部单元。页大小是固定的,为 8192 字节
(8 KB)。扩展盘区由页组成,其大小也是固定的,由 8 个连续的页组成。在 SQL Server 数
据库中创建表或索引时,会自动给其分配一个页。与分配一个整个扩展盘区相比,它可更有效
对于大多数 Microsoft SQL Server 安装来说,不需要 Oracle 类型的段。相反,SQL
Server 可以使用基于硬件的 RAID 或基于 Windows NT 软件的 RAID,更好地分布数据或将
数据条带化。基于 Windows NT 软件的 RAID 或基于硬件的 RAID 可以设定条带集,它包括多
个磁盘驱动器,看起来就像一个逻辑驱动器一样。如果数据库文件在此条带集上创建,磁盘子
系统就负责把 I/O 负载分布到多个磁盘上。建议管理员使用 RAID,把数据分布到多个物理
SQL Server 推荐的 RAID 配置是 RAID 1(镜像)或 RAID 5(带有一个额外的奇偶校验
驱动器的条带集,用作冗余)。也建议使用 RAID 10(带有奇偶校验的条带集的镜像),但是
它比前两种配置昂贵得多。条带集非常适于分布数据库文件上常常随机产生的 I/O。
如果不能选择 RAID,文件组则是一个有吸引力的替代选择,它提供与 RAID 相同的一些
优点。此外,对于可能跨越多个物理 RAID 阵列的大型数据库,文件组是一个很吸引人的方法
,它以一种可控的方式,将 I/O 进一步分布到多个 RAID 阵列上。
对于有序 I/O,必须优化事务日志文件,并加以保存,防止单点失败。因此,对于事务日
志,建议使用 RAID 1(镜像)。这个驱动器的大小至少要和联机重做日志和回滚段表空间的
总计大小一样。应创建一个或多个日志文件,来占用该逻辑驱动器上定义的所有空间。与存储
在文件组中的数据不同,事务日志项目总是按顺序地写入,并且不是按比例填充的。
有关 RAID 的详细信息,请参见 SQL Server Books Online、Windows NT Server 文档和
每次启动时,Oracle RDBMS 执行自动恢复。它检验表空间文件的内容是否与联机重做日
志文件一致。如果不一致,Oracle 将联机重做日志文件内容应用到表空间文件(前滚),并
删除回滚段中发现的任何未提交的事务(回滚)。如果 Oracle 不能从联机重做日志文件中得
到它所需要的信息,它就会查询存档重做日志文件。
每次启动时,Microsoft SQL Server 7.0 还通过检查系统中的每个数据库,进行自动数
据恢复。它首先检查 master 数据库,然后启动恢复系统中所有其它数据库的线程。对于每个
SQL Server 数据库,自动恢复机制均检查事务日志。如果事务日志包含任何未提交的事务,
该事务被回滚。然后,恢复机制在事务日志中,查找已提交但还未写到数据库的事务。如果找
每个 SQL Server 事务日志均有 Oracle 回滚段与 Oracle 联机重做日志的组合功能。每
个数据库都有自已的事务日志,它记录了对数据库所作的全部更改,并且由数据库的所有用户
共享。当一个事务开始且发生数据修改时,就会在日志中记录一个 BEGIN TRANSACTION 事件
(以及修改事件)。在自动故障恢复过程中,这个事件用于确定事务的起始点。在收到每个数
据修改语句时,先将更改写入事务日志,然后再写入数据库。有关详细信息,请参见本章后面
SQL Server 有一个自动检查点机制,确保完成的事务被定期地从 SQL Server 磁盘缓存
写入事务日志文件。检查点功能将自上一个检查点之后修改过的任何已被缓存的页面写入数据
库。在数据库上对这些被缓存过的页面(称为“脏页”)标出检查点,以确保所有完成的事务
均被写到磁盘中。这个过程缩短了从系统故障(如停电)进行恢复所用的时间。通过使用
SQL Server Enterprise Manager 或 Transact-SQL(sp_configure 系统存储过程)修改恢复
Microsoft SQL Server 给备份数据提供了以下几个选项:
完全数据库备份
要进行完全数据库备份,请使用 BACKUP DATABASE 语句或备份向导。
差异备份
当完成完全数据库备份后,使用 BACKUP DATABASE WITH DIFFERENTIAL 语句或备份向导
事务日志备份
Microsoft SQL Server 中的事务日志与各自数据库关联。在备份或被截断之前,事务日
志都是不断填充的。SQL Server 7.0 的默认配置是,事务日志自动增长,直到用尽了所有磁
盘空间或达到最大配置尺寸为止。当事务日志变得太“满”时,它就会产生一个错误,并且在
备份或截断之前,禁止对数据进一步修改。其它数据库不受影响。可以使用 BACKUP LOG 或备
文件或文件组备份
SQL Server 可以备份文件或文件组。有关详细信息,请参见 SQL Server Books Online
可以在数据库使用过程中对它进行备份,这样就可以对必须连续运行的系统进行备份。
SQL Server 7.0 的备份处理和内部数据结构已进行了改进,这样,可将备份的数据传输率提
高到最大,同时对事务吞吐量的影响降至最小。
Oracle 和 SQL Server 均需要特定的日志文件格式。在 SQL Server 中,这些文件称为
备份设备,它们是使用 SQL Server Enterprise Manager、Transact-SQL sp_addumpdevice
存储过程或相应的 SQL-DMO 命令创建的。
尽管可以手动进行备份,但是,建议使用 SQL Server Enterprise Manager 和/或
Database Maintenance Plan Wizard 计划定期备份或基于数据库活动的备份。
通过在完全数据库备份(设备)中应用事务日志备份和/或差异备份,可以将数据库恢复
到某个时点。数据库恢复使用备份中包含的信息来覆盖数据。可以使用 SQL Server
Enterprise Manager、Transact-SQL (RESTORE DATABASE) 或 SQL-DMO 进行恢复。
正如可以关闭 Oracle 归档文件来覆盖自动备份一样,在 Microsoft SQL Server 中,
db_owner 固定数据库角色的成员可以在每次出现检查点时,强制事务日志清除其内容。这一
操作可以使用 SQL Server Enterprise Manager(在检查点处截断日志)、Transact-SQL(
sp_dboption 存储过程)或 SQL-DMO 来完成。
Oracle SQL*Net 支持 Oracle 数据库服务器及其客户之间的网络连接。它使用透明网络
底层 (TNS) 数据流协议进行通信,并允许用户运行多个不同的网络协议,而不必编写专用的
有了 Microsoft SQL Server,Net-Libraries(网络库)通过使用表格格式数据流
(TDS) 协议,支持客户和服务器之间的网络连接。它们允许同时连接运行命名管道、TCP/IP
套接字或其它进程间通信 (IPC) 机制的客户。SQL Server CD-ROM 包括所有的客户
Net-Libraries,因此不需要再另行购买。
SQL Server Net-Library 选项可在安装后进行更改。客户网络实用工具为运行
Windows NT、Windows 95 或 Windows 98 操作系统的客户配置默认的 Net-Library 和服务器
连接信息。除非在 ODBC 数据源配置过程中更改,或在 ODBC 连接字符串中明确写明,所有的
ODBC 客户应用程序均使用相同的默认 Net-Library 和服务器连接信息。有关
Net-Libraries 的详细信息,请参见 SQL Server Books Online。
要将 Oracle 应用程序完全迁移到 Microsoft SQL Server 7.0,必须了解 SQL Server
登录帐户
登录帐户允许用户访问 SQL Server 数据或管理选项。登录帐户只允许用户登录到 SQL
Server,并查看允许 guest(来宾)访问的数据库。(guest 帐户不是默认建立的,必须单独
SQL Server 提供两种类型的登录安全性:Windows NT 身份验证模式(也称为集成模式
)和 SQL Server 身份验证模式(也称为标准模式)。SQL Server 7.0 也支持标准和集成安
验证登录连接时,Windows NT 身份验证模式使用 Windows NT 内的安全机制,并且依赖
用户的 Windows NT 安全凭据。用户不需要输入 SQL Server 的登录 ID 或密码 - 他们的登
录信息直接从网络连接中获取。此时,一个条目被写入 syslogin 表,并在 Windows NT 和
SQL Server 之间进行验证。这称为一个信任连接,就像两个 Windows NT 服务器之间的信任
关系一样。它与 Oracle 用户帐户相关的 IDENTIFIED EXTERNALLY 选项作用相似。
SQL Server 身份验证模式要求,用户在请求访问 SQL Server 时,输入登录 ID 和密码
。这称为非信任连接。它与 Oracle 用户帐户相关的 IDENTIFIED BY PASSWORD 选项作用类似
。使用标准安全模型,登录过程只提供对 SQL Server 数据库引擎的访问,而不提供对用户数
有关这些安全机制的详细信息,请参见 SQL Server Books Online。
组、角色和权限
Microsoft SQL Server 和 Oracle 均使用权限,来实施数据库安全性。SQL Server 语
句级权限用于限制创建新的数据库对象(类似于 Oracle 系统级权限)。
SQL Server 还提供对象级权限。与 Oracle 一样,对象级所有权被授予对象的创建者,
并且不能被转让。在其他数据库用户访问对象前,必须给他们授予对象级权限。sysadmin 固
定服务器角色、db_owner 固定数据库角色或 db_securityadmin 固定数据库角色的成员也可
以将一个用户对象上的权限授予其他用户。
可以将 SQL Server 语句级和对象级权限直接授予数据库用户帐户。而管理数据库角色的
权限通常要简单得多。SQL Server 角色用于授予或撤销一组数据库用户的权限(与 Oracle
角色非常相似)。角色是与特定数据库相关的数据库对象。对于每种安装,均有相关的专有固
定服务器角色,可用于整个数据库。固定服务器角色的一个例子是 sysadmin。当 SQL
Server 登录时,可以添增 Windows NT 组或数据库用户。可以给 Windows NT 组或
数据库可以有任意数量的角色或 Windows NT 组。在每个数据库中,均可找到默认角色
public,并且该角色不能被删除。public 角色和 Oracle 中 PUBLIC 帐户的作用相似。每个
数据库用户始终是 public 角色的一个成员。除了 public 角色之外,数据库用户还可以是任
何数量角色的成员。Windows NT 用户和组也可以是任何数量角色的成员,并且始终是
数据库用户和 guest 帐户
在 Microsoft SQL Server 中,要使用数据库及其对象,用户登录帐户必须被授权。登录
登录帐户可被指定为数据库用户。
登录帐户可使用数据库中的 guest 帐户。
可以将 Windows NT 组登录映射为一个数据库角色。然后,作为该组成员的各 Windows
db_owner、db_accessadmin 角色,或 sysadmin 固定服务器角色的成员创建数据库用户
帐户角色。帐户可以包括以下几个参数:SQL Server 登录 ID、数据库用户名(可选)和最多
一个角色名(可选)。数据库用户名不需和用户的登录 ID 相同。如果没有提供数据库用户名
,则用户的登录 ID 和数据库用户名是相同的。如果没有提供角色名,则数据库用户只是
public 角色的成员。创建数据库用户之后,可根据需要赋予该用户相应的角色。
db_owner 或 db_accessadmin 角色的成员还可以创建 guest 帐户。guest 帐户允许任
何有效的 SQL Server 登录帐户访问数据库,即便没有数据库用户帐户也可以。默认情况下,
guest 帐户继承授予 public 角色的任何权限;但是,这些权限可以更改,使其高于或低于
与 SQL Server 登录一样,Windows NT 用户帐户或组帐户可被授权访问数据库。当作为
组成员的 Windows NT 用户连接到该数据库时,此用户就获得授予 Windows NT 组的权限。如
果他是多个 Windows NT 组(已授权访问数据库)的成员,则该用户可收到所有这些组的组合
sysadmin 角色
Microsoft SQL Server sysadmin 固定服务器角色成员的权限与 Oracle DBA 的权限相似
。在 SQL Server 7.0 中,默认情况下,sa SQL Server 身份验证模式登录帐户是该角色的成
员;这就如同当 SQL Server 安装在 Windows NT 计算机上,它就是本地 Administrators 组
成员一样。 sysadmin 角色的成员可以添加或删除 Windows NT 用户和组,以及 SQL Server
安装 SQL Server。
配置服务器和客户。
创建数据库。*
设置登录权限和用户权限。*
向 SQL Server 数据库导入数据和从中导出数据。*
备份和恢复数据库。*
实现和维护复制。
计划无值守操作。*
监视和优化 SQL Server 性能。*
分析系统问题。
*这些项目可以委派给其他安全角色或用户。
在 SQL Server 7.0 中,没有对 sysadmin 固定服务器角色成员的权限进行限制。因此,
该角色的成员可以访问 SQL Server 特定实例上的任何数据库及其所有对象(包括数据)。与
Oracle DBA 一样,有一些命令和系统过程,只有 sysadmin 角色的成员可以使用。
db_owner 角色
尽管在使用上,Microsoft SQL Server 数据库与 Oracle 表空间类似,但各个的管理方
式不同。每个 SQL Server 数据库都是一个自包含的管理域。每个数据库均被指派一个数据库
所有者 (dbo)。该用户始终是 db_owner 固定数据库角色的一个成员。其他用户也可以是
db_owner 角色的成员。作为该角色成员的任何用户,都有能力管理与其数据库有关的管理任
务(Oracle 则不同,一个 DBA 可管理所有表空间的管理任务)。这些任务包括:
管理数据库访问。
更改数据库选项(只读、单用户等等)。
备份和恢复数据库内容。
授予和撤销数据库权限。
创建和删除数据库对象。
db_owner 角色的成员在其数据库中具有所有权限。授予该角色的大多数权限可以分给几
个固定数据库角色,或被授予数据库用户。要在数据库中拥有 db_owner 权限,不需要有服务
安装和配置 Microsoft SQL Server
搞清了 Oracle 和 SQL Server 之间基本的结构差异之后,就可以开始进行迁移过程的第
使用基于 Windows NT 软件的 RAID 或基于硬件的 RAID 5,创建一个可容纳所有数据的
逻辑驱动器。通过计算 Oracle 系统、临时表空间和应用程序表空间所使用的全部文件空间,
使用基于 Windows NT 软件的 RAID 或基于硬件的 RAID 1,来创建用于存放事务日志的
第二个逻辑驱动器。此驱动器大小应至少和联机重做与回滚段表空间之和一样大。
使用 SQL Server Enterprise Manager,创建一个与 Oracle 应用程序表空间名称相同的
数据库。(示例应用程序使用的数据库名称为 USER_DB。)将数据和事务日志的文件位置分别
指定为步骤 1 和 2 创建的磁盘。如果使用多个 Oracle 表空间,不必甚至不建议创建多个
SQL Server 数据库。RAID 会为您分布数据。
创建 SQL Server 登录帐户:
USE MASTER
EXEC SP_ADDLOGIN STUDENT_ADMIN, STUDENT_ADMIN
EXEC SP_ADDLOGIN DEPT_ADMIN, DEPT_ADMIN
EXEC SP_ADDLOGIN ENDUSER1, ENDUSER1
GO
向数据库中添加角色:
USE USER_DB
EXEC SP_ADDROLE DATA_ADMIN
EXEC SP_ADDROLE USER_LOGON
GO
给角色授予权限:
GRANT CREATE TABLE, CREATE TRIGGER, CREATE VIEW,
CREATE PROCEDURE TO DATA_ADMIN
GO
把登录帐户添加为数据库用户帐户:
EXEC SP_ADDUSER ENDUSER1, ENDUSER1, USER_LOGON
EXEC SP_ADDUSER DEPT_ADMIN, DEPT_ADMIN, DATA_ADMIN
EXEC SP_ADDUSER STUDENT_ADMIN, STUDENT_ADMIN, DATA_ADMIN
GO
此插图给出了此步骤完成后的 SQL Server 和 Oracle 环境。
定义数据库对象
Oracle 数据库对象(表、视图和索引)可以很方便地迁移到 Microsoft SQL Server,
因为每种 RDBMS 都严格遵循 SQL-92 标准,该标准是一个关于对象定义的标准。将 Oracle
SQL 表、索引和视图定义转换为 SQL Server 表、索引和视图定义,只需要进行相对简单的语
法更改即可。下表着重阐述了,Oracle 和 Microsoft SQL Server 数据库对象之间的一些差
异。
假定您从用来创建数据库对象的 Oracle SQL 脚本或程序入手。只要复制这个脚本或程序
,并进行下列修改即可。每个更改均在本节的其它部分进行了讨论。该例取自脚本示例程序脚
1、确保数据库对象标识符符合 Microsoft SQL Server 命名规则。可能只需要更改索引
2、修改数据存储参数,使之用于 SQL Server。如果使用 RAID,则不需要存储参数。
3、修改 Oracle 约束定义,使之用于 SQL。如有必要,则创建触发器,以支持外键
DELETE CASCADE 语句。如果表跨几个数据库,则使用触发器强制外键关系。
4、修改 CREATE INDEX 语句,以使用聚集索引。
5、使用“数据转换服务”,创建新的 CREATE TABLE 语句。检查该语句,注意 Oracle
6、删除所有 CREATE SEQUENCE 语句。在 CREATE TABLE 或 ALTER TABLE 语句中,使用
7、如有必要,修改 CREATE VIEW 语句。
8、删除任何对同义词的引用。
9、评估 Microsoft SQL Server 临时表的使用,及其在应用程序中的用途。
10、把 Oracle 的所有 CREATE TABLEUAS SELECT 命令改成 SQL Server 的
11、评估用户定义的规则、数据类型和默认值的潜在用途。
下面图表比较了,Oracle 和 Microsoft SQL Server 处理对象标识符的方式。在大多数
情况下,向 SQL Server 迁移时,不需要更改对象名称。
当访问 Oracle 用户帐户中的表时,仅按其不合格的名称来选定它。访问其它 Oracle 架
构中的表时,在表名称前加上架构名称和一个英文句点 (.)。Oracle 同义词可提供其它的位
当 Microsoft SQL Server 引用表时,使用了另一套命名规则。因为 SQL Server 登录帐
户可以在多个数据库中使用同一名称创建表,所以可使用下列规则访问表和视图:
[[database_name.]owner_name.]table_name
以下是命名 Microsoft SQL Server 表和视图的指导原则:
使用数据库名和用户名是可选的。当只按名称来引用表时(例如,STUDENT),SQL
Server 在当前数据库的当前用户帐户中查找该表。如果没有找到,它就会在该数据库中查找
保留用户名 dbo 拥有的相同名称的一个对象。在数据库的用户帐户中,表名称必须唯一。
一个 SQL Server 登录帐户可在多个数据库中拥有名称相同的表。例如,ENDUSER1 帐户
拥有下列数据库对象:USER_DB.ENDUSER1.STUDENT 和 OTHER_DB.ENDUSER1.STUDENT。限定符
是数据库用户名,而不是 SQL Server 登录名,因为它们并不一定相同。
同时,这些数据库中的其他用户可以拥有相同名称的对象:
USER_DB.DBO.STUDENT
USER_DB.DEPT_ADMIN.STUDENT
USER_DB.STUDENT_ADMIN.STUDENT
OTHER_DB.DBO.STUDENT
因此,建议把所有者名称作为数据库对象引用的一部分。如果应用程序有多个数据库,建
议把数据库名称也作为引用的一部分。如果查询跨多个服务器,也将服务器名称加到引用中。
每个 SQL Server 连接都有一个当前的数据库上下文,它是在登录时使用 USE 语句设定
一个用户,使用 ENDUSER1 帐户,登录到 USER_DB 数据库。用户请求 STUDENT 表。SQL
Server 查找 ENDUSER1.STUDENT 表。如果找到该表,则 SQL Server 在
USER_DB.ENDUSER1.STUDENT 上执行请求的数据库操作。如果在 ENDUSER1 数据库帐户中没有
找到该表,SQL Server 则在此数据库的 dbo 帐户中查找 USER_DB.DBO.STUDENT。如果该表仍
没有找到,SQL Server 就会返回一个错误信息,指出该表不存在。
如果另一个用户,例如 DEPT_ADMIN,拥有这个表,表名称前面一定加上数据库用户的名
称( DEPT_ADMIN.STUDENT)。否则,数据库名称默认为当前在上下文中的数据库。
如果引用的表在另一个数据库中,该数据库名称必须用作引用的一部分。例如,在
OTHERDB 数据库中,要访问 ENDUSER1 拥有的 STUDENT 表时,就要使用
可用两个英文句点将数据库和表的名称分隔开,省略对象的所有者名称。例如,如果应用
程序引用 STUDENT_DB..STUDENT,SQL Server 进行如下查询:
STUDENT_DB.current_user.STUDENT
STUDENT_DB.DBO.STUDENT
如果用户一次只使用一个数据库,在对象的引用中省略数据库名称,这样,在其它数据库
中使用该应用程序就变得简单了。所有对象引用隐式访问当前使用的数据库。如果在同一服务
器上,要维护一个测试数据库和一个生产数据库,这是很有用的。
因为 Oracle 和 SQL Server 均支持标识 RDBMS 对象的 SQL-92 初级规则,所以,
CREATE TABLE 语法是相似的。
Oracle 数据库对象名称不区分大小写。在 Microsoft SQL Server 中,取决所选的安装
SQL Server 第一次安装时,默认的排序次序是字典顺序、不区分大小写。(可以使用
SQL Server 安装程序,设定不同的配置。)因为 Oracle 对象名称始终是唯一的,所以,把
数据库对象迁移到 SQL Server,不应有任何问题。建议在 Oracle 和 SQL Server 中所有的
表和列名都使用大写,以避免用户在区分大小写的 SQL Server 上安装时出现问题。
有了 Microsoft SQL Server,使用 RAID 通常可简化数据库对象的存放。与 Oracle 索
引组织的表一样,SQL Server 聚集索引被集成到表的结构中。
在 Oracle 中,可以使用任何有效的 SELECT 命令,来创建表。Microsoft SQL Server
可提供相同的功能,但语法不同。
除非要应用的数据库已将 select into/bulkcopy 数据库配置选项设为 ture,否则,
SELECTUINTO 不会生效。(数据库所有者可以使用 SQL Server Enterprise Manager 或
Transact-SQL sp_dboption 系统存储过程设定该选项。)使用 sp_helpdb 系统存储过程检
查数据库的状态。如果 select into/bulkcopy 没有设为 true,仍可使用 SELECT 语句,将
SELECT * INTO #student_backup FROM user_db.student_admin.student
当使用 SELECT..INTO 语句创建新表时,引用完整性定义并没有被转移到新表中。
必须把 select into/bulkcopy 选项设为 true,这一需求可能使迁移过程变得复杂。如
果必须使用 SELECT 语句把数据复制到表中,先创建表,然后使用 INSERT INTOUSELECT 语句
加载表。Oracle 和 SQL Server 的语法是一致的,并且不需要设定任何数据库选项。
在 Microsoft SQL Server 中,用于创建视图的语法与 Oracle 相似。
SQL Server 的视图要求该表存在,并且视图所有者有权访问 SELECT 语句中所指定的表
默认情况下,并不检查视图上的数据修改语句,来确定受影响的行是否在视图的作用域内
。要检查所有的修改,则使用 WITH CHECK OPTION。WITH CHECK OPTION 的主要差异在于,
Oracle 将其定义为一个约束,而 SQL Server 没有。其它方面,两者是相同的。
定义视图时,Oracle 提供了 WITH READ ONLY 选项。通过将 SELECT 权限仅授予视图用
SQL Server 和 Oracle 视图均支持使用数学表达式、函数和常量表达式创建派生列。一
如果数据修改语句只影响一个基表,则可在多个视图上允许使用数据修改语句(INSERT
或 UPDATE)。在一个语句中,数据修改语句不能用于多于一个表。
视图中的 text 或 image 列不能使用 READTEXT 或 WRITETEXT。
不能使用 ORDER BY、COMPUTE、FOR BROWSE 或 COMPUTE BY 子句。
视图中不能使用 INTO 关键字。
当一个视图是由外部联接定义的,并使用该联接内表一个列上的限定条件进行查询时,
SQL Server 和 Oracle 给出的结果可能不同。在大多数情况下,Oracle 视图可以方便地转
成 SQL Server 视图。
Microsoft SQL Server 提供聚集和非聚集的索引结构。这些索引由页组成,页又构成称
为“B 树”的分支结构(类似于 Oracle B 树索引结构)。起始页(根级)指定了表中值的范
围。根级页的每个范围都指向另一页(决定节点),它包含的表值范围更窄。依次,这些决定
节点可以指向其它决定节点,进一步缩小搜索范围。分支结构的最终级别称为叶级。
聚集索引
在 Oracle 中,聚集索引实现为用索引组织的表。聚集索引与表物理地结合在一起。表和
索引共享同一存储区域。聚集索引按照索引的顺序物理地重排数据行,构成中间决定节点。索
引的叶级页包含实际的表数据。这种结构只允许每个表一个聚集索引。一旦在表上施加了
PRIMARY KEY 或 UNIQUE 约束,Microsoft SQL Server 就会自动为该表创建一个聚集索引。
主键
未被更新的列 使用 BETWEEN、>、>=、< 和 <= 之类的运算符,返回一个值的范围的查询,例如:
SELECT * FROM STUDENT WHERE GRAD_DATE
BETWEEN '1/1/97' AND '12/31/97'
返回大结果集的查询:
SELECT * FROM STUDENT WHERE LNAME = 'SMITH'
在排序操作(ORDER BY、GROUP BY)中使用的列。
例如,在 STUDENT 表上,主键 ssn 上加入一个非聚集索引可能是很有帮助的,在
lname、fname(姓、名)上可以创建聚集索引,因为这是将学生分组的常用方法。
将一个表上的活动进行分布,以防止出现“热点”。热点通常是由于多个用户使用升序键
对一个表插入造成的。这种应用场景通常用行级锁定来处理。
在 SQL Server 中,删除和重新创建聚集索引是重组表的一种常用技巧。使用这种方法,
可以很容易地保证,在磁盘上页是连续的,且可以在表上方便地重建一些可用空间。这与
SQL Server 聚集索引和 Oracle 聚集没有任何相同之处。Oracle 聚集是两个或多个表
的物理组合,这些表共享相同的数据块,并使用公共列作为聚集键。在 SQL Server 中,没有
原则上,在表上定义聚集索引可改善 SQL Server 性能和空间管理。如果不了解给定表的
查询或更新模式,可在主键上创建聚集索引。
下表给出了,摘自示例应用程序源代码。请注意 SQL Server 聚集索引的使用。
非聚集索引
在非聚集索引中,索引数据和表数据在物理上是分离的,且表中的行不按照索引的顺序存
储。可以把 Oracle 索引定义迁移到 Microsoft SQL Server 非聚集索引定义(如下面例子所
示)。但是,出于性能方面的考虑,可能希望选择给定表的一个索引,并把它创建为聚集索引
。
索引的语法和命名
在 Oracle 中,索引名在用户帐户中是唯一的。在 Microsoft SQL Server 中,索引名在
表名称中必须是唯一的,但在用户帐户或数据库中则不一定是唯一的。因此,在 SQL Server
中创建或删除索引时,必须指明表的名称和索引名称。此外,SQL Server DROP INDEX 语句可
以同时删除多个索引。