2010-03-29 68 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