安装和配置Microsoft SQL Server
了解了Oracle和SQL Server之间基本结构上的差异以后你就可以开始进行移植过程的第一步了SQL Server
Query Analyzer将用来运行下面的脚本
使用Windows NT基于软件的RAID或者基于硬件的RAID第五级来创建一个足够放下你的所有数据的逻辑驱动器
对空间的估算可以通过计算被Oracle系统临时文件以及应用程序表空间占用的文件空间大小来进行
使用Windows NT基于软件的RAID或者基于硬件的RAID第一级创建一个第二逻辑驱动器来放事务日志该驱动
器的大小起码应该和在线恢复以及后滚表空间的总的大小一致
使用SQL Server Enterprise Manager创建一个和Oracle应用程序表空间名字一样的数据库(示例应用程
序使用的数据库名字叫做USER_DB)标明文件位置使它们分别和你在第一步以及第二步中为数据和事务创
建的磁盘位置一致如果你使用多个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 ENDUSER ENDUSER
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 ENDUSER ENDUSER USER_LOGON
EXEC SP_ADDUSER DEPT_ADMIN DEPT_ADMIN DATA_ADMIN
EXEC SP_ADDUSER STUDENT_ADMIN STUDENT_ADMIN DATA_ADMIN
GO
定义数据库对象
Oracle数据库对象(表视图和索引)可以很容易的移植到Microsoft SQL Server上这是因为两个数据
库都基本遵循SQL标准该标准承认对象定义把Oracle SQL的表索引和视图的定义转换为SQL Server
的表索引和视图的定义只需要做相对简单的语法改变下表指出了Oracle和Microsoft SQL Server之间的
数据库对象的某些不同之处
类别 Microsoft SQLServer Oracle
列数
行尺寸 byte 外加 byte用来指向每一个text或者image列 无限制 (每行只允许有一个long或者long
raw)
最大行数 无限制 无限制
BLOB类型存储 行中存储一个byte 指针数据存储在其他数据页 每表一个long或者long raw 必须在
行的结尾数据存储在行的同一个块里
分簇表索引 每表一个 每表一个(indexorganized tables)
未分簇的表索引 每表 无限制
在单一索引中的最大索引列数
索引中列值的最大长度 bytes ? block
表名约定 [[[server]database]owner]
table_name [schema]table_name
视图名约定 [[[server]database]owner]
table_name [schema]table_name
索引名约定 [[[server]database]owner]
table_name [schema]table_name
假设你是从一个Oracle脚本或者程序开始的该脚本或者程序用来创建你的数据库对象拷贝你的脚本或
者程序并且进行如下修改这些修改将在本部分的其他地方加以讨论该例子是从示例应用程序脚本
Oratablesql和Sstablesql中截取的
确保数据库对象标识遵循Microsoft SQL Server命名法则你可能只需要修改索引的名字
修改数据存储参数使之能在SQL Server下工作如果你使用RAID就不需要任何存储参数了
修改Oracle约束定义使之能在SQL Server中工作如果需要的话创建一个触发器以支持外部键DELETE
CASCADE语句如果表跨数据库的话使用触发器来增强外部键的关系
修改CREATE INDEX语句以利用分簇的索引
使用数据转换服务来创建新的CREATE TABLE语句回顾该语句注意Oracle数据类型是如何映射到SQL
Server数据类型上的
清除所有的CREATE SEQUENCE语句在CREATE TABLE或者ALTER TABLE语句中使用同等列来替换顺序的使用
如果需要的话修改CREATE VIEW语句
清除所有对同义字的引用
评估对Microsoft SQL Server临时表的使用和其在你的应用程序中的用处
把所有的Oracle的CREATE TABLE…AS SELECT命令改为SQL Server的SELECT…INTO语句
评估潜在的对用户定义规则数据类型和缺省的使用
数据对象标识符
下表比较了Oracle和Microsoft SQL Server是如何处理对象标识符的在许多情况下当移植到SQL
Server上时你不需要改变对象的名字
Oracle Microsoft SQL
字符长度
数据库名称最多个字符长度
数据库连接名称最多个字符长度 Unicode字符长度
临时表名称最多个字符
标识符的名称必须用字母包含文字数字的字符或者字符_ $ 和 #开头 标识符名称可以用字母
数字字符或者_开头实际上可以用任何字符开头
如果标识符用空格开头或者包含了不是_@#或者$的字符你必须用[](定界符)包围标识符名称
如果一个对象用下面这些字符开头
@ 则表明该对象是一个本地变量
# 则该对象是一个本地临时对象
## 则该对象是一个全局临时对象
表空间名必须唯一 数据库名必须唯一
标识符名在用户账号(计划Schema)范围内必须唯一 标识符名在数据库用户账号范围内必须唯一
列名在表和视图范围内必须唯一 列名在表和视图范围内必须唯一
索引名在用户账号(Schema)范围内必须唯一 索引名在数据库表名范围内必须唯一
修饰表名
当访问存在于你的用户账号中的表时该表可以简单的通过未经限制的表名来选中访问其他Oracle计划
中的表就需要把该计划的名字作为前缀加到表名上两者之间用点号()隔开Oracle同义字可以提供
更高的位置透明度
涉及到表时Microsoft SQL Server采用一种不同的方法因为一个SQL Server登录账号可以在多个数据
库中用同一个名字创建一个表所以采用下面的方法来访问表和视图[[数据库名字]所有者名字]表名]
用……访问一个表 Oracle Microsoft SQLServer
你的用户账号 SELECT *
FROM STUDENT SELECT * FROM USER_DBSTUDENT_
ADMINSTUDENT
其他模式(schema) SELECT * FROM STUDENT_ADMINSTUDENT SELECT * FROM OTHER_DBSTUDENT_
ADMINSTUDENT
这是一些为Microsoft SQL Server表和视图命名的指导方针
使用数据库名字和用户名字是可选的如果一个表只通过名字加以引用(例如STUDENT)SQL Server在
当前数据库中以当前用户帐号搜索该表如果没有找到就在数据库中寻找由dbo的保留用户名拥有的具有
同样名字的对象表名在同一个数据库中的同一个用户帐号下必须是唯一的
同一个SQL Server登录账号可以在多个数据库中拥有同样名字的表例如ENDUSER账号拥有下列数据库对
象USER_DBENDUSERSTUDENT和OTHER_DBENDUSERSTUDENT这里所加的限制是数据库用户名而不是SQL
Server登录名因为两者不一定要一样
同时这些数据库的其他用户可以有同样名字的对象
USER_DBDBOSTUDENT
USER_DBDEPT_ADMINSTUDENT
USER_DBSTUDENT_ADMINSTUDENT
OTHER_DBDBOSTUDENT
因此建议你在引用数据库对象时包含所有者的名字如果应用程序有多个数据库建议你再把数据库名字
也包含在引用中如果查询跨越多个服务器还要包括服务器名
SQL Server的每个连接都有一个当前数据库上下文这是在登录时用USE语句设置的例如假设有下面的场
景
一个用户使用ENDUSER账号登录到USER_DB数据库上用户请求STUDENT表SQL Server就查询ENDUSER
STUDENT表如果找到SQL Server就在USER_DBENDUSERSTUDENT表上做要求的数据库操作如果在
ENDUSER数据库账号下没有找到该表SQL Server就为该数据库以dbo账号搜寻USER_DBDBOSTUDENT如果
还是找不到该表SQL Server就返回一个错误消息指出该表不存在
如果另一个用户例如DEPT_ADMIN拥有该表则该表必须以数据库用户名作为前缀(DEPT_ADMINSTUDENT)
另外数据库名字缺省为在当前上下文中的数据库名字
如果被引用的表在另一个数据库中则数据库名必须作为引用的一部分例如要访问在OTHERDB数据库中由
ENDUSER拥有的表STUDENT就需要用OTHER_DBENDUSERSTUDENT来引用
可以在数据库和表名之间加两个点号来省略对象的所有者名例如如果应用程序引用STUDENT_DBSTUDENT
SQL Server就做如下搜