来源于:http://www.cnblogs.com/hiizsk/

由SQL SERVER 2008向ORACLE 11G迁移过程记录之一-表

使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(一)

使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(二)

使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(三)

使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(四)

使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(五)

最近在将项目由SQL SERVER 2008向ORACLE 11G迁移,以下简述迁移数据表过程。

  1. 产生数据库的脚本。在脚本生成向导中选择脚本选项中,设置ANSI填充FALSE、编写USE DATABASE脚本FALSE、编写扩展属性脚本FALSE、架构限定对象名称FALSE,为服务器版本编写脚本选择SQL SERVER 2008
  2. 生成到新文件或到新窗口后保存到文件,然后使用支持正则表达式的文本编辑器打开(建议使用EmEditor,否则可能下面某些正则表达式会稍有不同),使用查找替换功能依次如下操作(以下如未说明则都为使用正则表达式查找):
    1. 由于ORACLE的名称限定符是引号而非方括号,因此要将[和]替换成空字符串以去除。假如有使用关键字作为名称的,需要再单独处理了 
      查找:\[|\] 
      替换为:空字符串
    2. 去除SET ANSI_NULLS ONSET QUOTED_IDENTIFIER ON,因为ORACLE中不存在这些属性或不是这个名称,使用正则可以很方便的完成这个工作: 
      查找:SET ANSI_NULLS ON\nGO\nSET QUOTED_IDENTIFIER ON\nGO\n 
      替换为:空字符串。
    3. 替换所有的GO为;同样使用正则表达式来做: 
      查找:\nGO\n 
      替换为:;\n
    4. 注释掉IDENTITY(1,1),因为ORACLE中不支持这个关键字,相应的,为了实现自增数字的功能,需要建立一个SEQUENCE,然后在表上建立一个INSERT触发器,触发时往对应字段赋值为代替。后面我会写一个PYTHON脚本,根据这些注释生成所有的SEQUENCE和触发器脚本。 
      查找:(IDENTITY\(\d+,\d+\)) 
      替换为:/*\1*/
    5. 去除所有的“ ON PRIMARY”,“ TEXTIMAGE_ON PRIMARY” 
      查找:TEXTIMAGE_ON PRIMARY|ON PRIMARY 
      替换为:空字符串
    6. 去除所有的“ CLUSTERED ”、“ NONCLUSTERED ”、“WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)” 
      查找:((NON)*CLUSTERED)|(WITH \(PAD[^\)]+\)) 
      替换为:空字符串
    7. 主键语句中,去除ASC和DESC,注意别误伤视图语句中的相应字符串。 
      查找:( ASC| DESC)  注意字符前的空格,以免误伤标识符中的对应字符 
      替换为:空字符串
    8. 替换字段类型。因为SQL SERVER中的类型和ORACLE中大部分都不一样,因此基本上都需要替换掉。具体替换时建议按如下步骤(注意如果在标识符中没有关键字,那么在替换时勾选全字匹配即可,如果可能存在使用关键字当标识符的时候,那么,查找时使用正则表达式,在查找字符串前加上[ ]^1,表示查找字符串前存在并只存在1个空格,如原类型后必然有括号的,例如char/varchar之类,那么在查找字符串后加上\(,必然没有括号的加上[ ]^1,然后在替换字符串中根据前后是否有空格或括号,要依样加上,如int替换成number(10,0),使用正则时,查找字符串内填[ ]^1int[ ]^1,替换字符串内填 NUMBER(10,0) ,注意前后的空格,再如varchar替换成varchar2时,查找字符串填[ ]^1varhcar\(,替换字符串写 varchar2(,注意前面的空格和后面的括号。):
      1. varchar替换成varchar2
      2. nvarchar也是替换成varchar2,但是长度要乘2,所以这个要单独每种长度都独立替换
      3. 同样要乘2的还包括所有n开头的类型
      4. int替换成NUMBER(10,0)
      5. NUMERIC和DECIMAL替换成NUMBER
      6. smalldatetime和datetime替换成DATE
      7. text替换成CLOB
      8. image替换成BLOB
      9. 其它类型对应表如下:
          SQL SERVER ORACLE
        数字类型 DECIMAL[(P[,S])] NUMBER[(P[,S])]
        NUMERIC[(P[,S])] NUMBER[(P[,S])]
        FLOAT[(N)] NUMBER[(N)]
        FLOAT[(N)] NUMBER[(N)]
        INT NUMBER
        SMALLINT NUMBER
        TINYINT NUMBER
        MONEY NUMBER[19,4]
        SMALLMONEY NUMBER[19,4]
        字符类型 CHAR[(N)] CHAR[(N)]
        VARCHAR[(N)] VARCHAR2[(N)]
        NCHAR[(N)] CHAR[(N*2)]
        NVARCHAR[(N)] VARCHAR2[(N*2)]
        日期时间类型 DATETIME DATE
        SMALLDATETIME DATE
        其它 TEXT CLOB
        IMAGE BLOB
        BIT NUMBER(1)
        UNIQUEIDENTIFIER LONG RAW
    9. 替换默认值规则:
      1. 替换默认日期: 
        查找(普通非正则):(getdate()) 
        替换为:SYSDATE
      2. 数字默认值语法替换,把数字外的括号去除: 
        查找:( DEFAULT )\((\d+)\) 
        替换为:\1\2
      3. 替换默认值语法: 
        查找:ALTER TABLE (\w+) ADD\s+CONSTRAINT.+DEFAULT (.+) FOR (\w+); 
        替换为:alter table \1 modify \3 default \2;
    10. 去除外键语句中一些不支持的选项(在我的数据库中碰到的。应该不完整),以及,SQL SERVER生成的约束有时会先使用WITH NOCHECK创建约束后紧跟着将之启用,虽然可以用ORACLE对应的DISALBE和ENABLE选项替代,但感觉没有什么用,于是干脆把WITH NOCHECK去掉,同时却掉紧跟着的启用约束语句。具体如下: 
      查找:ON UPDATE CASCADE\n|\nNOT FOR REPLICATION|ALTER TABLE.+CHECK CONSTRAINT.+\n|WITH NOCHECK|WITH CHECK 
      替换为:空字符串
  3. 转换的过程中,应注意以下问题:
    1. 标识符长度不能超过30(包括表、约束、视图等等所有的标识标)
    2. varchar2的长度不能超过4000
  4. 好的,保存修改后的SQL脚本文件,现在可以给ORACLE执行了吗?等等,还有。。我们要生成IDENTITY的替代脚本!下面是PYTHON脚本代码,把它保存为文本文件,例如c:\convert.py中,然后,在CMD中执行 
    c:\>%path_to_python.exe% c:\convert.py [sql原文件路径] [生成的触发器和seqence的sql文件保存路径] 
    不过,这个脚本只支持一个表中存在一个IDENTITY字段的情况。:(

    #coding=utf-8 
    import sys 
    import re 
    #sys.setdefaultencoding('utf8') 
    orgfile=sys.argv[1] 
    newfile=sys.argv[2] 
    f=open(orgfile,'r') 
    fidentity=open(newfile,"w")

    line=f.read() 
    p=re.compile('CREATE TABLE ([^\(\n]+)[^;]+?(\S+) NUMBER\(10,0\)/\* IDENTITY\((\d+),(\d+)\)\*/',re.I|re.S|re.M) 
    mat=p.findall(line) 
    for item in mat: 
        seqname="SEQ_"+item[0] 
        triggername="TRI_"+item[0]+"_"+item[1]

    if len(seqname)>30: 
            seqname=seqname[0:29] 
        if len(triggername)>30: 
            triggername=triggername[0:29] 
            
        createseq="create sequence "+seqname+" increment by "+item[3]+" start with "+item[2]+";\n" 
        createseq=createseq+"CREATE OR REPLACE TRIGGER " + triggername +"\n\ 
        BEFORE INSERT ON "+item[0]+"\n\ 
        FOR EACH ROW\n\ 
        WHEN (new."+item[1]+" IS NULL)\n\ 
        BEGIN\n\ 
                Select "+seqname+".NEXTVAL INTO :NEW."+item[1]+"\n\ 
                FROM DUAL;\n\ 
        END;\n/\n" 
        fidentity.write(createseq) 
    fidentity.flush() 
    fidentity.close() 
    f.close()

  5. 最后,依次执行两个SQL脚本文件。
  6. 如果有错,那么真是太糟糕啦。根据错误提示,排错吧。 :(

SQL SERVER 2008向ORACLE 11G迁移示例的更多相关文章

  1. SQL Server 2008创建oracle链接服务器(心得)

    操作系统是32位的情况下,曾经没费太多时间创建好了到oracle的链接服务器.主要要点就是: 1.安装oracle精简客户端.当时我用的是版本比较低的“oracle9i310-客户端简化版”,安装好了 ...

  2. 通过SQL Server 2008 访问Oracle 10g

    原文地址:http://www.cnblogs.com/gnielee/archive/2010/09/07/access-oracle-from-sqlserver.html 之前写过一篇关于SQL ...

  3. SQL Server 2008 R2 Service Pack 3 已经发布

    微软SQL Server Product Team在9月26号官方博客宣布,Microsoft SQL Server 2008 R2 Service Pack 3 (SP3)正式发布了 .具体信息可以 ...

  4. 使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g

    ORACLE官方提供的Sql Developer自带的Oracle Migration Workbench. 什么是Oracle SQL Developer?在官方页面上,是这样介绍它的: Oracl ...

  5. [转]Using the Microsoft Connector for Oracle by Attunity with SQL Server 2008 Integration Services

    本文转自:http://technet.microsoft.com/en-us/library/ee470675(v=sql.100).aspx SQL Server Technical Articl ...

  6. SQL Server 2008通过LinkServer操作ORACLE

    时光荏苒~~ 最近项目有需求需要通过SQL Server2008中的数据自动更新到ORACLE中,其实,一开始肯定会想到触发器,因为可以保证实时性. 方案一: 首先,我很确定的一件事情就是MSSQL中 ...

  7. sql server 2008 r2 中的oracle发布使用笔记

    sql server 2008 r2 中的oracle发布功能,能够将oracle数据库作为发布服务器,将oracle中的数据自动同步到sql server 数据库中,在新建oracle发布前确保sq ...

  8. 使用SQL Database Migration Wizard把SQL Server 2008迁移到Windows Azure SQL Database

    本篇体验使用SQL Database Migration Wizard(SQLAzureMW)将SQL Server 2008数据库迁移到 Azure SQL Database.当然,SQLAzure ...

  9. 【SQL Server数据迁移】64位的机器:SQL Server中查询ORACLE的数据

    从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 .64位的机器和软件, 需要用不同的驱动程序来实现. 在64位的机 ...

随机推荐

  1. nodejs入门

    一.Nodejs介绍 简单的说 Node.js 就是运行在服务端的 JavaScript的代码解析器. 首先要清楚Node不是一个Web服务器,这十分重要.它本身并不能做任何事情.它无法像Apache ...

  2. UVALive 5058 Counting BST --组合数

    题意:排序二叉树按照数插入的顺序不同会出现不同的结构,现在要在1~m选n个数,使按顺序插入形成的结构与给出的结构相同,有多少种选法. 解法:先将给出的结构插入,构造出一棵排序二叉树,再dfs统计,首先 ...

  3. [No00003F]richtextbox实现拖放

    namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { Initialize ...

  4. [No000008]发工资不仅仅是让你写代码的

    这是我对团队每个新进员工说的第一件事情.这句话的意思是,我并不关心你是如何快速完成任务的,哪怕代码很差,只要它像救生艇通气门一样管用就行.这句话也是我最喜欢的座右铭之一. 这个说法其实很合理:我们的工 ...

  5. 模拟placeholder支持ie8以下处理了密码框只读的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. android edittext 去边框 去下划线

    EditText的background属性设置为@null就搞定了:android:background="@null"style属性倒是可加可不加 附原文:@SlumberMac ...

  7. 关于codeMirror插件使用的一个坑

    codeMirror插件可以做语法高亮渲染,但它操作过程是这样的:先从 textarea中读取值放到codemirror动态生成的div中,根据textarea中的换行个数确定行数,根据正则表达来高亮 ...

  8. PAT 1019. 数字黑洞 (20)

    给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有"数字黑洞&qu ...

  9. AlwaysOn Group Listener

    1.Listener是什么 Listener实际上是一个 VirtualNetworkName,客户端通过这个VNN来连接的具体的sqlserver实例 .Listener包含了DNS名称,port和 ...

  10. Android属性(property)机制

    1. 属性简介 Android里有很多属性(property),每个属性都有一个名称和值,他们都是字符串格式.这些属性定义了Android系统的一些公共系统属性.比如: [dalvik.vm.dexo ...