2010-03-29 95 views
2

所以,我有這個基於java的數據轉換/屏蔽工具,我想在Oracle 10g上進行測試。使用Oracle 10g的好處在於,您可以獲得大量樣本模式,其中有些記錄有50萬條記錄。模式是:SH,OE,HR,IX等。因此,我安裝了10g,發現安裝腳本在ORACLE_HOME/demo/scripts下。Oracle示例數據問題

我自定義了這些腳本,以便在批處理模式下運行。這解決了我需求的一半 - 爲測試我的數據轉換軟件創建源數據。 需求的第二部分是我創建了不同名稱下的相同模式(TR_HR,TR_OE等等),沒有任何數據。這些模式將代表我的目標模式。因此,簡而言之,我的軟件將從模式中的表中獲取數據,並將其載入到不同模式中的同一個表中。

現在,我在創建我的目標架構並清空它時遇到了兩個問題。

  • 我希望在批處理作業中使用。但是你得到的oracle腳本,示例模式名稱是不可配置的。所以,我嘗試創建一個腳本,用TR_OE替換OE,用TR_HR替換HR等等。然而,這種方法是令人惱火的,因爲樣本模式在創建方式上有點複雜; Oracle創建同義詞,視圖,物化視圖,數據類型和很多奇怪的東西。
  • 我希望目標模式(TR_HR,TR_OE,...)爲空。但是一些模式有循環引用,這不允許我刪除數據。唯一的解決方法似乎是刪除某些外鍵,刪除數據,然後添加約束。

是否有任何簡單的方法來處理所有這些,沒有這麼大驚小怪?我需要一個複雜的數據集用於我的測試(複雜的如帶有觸發器的表,複雜的層次結構......例如,子表最多有5個子級的子表,引用IOT表和IOT表的父表這是指一個非物聯網表等)。從數據集的角度來看,示例模式非常完美。我看到的唯一挑戰就是自動化加載源模式的整個過程,然後創建目標模式並清空它們。感謝您的幫助和建議。


UPDATE

,你需要手動安裝Oracle示例模式運行主腳本mkplug.sql。下面是從dmp文件加載模式向上行:

host imp "'sys/&&password_sys AS SYSDBA'" transport_tablespace=y file=&imp_file log=&imp_logfile datafiles='&datafile' tablespaces=EXAMPLE tts_owners=hr,oe,pm,ix,sh 

嗯,我想修改該行本(修補上mkplug.sql和所有其他SQL文件路徑相關的問題後):

host imp "'sys/&&password_sys AS SYSDBA'" rows=n transport_tablespace=y file=&imp_file log=&imp_logfile datafiles='&datafile' tablespaces=EXAMPLE tts_owners=hr,oe,pm,ix,sh 

而且......它沒有不是幫助。儘管rows = n屬性:(

+0

你只是想創建模式對象的腳本的替代版本,但不填充數據?你不能只刪除所有的INSERT語句嗎? – 2010-03-29 07:28:39

+0

@Jeffrey nope。示例腳本sql從.dmp文件加載。 (數據文件)。示例腳本中沒有插入語句。 – Jay 2010-03-29 07:44:48

回答

5

既然你已經熟悉了從使用.dmp文件的Oracle腳本EXP/IMP(或EXPDP/IMPDP),爲什麼不乾脆:

  • 創建空TR_xxx模式
  • 從與FROMUSER/TOUSER 選項和ROWS = N(類似的選項 用於EXPDP/IMPDP存在)
的 XXX .dmp文件填充TR_xxx架構

[編輯閱讀你對傳輸表空間後評論]

我不知道Oracle腳本使用傳輸表空間和多個模式正在從一個單一的文件中導入。這可能是創建新的空TR模式最簡單的方法:

  • 啓動與標準,填充 數據庫與Oracle 腳本

  • 模式創建無數據的導出文件建逐模式的基礎上(示出OE)由:

    EXP SYS/& & password_sys AS SYSDBA 文件= oe_nodata.dmp 日誌= oe_nodata_exp.log所有者= OE行= N 補助= N

    (您應該只有這樣做一次 這dmp文件可重複使用)

現在,您的腳本應該:

  • 降大任於TR_用戶CASCADE
    選項
  • 重新創建TR_用戶
  • Pop烏拉特模式對象(OE
    示出)由:

    主機小鬼 「 'SYS/& & password_sys AS SYSDBA'」 文件= oe_nodata.dmp 日誌= tr_oe_imp.log FROMUSER = OE 至用戶= TR_OE

+0

問題在於創建TR_XXX模式。就像你說的那樣,我將不得不從xxx.dmp文件加載我的TR_xxx模式,然後刪除它們中的數據。刪除數據是最難的部分 - 一些模式具有循環引用,這將需要我禁用外鍵約束,並在刪除數據後啓用它們。總之,這是一個非常痛苦的方法。 – Jay 2010-03-29 14:06:26

+0

ROWS = N選項將只創建Oracle對象(表,索引,視圖等),但不會插入任何數據。通過「創建空模式」,我的意思是隻創建沒有對象的Oracle用戶/模式 - 即「CREATE USER TR_OE IDENTIFIED BY mypassword」 – dpbradley 2010-03-29 16:30:02

+0

ROWS = N聽起來很酷,我會給這個鏡頭併發布並更新 – Jay 2010-03-30 04:45:50

1

這裏是anonymos塊 - 對於給定的模式 - 禁用觸發器和外鍵,截斷所有表,然後重新啓用觸發器和外鍵它使用truncate作爲速度,但顯然這意味着沒有回滾:所以要小心你提供的模式名稱!如果你願意,可以很容易地將該調用轉換爲delete from語句。

該腳本是cut'n'paste編程的一個很好的例子,並且毫無疑問會從某些重構中受益,以消除重複。

begin 
    <<dis_triggers>> 
    for trgs in (select owner, trigger_name 
        from all_triggers 
        where table_owner = '&&schema_name') 
    loop 
     execute immediate 'alter trigger '||trgs.owner||'.'||trgs.trigger_name 
           ||' disable'; 
    end loop dis_triggers; 

    <<dis_fkeys>> 
    for fkeys in (select owner, table_name, constraint_name 
        from all_constraints 
        where owner = '&&schema_name' 
        and constraint_type = 'R') 
    loop 
     execute immediate 'alter table '||fkeys.owner||'.'||fkeys.table_name 
           ||' disable constraint '||fkeys.constraint_name; 
    end loop dis_fkeys; 

    <<zap_tables>> 
    for tabs in (select owner, table_name 
        from all_tables 
        where owner = '&&schema_name') 
    loop 
     execute immediate 'truncate table '||tabs.owner||'.'||tabs.table_name 
           ||' reuse storage'; 
    end loop zap_tables; 

    <<en_fkeys>> 
    for fkeys in (select owner, table_name, constraint_name 
        from all_constraints 
        where owner = '&&schema_name' 
        and constraint_type = 'R') 
    loop 
     execute immediate 'alter table '||fkeys.owner||'.'||fkeys.table_name 
           ||' enable constraint '||fkeys.constraint_name; 
    end loop en_fkeys; 

    <<en_triggers>> 
    for trgs in (select owner, trigger_name 
        from all_triggers 
        where table_owner = '&&schema_name') 
    loop 
     execute immediate 'alter trigger '||trgs.owner||'.'||trgs.trigger_name 
           ||' enable'; 
    end loop en_triggers; 

end; 
/
+0

@APC我想我可以給這個鏡頭。你知道任何可以自由使用的具有複雜表結構的公共數據集(例如物聯網表,非IOT表,父級子表中的深度,引用非IOT和反向等等的IOT)? – Jay 2010-03-29 14:10:08