impdp content=data_only,如何指定先导入哪些表

impdp content=data_only, how to specify which tables to import first

我正在尝试使用命令

导入我的数据库
impdp SYSTEM/password DIRECTORY=dmpdir DUMPFILE=database.dmp CONTENT=DATA_ONLY

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

ORA-02291: integrity constraint (SYSTEM.user_role_user_fk) violated - parent key not found

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

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

编辑:我发现一个糟糕的解决方案是简单地使用与上面相同的 impdp 语句两次。通过两次,我可以导入 USERUSER_ROLE,但是必须有更简单的方法。

您可以在导入前禁用约束,然后再重新启用它们。你可以用一些动态的 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.

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