【问题标题】:Oracle sample data problemsOracle 样本数据问题
【发布时间】:2011-02-01 22:27:07
【问题描述】:

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

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

现在,我在创建目标架构和清空它时遇到了两个问题。

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

有没有什么简单的方法可以不用大惊小怪?我需要一个复杂的数据集来进行测试(复杂的如带有触发器的表、多个层次结构......例如......一个具有多达 5 个级别的子表、一个引用 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

好吧,我尝试将这一行修改为:

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 属性:(

【问题讨论】:

  • 您是否只是想要创建架构对象但不向其中填充数据的脚本的替代版本?不能直接删除所有的 INSERT 语句吗?
  • @Jeffrey 不。示例脚本 sql 从 .dmp 文件加载。 (数据文件)。示例脚本中没有插入语句。

标签: oracle oracle10g sample sample-data


【解决方案1】:

这是一个匿名块 - 对于给定的架构 - 禁用触发器和外键,截断所有表,然后重新启用触发器和外键。它使用truncate 来提高速度,但显然这意味着没有回滚:所以要小心你提供的模式名称!如果您愿意,可以很容易地将该调用转换为 delete from 语句。

脚本是剪切粘贴编程的一个很好的例子,毫无疑问,它会从一些重构中受益,以消除重复。

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;
/

【讨论】:

  • @APC 我想我可以试一试。您是否知道任何免费使用具有复杂表结构的公共数据集(像IoT表,非IoT表,父节子表中的深度,IOTS引用非IOT和viceversa等)? span >
【解决方案2】:

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

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

[阅读您对可传输表空间的评论后进行编辑]

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

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

    exp sys/&&password_sys AS SYSDBA 文件=oe_nodata.dmp 日志=oe_nodata_exp.log 所有者=OE 行=N 授予=N

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

现在,您的脚本应该:

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

    host imp "'sys/&&password_sys AS SYSDBA'" 文件=oe_nodata.dmp 日志=tr_oe_imp.log fromuser=OE touser=TR_OE

【讨论】:

  • 问题在于创建 TR_XXX 架构。就像你说的,我必须从 xxx.dmp 文件加载我的 TR_xxx 模式,然后删除其中的数据。删除数据是最难的部分——一些模式有循环引用,它需要我禁用外键约束并在删除数据后启用它们。总之,这是一种非常痛苦的做法。
  • ROWS=N 选项将仅创建 Oracle 对象(表、索引、视图等),但不插入任何数据。通过“创建空模式”,我的意思是只创建没有对象的 Oracle 用户/模式 - 即“CREATE USER TR_OE IDENTIFIED BY mypassword”
  • ROWS=N 听起来很酷,我会试一试并发布和更新
  • ROWS=N 不起作用 :( - 这与传输表空间有关吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2020-02-26
  • 2011-03-05
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多