此次需要完成的目标是将库从SQLServer 完整的移植到Oracleg中包括表结构数据视图函数以及存储过程的移植移植主要基于Oracle的OMWB(Oracle Migration Workbench)来完成尽管OMWB能帮助完成大部分具备难度的工作但还是有很多工作量的事情需要在OMWB完成后来手工进行所以整个移植过程工作量看起来会非常大但是不是仅仅只有工作量的问题呢?我觉得不是写下这篇blog以便需要进行此项操作的同学以及给自己做个备忘
由于目前OMWB仅支持SQLServer根据官方网站的消息OMWB的下一版会推出对SQLServer 的支持所以在目前的情况下只能先把库从SQLServer 移植到SQLServer 这就是我们移植过程的第一步了
一SQLServer >SQLServer
一直以来版本要降级都是很困难的因为在新版本中必然会有些新的特性而如果刚好凑巧你使用到了这些特性的话在降级到低版本时就会碰到一些问题在经过几次的尝试后总结而言这个过程还是比较容易做的毕竟是同样的数据库再怎么样也不会出太大的问题不过也没有像将库从SQLServer 升级为SQLServer 那么简单整个移植过程这么进行
基于SQLServer 的数据导出将表结构和数据导入到SQLServer
这步中需要注意的是默认情况下SQLServer会将表和视图一起导入在这里不要选择视图否则导入到SQLServer 后有些视图会变成表选择需要导入的表后基本上这步不会出现什么问题可以完成表结构和数据的移植
基于SQLServer 的生成脚本将视图/函数/存储过程移植到SQLServer
这步需要慢慢来因为在视图/函数/存储过程中你可能使用到了一些SQLServer 的新特性如果碰到这样的情况只能是手工进行修改以使它完全符合SQLServer 的要求尽管在生成脚本时你可以选择生成的目标版本为SQLServer 但还是会有部分脚本执行是会出错的
在完成了SQLServer 到SQLServer 的移植后就可以基于OMWB来把库从SQLServer 移植到Oracle了这步尽管有工具还是会比较的麻烦总结如下
二SQLServer >Oracle g
关于如何基于OMWB将库从SQLServer 移植到Oracle g的操作步骤可参见此篇文档
op/omwb/
大家现在从oracle官方站下的话可能会找不到sqlserver 的插件包如果找不到的话可以从这里下载
我在这里要总结的是基于OMWB将库从SQLServer 移植到Oracle g后还需要手工做的一些事情不要指望OMWB能无缝的帮你把库从SQLServer移植到Oracle中银弹是不存在的因此我们需要做些手工的工作完成库的移植
移植表结构和数据可能会出现的问题
表中字段的默认值/主键/外键/索引移植不过去这些需要手工的进行补充
移植视图可能会出现的问题
移植过去的视图可能会出现各种语法错误的问题这需要手工的修正一般来说都是较为简单的错误
另外一种问题就是有些视图可能会无法移植过去这些视图就只能在对比OMWB的移植报告后找出来手工的进行移植了
移植函数/存储过程可能会出现的问题
移植过去的函数/存储过程中可能仍然会有不少的语法问题例如像SCOPE_IDENTITY()REPLICATEnewid()这些OMWB不知道该怎么处理的函数还有像返回Table类型的这种函数这些都只能在移植后手工的来进行纠正关于函数不同造成的语法错误的现象大家可以参看这篇文档来做SQLServer和Oracle函数的对照
?logID=
移植过去的函数/存储过程可能编译是没有问题也就是Oracle认为没有语法问题但执行起来却会报错像字符串相加经过OMWB移植后有些字符串相加会替换成||但是有些会遗漏这个时候也只能手工来纠正这些错误了
移植过去的函数/存储过程在执行过程中可能会出现某些表的主键值不能为空的现象造成这种现象的原因多数为在SQLServer中该字段的默认值定义的为IDENTITY但在Oracle中没法赋予这样的默认值只能在插入的sql语句中加上对于主键字段的赋值可采用sequence的方式来生成顺序号
移植过去的函数/存储过程中如果其中的查询语句是采用字符串的方式然后动态执行的话这个时候的查询语句就得手工修改为符合oracle的语法了因为OMWB在移植时是不会对字符串形式的查询语句来做处理的
部分函数/存储过程会由于OMWB确实无法处理造成移植不到oracle这个时候也必须参照OMWB的移植报告找出这些函数/存储过程来手工移植了
整个移植过程可能会碰到比上面所列出的更多的别的问题可以看出整个移植过程确实需要耗费不小的工作量但总体而言完成的难度并不高
其实真的是这样吗?当然不是就算你完成了上面的移植工作那也只能说表面看上去移植是完成了很有可能会出现这个存储过程语法等等都没有问题了但执行的效果和SQLServer就是不一样这是为什么呢?可能会是因为Oracle和SQLServer在并发控制事务机制上是不同的而这会影响到程序调用时的sql的编写存储过程的编写等等也就是说在上面的移植过程的工作完成后还得仔细检查现在的sql语句/函数/存储过程是否根据Oracle的机制达到了原来在SQLServer中期望的效果只有做到这步的效果是一样的才可以说移植过程完成了
最后顺带说的就是应该根据Oracle的机制来采用符合oracle优化原则的方法来优化表/视图/函数/存储过程如果不做这步的话从sqlserver移植到oracle估计意义也不大了当然这可以不列为移植过程的工作
总结差不多就是这样希望有类似经验的同学站出来说说自己碰到过的其他的问题或者说说更好的方法也欢迎将来进行此项工作的同学在得到新的经验后写出来给大家分享:)