我正在尝试使用命令
导入我的数据库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
,但必须有一种更简单的方法。
答案 0 :(得分:2)
您可以在导入前禁用约束,然后重新启用它们。你可以用一些动态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
命令一次导入所有表;然后使用ENABLE
而不是DISABLE
运行相同的PL / SQL块。
在开始之前,如果您有任何禁用限制,则值得检查。如果你这样做,禁用脚本可以根据它们的状态跳过它们,但启用脚本将无法判断它们是否应该重新启用;因此,您可以创建静态启用脚本,也可以对所需的任何异常进行硬编码。