Oracle:使用失败的延迟约束继续插入

Oracle:使用失败的延迟约束继续插入,oracle,import,constraints,deferred,Oracle,Import,Constraints,Deferred,很抱歉问了这么长的问题,但我希望它是完整的 我的目标是创建一个流程,用MS-SQL服务器创建的数据填充Oracle 11数据库。 我希望加载尽可能多的数据,并对未通过约束的记录创建错误报告,以便我们可以使用数据测试新应用程序,改进数据收集,并重复此过程 我有一个直接从MS-SQL表读取的NodeJS脚本(一次读取一个),并触发INSERT。。。异常/将错误记录到Oracle数据库中。这似乎一直有效到最后。某些表具有“可延迟约束”(例如,同一表中的父项id),我无法忽略/报告这些约束,因此最终我总

很抱歉问了这么长的问题,但我希望它是完整的

我的目标是创建一个流程,用MS-SQL服务器创建的数据填充Oracle 11数据库。 我希望加载尽可能多的数据,并对未通过约束的记录创建错误报告,以便我们可以使用数据测试新应用程序,改进数据收集,并重复此过程

我有一个直接从MS-SQL表读取的NodeJS脚本(一次读取一个),并触发
INSERT。。。异常/将错误记录到Oracle数据库中。这似乎一直有效到最后。某些表具有“可延迟约束”(例如,同一表中的父项id),我无法忽略/报告这些约束,因此最终我总是会遇到延迟约束的提交错误和0个插入行:(

注意:这个问题看起来很像,但是它没有指定延迟约束或其他工具

问题鉴于上下文(我不是真正的Oracle专家):

1) 是否有其他方法来处理这些延迟约束,仍然插入有效数据并记录错误


2) 是否有更好的工具来执行此迁移并报告当前的数据问题?

好吧,这些列似乎有一个很好的理由可以推迟,因为在插入所有行之前,您无法知道哪些行将无法通过约束

我不确定这是否是一种最佳做法,但我要做的是:将所有记录插入
my_table
后,在提交之前,记录并删除所有约束检查失败的行,例如:

spool bad_rows.txt;
select * from my_table where parent_id not in (select id from my_table);
spool off;
delete from my_table where parent_id not in (select id from my_table);
我无法从您的问题中判断这是一次性数据迁移还是常规迁移。如果您计划经常这样做,您可能会考虑捕获违规行,然后在加载之前禁用约束,用异常子句重新启用它们(并且可能“代码> > SET约束立即生效;< /COD>检查违规行为”,然后在发布提交之前删除表中的违规行(使用ROWID)。我认为你应该能够很好地实现自动化


我做这类事情的次数不足以很好地回答你问题的第二部分。我可以说,您的一些选项包括:(a)使用SQL*Loader进行快速直接路径加载,这具有很好的错误处理能力;(b)在MS SQL Server db和Oracle db之间创建远程数据库链接,并直接插入数据,以避免数据格式问题。希望其他人能提供一个关于好的迁移工具的更好的答案。

您可以看看,通过它,您可以创建一个错误记录表作为
dbms\u errlog。创建错误日志(“表名”)
,然后用一个附加的
日志错误
子句应用
insert
。@WilliamRobertson我试过了(如问题中所述)。文档说明延迟约束不会被捕获。因此问题是:)啊,我错过了,抱歉。SQL*Loader可能是一个不错的选择。一切正常的都将被加载。所有错误都不会发生,但您可以查看原因(在日志文件中)和行(在错误文件中),然后采取适当的操作。我确实选择了在提交之前手动处理可能失败的约束的解决方案,这感觉像是阻力最小的路径。引入SQLLoader add是迁移中的另一个组件。。将SQLLoader保留为备份:)