Oracle示例数据问题

时间:2010-03-29 06:57:27

标签: oracle oracle10g sample sample-data

所以,我有这个基于java的数据转换/屏蔽工具,我想在Oracle 10g上进行测试。 Oracle 10g的优点在于,您可以获得大量包含50万条记录的示例模式。模式是:SH,OE,HR,IX等。所以,我安装了10g,发现安装脚本在ORACLE_HOME / demo / scripts下。

我稍微定制了这些脚本以便在批处理模式下运行。这解决了我的一半要求 - 为我的数据转换软件测试创建源数据。 要求的后半部分是我在不使用任何数据的情况下以不同的名称(TR_HR,TR_OE等等)创建相同的模式。这些模式将代表我的目标模式。因此,简而言之,我的软件会从架构中的表中获取数据并将其加载到不同架构中的同一个表中。

现在,我在创建目标模式并清空它时遇到两个问题。

  • 我想在批处理作业中这样做。但是您获得的oracle脚本,示例模式名称是不可配置的。所以,我尝试创建一个脚本,用TR_OE替换OE,用TR_HR替换HR,依此类推。然而,这种方法有点令人恼火,因为样本模式在创建方式上有点复杂; Oracle创建同义词,视图,物化视图,数据类型和许多奇怪的东西。
  • 我希望目标模式(TR_HR,TR_OE,...)为空。但是一些模式具有循环引用,这不允许我删除数据。唯一的解决方法似乎是删除某些外键,删除数据然后再添加约束。

有没有简单的方法来解决这一切,没有这么大惊小怪?我需要一个复杂的数据集用于我的测试(复杂的,如带有触发器的表,多个层次结构......例如,一个子表最多有5个级别,一个父表引用一个IOT表和一个IOT表指的是非IOT表等。)。从数据集的角度来看,示例模式几乎是完美的。我看到的唯一挑战是自动化加载源模式的整个过程,然后创建目标模式并清空它们。感谢您的帮助和建议。


更新

为手动安装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 attribute:(

。),仍使用行数据创建了模式

2 个答案:

答案 0 :(得分:5)

由于您已经熟悉使用.dmp文件的Oracle脚本中的exp / imp(或expdp / impdp),为什么不呢:

  • 创建空的TR_xxx架构
  • 从中填充TR_xxx架构 带有FROMUSER / TOUSER的xxx .dmp文件 选项和ROWS = N(类似选项 存在于expdp / impdp)

[阅读有关可传输表空间的评论后编辑]

我不知道Oracle脚本使用的是可传输的表空间,并且从单个文件导入了多个模式。这可能是创建新的空TR模式最直接的方法:

  • 从标准填充开始 用Oracle构建的数据库 脚本
  • 在上创建无数据导出文件 逐个架构(OE显示):

    exp sys /&& password_sys AS SYSDBA 文件= oe_nodata.dmp log = oe_nodata_exp.log owner = OE rows = N. 补助= N

    (你应该只做一次 这个dmp文件可以重复使用)

现在,您的脚本应该:

  • 删除任何带有CASCADE的TR_用户 选项
  • 重新创建TR_用户
  • 填充架构对象(OE
    显示):

    host imp“'sys /&& password_sys AS SYSDBA'“file = oe_nodata.dmp log = tr_oe_imp.log fromuser = OE TOUSER = TR_OE

答案 1 :(得分: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;
/