有关触发器(ORA-39083,ORA-00942)的Oracle IMPDP REMAP_SCHEMA问题是否有一个很好的解决方法?

Vin*_*eJS 9 oracle schema ora-00942 remap impdp

可以使用Oracle数据泵导入工具(IMPDP.EXE)使用REMAP_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 ...
Run Code Online (Sandbox Code Playgroud)

原因是因为create SQL仍然引用OLD_SCHEMA.它确实在Oracle文档中说:

映射可能不是100%完成,因为某些模式引用导入无法查找.例如,Import将找不到嵌入在类型,视图,过程和包的定义主体中的模式引用.

恕我直言,这是甲骨文的一个警察,但这是另一个讨论!

根据Oracle Metalink说明750783.1,解决方法是:

  1. 创建一个SQLFILE以包含相关的DDL命令:
      impdp system/****** directory=test_dp
      DUMPFILE=export_schemas.dmp
     remap_schema=u1:u2 sqlfile=script.sql
Run Code Online (Sandbox Code Playgroud)
  1. 从写入的SQLFILE中提取受影响的DDL并更正模式引用.然后手动执行该命令.

这不是一个好方法,特别是如果你有许多失败的对象,并希望自动化组合多个模式的过程,以便在数据库的字段升级.

有没有人找到更好的方法来做到这一点?如果要在现场使用,我需要一个必须100%可靠的解决方案.我可以解析生成的SQL文件,但可以100%正确吗?是否有一些方法可以拦截IMPDP执行的CREATE SQL语句并在导入时动态更正?可以直接修补DMP文件吗?

Gar*_*ers 0

你可以看看 DBMS_METADATA

有一个REMAP_SCHEMA选项。不确定它是否会比 DATAPUMP 工作得更好(我怀疑 DATAPUMP 会在幕后使用 DBMS_METADATA)。但对输出进行“后处理”会更容易。