4

我的软件需要一次向 Oracle 数据库中插入大约 5000 条记录,所以我曾经这样OracleBulkCopy做过。我的表使用触发器来自动增加主键。但是会OracleBulkCopy抛出“ORA-26086:直接路径不支持触发器”异常。

那么,如何同时使用OracleBulkCopy和自动递增主键?

4

3 回答 3

4

此类场景的常见解决方案是将批量加载到临时表中;一个没有触发器等的单独表,您可以快速将数据放入其中。这意味着您可以在带宽和往返性能方面获得批量加载的优势。然后; 当且仅当数据在暂存表中时,使用常规 SQL(大概)将数据从暂存表移动到实际的事务表中。那么这完全是本地数据库服务器,所以非常快。insert

这样做的一个很好的优势是它意味着*当您进行批量加载时,您不会影响任何真实用户 - 因为真实用户只会查看事务表 - 我们还没有触及。

于 2013-06-14T09:55:03.607 回答
2

从 ODP.Net Developer's Guide 看来,OracleBulkCopy 类执行了直接路径加载。如错误所示,您无法将直接路径加载到启用触发器的表中。

如果您想使用 OracleBulkCopy 类,您可能会禁用生成主键的触发器,从序列中获取 5000 个值,然后在您的应用程序中使用这些值。加载完成后,您可以重新启用触发器。当然,这意味着没有其他会话可以同时将数据加载到该表中。

于 2013-06-14T09:45:53.650 回答
0

Justin Cave 的解决方案很容易实现,但存在一个问题。那就是我的步骤应该是:

  1. 禁用触发器
  2. 从序列中获取 5000 个 ID
  3. 为记录分配 ID
  4. 执行批量插入数据库
  5. 启用触发器

如果用户在步骤 2(或 3、4) - 他禁用触发器。而另一个不同上下文的用户当时也在我的表中插入了一条记录,这样他就无法获得增加的id;

Marc Gravell 的解决方案似乎非常好。但我很难达到。我的项目正在使用实体框架。你的意思是:对于数据库中的每个表,我必须创建另一个具有相同结构的表?

于 2013-06-17T09:46:56.207 回答