0

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

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

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

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

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

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

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

4

1 回答 1

4

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

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

于 2016-09-02T18:32:12.693 回答