因工作需求, 把數(shù)據(jù)庫從MSSQL移植到Oracle,一想起這個事情,難度就很大,在堅持下,終于完成了,重要的事情做了一些筆記。
1.移植前準(zhǔn)備
在移植前,需要安裝必需的各種軟件,如下:
(1).安裝好SQL server 2005的補丁包和SP2。
(2).安裝Oracle安裝包里的oracle客戶端瀏覽器(PL/SQL Developer)。(可以根據(jù)需要按照漢化補丁,漢化包不安裝也可)
(3).硬件要求:在Oracle數(shù)據(jù)庫所在的硬盤保持足夠剩余空間(至少有2GB的空間剩余);建議在啟用Oracle服務(wù)時機器的內(nèi)存不少于2GB。
沒有特別說明的情況下,本文的數(shù)據(jù)移植是針對普通的屬性數(shù)據(jù)。
2. 移植
2.1. 創(chuàng)建數(shù)據(jù)庫
打開Oracle中的Database Configuration Assistant進行數(shù)據(jù)庫的創(chuàng)建,如圖所示:
圖表 1 打開Database Configuration Assistant
進入Database Configuration Assistant后點擊“下一步”,然后出現(xiàn)如圖表2所示的界面,選擇“創(chuàng)建數(shù)據(jù)庫”后點擊“下一步”:
圖表 2 創(chuàng)建數(shù)據(jù)庫
如圖表3所示選擇第一個“一般用途”然后點擊下一步:
圖表 3 選擇模板
如圖標(biāo)2所示在創(chuàng)建數(shù)據(jù)庫過程中的第3步,在“全局?jǐn)?shù)據(jù)庫名”中輸入數(shù)據(jù)庫名稱,SID則會自動默認(rèn)為全局?jǐn)?shù)據(jù)庫名,然后點擊“下一步”;
圖表 4 創(chuàng)建數(shù)據(jù)庫
點擊如圖表5所示界面中的“確定”按鈕系統(tǒng)就開始創(chuàng)建數(shù)據(jù)庫了。
圖表 5
圖表 6 正在傳教數(shù)據(jù)庫
最后點擊如圖表4所示中的“退出”按鈕就創(chuàng)建數(shù)據(jù)庫完成了。
圖表 7 創(chuàng)建數(shù)據(jù)庫完成
2.2. 登錄Oracle
打開PL/SQL Developer并用system(數(shù)據(jù)庫默認(rèn)的用戶名)用戶身份登錄到XQ2DSGN并選擇連接為SYSDBA,如圖所示:
圖表 8 登錄到PLSQL
2.2.1. 創(chuàng)建表空間
創(chuàng)建表空間的sql語句:
SQL>create tablespace xq2dsgn datafile 'G:\oracle\product\10.2.0\oradata\xq2dsgn\xq2dsgn.dbf' size 2048m autoextend on next 10m maxsize unlimited ;
(參考:
通過PL/SQL Developer登錄到Oracle數(shù)據(jù)庫上后,打開菜單:文件/新建/命令窗口 ,打開一個命令窗口然后在該命令窗口中執(zhí)行腳本創(chuàng)建和刪除表空間,新建用戶和授權(quán)的操作,如圖所示:
圖表 9 打開命令窗口
創(chuàng)建表空間
Sql>create tablespace xqds2gn datafile ' D:\oradata\xq2dsgn\ xq2dsgn.dbf ' size 200m autoextend on next 10m maxsize unlimited;
Sql>alter database datafile ' D:\oradata\xq2dsgn\ xq2dsgn.dbf ' autoextend on;
1 DATAFILE: 表空間數(shù)據(jù)文件存放路徑
2 SIZE: 起初設(shè)置為200M
3 UNIFORM: 指定區(qū)尺寸為128k,如不指定,區(qū)尺寸默認(rèn)為64k
4 空間名稱xq2dsgn 與 數(shù)據(jù)文件名稱 xq2dsgn.dbf 不要求相同,可隨意命名.
5 AUTOEXTEND ON/OFF 表示啟動/停止自動擴展表空間
6 alter database datafile ' D:\oradata\xq2dsgn\ xq2dsgn.dbf ' resize 500m;
//手動修改數(shù)據(jù)文件大小為500M
圖表 10 表空間創(chuàng)建完成
刪除表空間
語句如下:
DROP TABLESPACE xq2dsgn INCLUDING CONTENTS AND DATAFILES;
2.2.2. 創(chuàng)建用戶
1.建立用戶并為用戶指定缺省的永久表空間和臨時表空間
SQL> create user xq2dsgn identified by xq2dsgn
default tablespace xq2dsgn
temporary tablespace temp;
用戶已創(chuàng)建。(user xq2dsgn表示用戶名:xq2dsgn,identified by后面表示密碼)
2.2.3. 對用戶進行授權(quán)
授予用戶會話的權(quán)限如圖所示:
Grant create session to xq2dsgn;
授予用戶創(chuàng)建表格的權(quán)限;
Grant create table to xq2dsgn;
授予用戶設(shè)定表空間大小的權(quán)限;
Grant unlimited tablespace to xq2dsgn;
授予用戶DBA權(quán)限:
grant dba to xq2dsgn;
圖表 11 創(chuàng)建用戶和授權(quán)
2.3. 導(dǎo)出數(shù)據(jù)
2.3.1. 打開SQL server導(dǎo)入導(dǎo)出數(shù)據(jù)向?qū)?/p>
登錄到SQL server 2005資源對象管理器選擇“數(shù)據(jù)庫”并找到要導(dǎo)出到Oracle中的數(shù)據(jù)庫,然后右擊選擇“任務(wù)”→“導(dǎo)出數(shù)據(jù)”。如圖所示:
圖表 12 DTS導(dǎo)出數(shù)據(jù)
2.3.2. 選擇數(shù)據(jù)源
彈出窗體如下圖,點擊“下一步”
2.3.3. 選擇目標(biāo)數(shù)據(jù)庫和配置屬性
如下圖所示選擇“Oracle provider for oledb”
圖表 13 選擇目標(biāo)數(shù)據(jù)庫
(2)導(dǎo)入到本地計算機的屬性配置
如圖所示,在“輸入服務(wù)器名稱”中輸入剛才在本計算機上新建的Oracle數(shù)據(jù)庫名稱,在“用戶名稱”和“密碼”中輸入剛才新建及設(shè)定的用戶名和密碼,點擊“測試連接”提示“測試連接成功”則可以點擊“確定”并進行下一步操作了。
圖表 14 配置屬性
(3)導(dǎo)入到域中的其他計算機上的屬性配置
如圖所示:其中服務(wù)名稱輸入的是目標(biāo)計算機的IP和目標(biāo)Oracle數(shù)據(jù)庫名稱。
2.3.4. 選擇源表和源視圖及目標(biāo)表,并編輯映射
選擇需要導(dǎo)出的表或者全選(這里建議根據(jù)表的類型和復(fù)雜程度選擇一個或者多個進行導(dǎo)出,以免全選發(fā)生錯誤時很難更正)。
圖表 15選擇源表和源視圖
編輯映射。在該圖中,在每行的目標(biāo)表處點擊,然后點擊“編輯映射”按鈕,彈出窗體如下圖:
點擊右上方的“編輯SQL”按鈕,彈出如下窗體:
該窗體顯示了oracle數(shù)據(jù)庫中,即將創(chuàng)建的數(shù)據(jù)庫表的sql語句。如果有以下情況:(1)表名、字段名中有小寫字母;(2)字段類型不正確;(3)存在EVENTID字段或者其他的uniqueidentifier 16類型的字段(GUID對應(yīng)的字段);我們需要進行修改:(1)確保引號內(nèi)的表名、字段名均為大寫;(2)字段類型正確;(3)VARCHAR2(38) DEFAULT SYS_GUID() NOT NULL
該表中,我們需要對EVENTID字段進行修改,修改后的窗體如下圖:
修改完畢,點擊“確定”按鈕。
該步驟,需要依次檢查每個表,確認(rèn)每個表的sql語句無誤后,才能進行下一步操作。()
有些表名及字段名均存在小寫或者大小寫均有的現(xiàn)象,直接導(dǎo)入Oracle數(shù)據(jù)庫,則引起使用中的一些錯誤。因此,我們在這里手工將上圖的sql語句中,引號內(nèi)的表名、字段名全部改為大寫,并將“列映射”頁面的目標(biāo)數(shù)據(jù)字段改為全部大寫,如果想要繼續(xù)使用小寫的表名則注意引號的應(yīng)用這里不做說明.
2.3.5. 執(zhí)行導(dǎo)出
選擇完表后點擊“下一步”或者點擊“完成”如果不出錯則提示導(dǎo)入成功如圖所示:
圖表 16 執(zhí)行導(dǎo)入成功
3. 特殊字段處理
3.1. 對于自增長字段的處理
Sql server數(shù)據(jù)庫中,有時會采用自增長的字段做為主鍵,但oracle數(shù)據(jù)庫中沒有這樣的字段,因此需要我們單獨處理這樣的字段。
以下以StationSeries表的objectid字段為例進行說明。
StationSeries表的objectid在sql server數(shù)據(jù)庫中為int類型,標(biāo)識增量為1;導(dǎo)入oracle數(shù)據(jù)庫中后,字段類型為integer。
(1) 新建一個sql窗口(登陸plsql后,F(xiàn)ile主菜單,new –>sql window即可)。
(2) 在該窗口中輸入以下sql語句:
Select max(objectid) from stationseries;
(3)按F8,執(zhí)行該語句,看到最大ID值為4743。如下圖:
(3) 新建一個序列。在sql窗口,輸入以下sql語句:
create sequence OBJECTID_STATIONSERIESminvalue 4744 maxvalue 99999999999999999999999999start with 4744 increment by 1 nocache;
用鼠標(biāo)選中該條語句,并按F8,執(zhí)行該語句,即創(chuàng)建了一個序列。
說明:該語句中,OBJECTID_STATIONSERIES為序列的名字;Minvalue之后的4744為上面的sql語句最大的objectid值+1即:4743 +1=4744;maxvalue填盡可能大的數(shù)字即可。Start with值同minvalue,increment by 1表示每次遞增1。
如下圖:
(4)建立觸發(fā)器。
同樣,在sql窗口,輸入以下sql語句:
create or replace trigger objectID_stationseries
before insert on stationseries
for each row
declare
-- local variables here
nextid number;
begin
IF :new.objectid IS NULL or :new.objectid=0 THEN
select objectid.nextval
into nextid
from sys.dual;
:new.objectid:=nextid;
end if;
end objectID;
用鼠標(biāo)選中該條語句,并按F8,執(zhí)行該語句,即創(chuàng)建了一個StationSeries表的對objectid自增的觸發(fā)器。說明:該語句中,objectID_stationseries為觸發(fā)器的名字。before insert on之后的stationseries為建立觸發(fā)器的表名。Objectid即為字段。
經(jīng)過上述四個步驟,我們就可實現(xiàn)類似sql server數(shù)據(jù)庫中的自動增長字段,而無需更改代碼。
在導(dǎo)入oracle數(shù)據(jù)庫結(jié)束后,我們需要檢查sql server數(shù)據(jù)庫,對于其他表中的自增字段,也需要重復(fù)上述步驟實現(xiàn)在oracle數(shù)據(jù)庫中自增字段。
至此,從sql server數(shù)據(jù)庫至oracle數(shù)據(jù)庫的移植工作就結(jié)束了。