問(wèn)題:
數(shù)據(jù)庫(kù)表中沒(méi)有建立主鍵,即使建立了主鍵,也是使用與業(yè)務(wù)相關(guān)的字段建立的主鍵,還有復(fù)合主鍵。
調(diào)整:
1)為每個(gè)表添加ID列,并創(chuàng)建主鍵;
2)為每個(gè)表創(chuàng)建Oracle Sequence,使用trigger實(shí)現(xiàn)自動(dòng)獲取;
3)原來(lái)使用業(yè)務(wù)鍵創(chuàng)建的主鍵改為唯一索引。
實(shí)現(xiàn):
1)從舊數(shù)據(jù)庫(kù)中導(dǎo)出表結(jié)構(gòu)及其他用戶對(duì)象,在新數(shù)據(jù)庫(kù)中創(chuàng)建用戶并導(dǎo)入
exp username/passwd@dbname file=old.dmp rows=n compress=n
說(shuō)明:
a) exp命令不能使用一個(gè)參數(shù)比如tables=all 導(dǎo)出所有表,需要指定表名列表;表名列表獲取sql:select table_name from cat where table_type = 'TABLE';
b) 如果只導(dǎo)出表結(jié)構(gòu)而不導(dǎo)出其他用戶對(duì)象(sequence、procedure、trigger等),可以指定tables參數(shù),例如:tables=tab1,tab2
導(dǎo)入新數(shù)據(jù)庫(kù)后,刪除沒(méi)有用的用戶對(duì)象。(為避免JOB、數(shù)據(jù)庫(kù)鏈、視圖因權(quán)限不足而失敗,使用DBA用戶導(dǎo)入)
2)使用程序連接新數(shù)據(jù),根據(jù)新數(shù)據(jù)中的表名生成sql,并在新數(shù)據(jù)庫(kù)中執(zhí)行
sql的內(nèi)容包括根據(jù)舊主鍵創(chuàng)建唯一索引、刪除舊主鍵、創(chuàng)建ID列、創(chuàng)建ID主鍵、創(chuàng)建Sequence、創(chuàng)建Trigger
3)從舊數(shù)據(jù)庫(kù)中導(dǎo)出數(shù)據(jù),在新數(shù)據(jù)庫(kù)中導(dǎo)入數(shù)據(jù)
exp username/passwd@dbname tables=tablename file=filename.dmp rows=y compress=n
既包含表結(jié)構(gòu),又包含數(shù)據(jù)
---------------------------------------------------------------------------------------------
使用PL/SQL Developer導(dǎo)出/導(dǎo)入表結(jié)構(gòu)、表數(shù)據(jù)
1)導(dǎo)出表結(jié)構(gòu):
Tools-->Export User Objects(導(dǎo)出用戶對(duì)象) -->選擇要導(dǎo)出的表(包括Sequence等)-->.sql文件,導(dǎo)出的都為sql文件
a)不要勾選Include Owner,否則用戶對(duì)象前面會(huì)有Owner名字。不要勾選Include Storage,否則建表語(yǔ)句會(huì)有與存儲(chǔ)有關(guān)的子句。
b)如果只導(dǎo)出表,則只選擇表對(duì)象。
導(dǎo)出表數(shù)據(jù):
Tools-->Export Tables-->選擇表,選擇SQL Inserts-->.sql文件
導(dǎo)入表結(jié)構(gòu):
執(zhí)行剛剛導(dǎo)出的sql文件,記住要?jiǎng)h掉table前的用戶名,比如以前這表名為sys.tablename,必須刪除sys
導(dǎo)入表數(shù)據(jù):
執(zhí)行剛剛導(dǎo)出的sql文件