【问题标题】:impdp content=data_only, how to specify which tables to import firstimpdp content=data_only,如何指定先导入哪些表
【发布时间】:2017-01-10 01:22:34
【问题描述】:

我正在尝试使用命令导入我的数据库

impdp SYSTEM/password DIRECTORY=dmpdir DUMPFILE=database.dmp CONTENT=DATA_ONLY

这适用于导入数据的某些部分,但是,我收到一个错误:

ORA-02291:违反完整性约束 (SYSTEM.user_role_user_fk) - 找不到父键

基本上我需要先从USER导入数据,然后才能从USER_ROLE导入数据

在使用 IMPDP 时,有没有办法指定操作顺序或首先导入哪些表数据?

编辑:我发现的一个不好的解决方案是简单地使用与上述相同的 impdp 语句两次。通过执行两次,我可以同时导入 USER 和 USER_ROLE,但是必须有更简单的方法。

【问题讨论】:

  • 这显然是预期的行为;参见 MOS 说明 1062564.1。这指的是to the documentation,尽管尚不清楚它是否适用于这种情况。您可以在导入之前禁用约束吗?过去我运行了一个脚本来动态禁用所有约束,然后重新启用它们。
  • @AlexPoole - 不过,你能把你的脚本用 dmp 文件运行吗?
  • 不,你会运行脚本来禁用;执行impdp(一次性完成所有表格);然后运行脚本重新启用。我想所有这些都可以在 shell 或批处理脚本包装器中完成。唯一的选择是您已经尝试过的,单独的 impdp 运行以按照您期望的顺序导入它们。你不能告诉导入顺序。

标签: oracle impdp


【解决方案1】:

您可以在导入之前禁用约束,然后重新启用它们。您可以使用一些动态 SQL 来做到这一点:

begin
  for r in (
    select 'ALTER TABLE "'||c.table_name||
      '" DISABLE CONSTRAINT "'||c.constraint_name||'"' as cmd
    from user_constraints c
    where c.constraint_type = 'R'
  )
  loop
    execute immediate r.cmd;
  end loop;
end;
/

在你运行之后,例如通过 SQL*Plus 在 shell 脚本中使用 heredoc,您可以运行 impdp 命令一次性导入所有表;然后运行相同的 PL/SQL 块,但使用 ENABLE 而不是 DISABLE。

在开始之前检查是否有任何禁用的约束是值得的。如果您这样做,禁用脚本可以根据它们的状态跳过它们,但启用脚本将无法判断是否应该重新启用它们;所以你可以创建一个静态启用脚本,或者硬编码你需要的任何异常。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 2012-06-30
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多