Oracle impdp-ORA-39083,ORA-00942
可以使用 Oracle 数据泵导入工具 (IMPDP.EXE) 通过 REMAP_SCHEMA 选项将一种模式导入到另一种模式中。然而,存在一个问题,这种remap_schema的选项无法影响到package/procedure/view/trigger等内部引用的schema,类似出现如下错误:
ORA-39083: Object type TRIGGER failed to create with error:
ORA-00942: table or view does not exist Failing sql is:
CREATE TRIGGER "NEW_SCHEMA"."METER_ALARMS_BI"
BEFORE INSERT ON OLD_SCHEMA.METER_ALARMS ...
原因是创建的SQL仍然引用OLD_SCHEMA。 Oracle 文档中确实提到:
The mapping may not be 100 percent complete, because there are certain schema references that Import is not capable of finding. For example, Import will not find schema references embedded within the body of definitions of types, views, procedures, and packages.
根据 Oracle Metalink 注释 750783.1,解决方法是:
- 使用impdp指令获取dump档内的DDL 命令
impdp system/** directory=test_dp DUMPFILE=export_schemas.dmp remap_schema=u1:u2 sqlfile=script.sql
- 从写入的 SQLFILE 中提取受影响的 DDL 并更正schema引用。然后手动执行命令。
这种方法并不可取,尤其是在存在大量导入失败对象的情况下,且需要实现自动化以合并多个模式用于现场数据库升级。
是否有更优的解决方案能够解决此问题?所需的解决方案必须在现场应用中具备 100% 的可靠性。尽管可以通过解析生成的 SQL 文件来尝试修复,但这种方式是否能够确保完全正确?是否存在一种机制,可以在 IMPDP 执行 CREATE SQL 语句时进行拦截并在导入过程中实时修正?或者,是否可以通过直接修改 DMP 文件的方式实现所需的调整?