我的软件需要同时在Oracle数据库中插入大约5000条记录,因此我使用OracleBulkCopy
来执行此操作。我的表使用触发器自动增加主键。但是OracleBulkCopy
throw" ORA-26086:直接路径不支持触发器"异常。
那么,我如何使用OracleBulkCopy
和自动增加主键?
答案 0 :(得分:4)
此类方案的常见解决方案是将批量加载执行到 staging 表中;一个单独的表没有触发器等,您可以快速将数据投入。这意味着您可以在带宽和往返性能方面获得批量加载的优势。然后; 当且仅当数据在登台表中时,使用常规SQL(可能是insert
)将数据从登台表移动到实际的事务表中。这是完全本地的数据库服务器,所以非常快。
这样做的一个好处是,它意味着*在您进行批量加载时,您不会影响任何真实用户 - 因为真正的用户只会查看事务性表 - 我们还没有接触过。
答案 1 :(得分:2)
来自ODP.Net开发人员指南OracleBulkCopy class does a direct-path load。如错误所示,您无法对启用了触发器的表执行直接路径加载。
如果要使用OracleBulkCopy类,可能会禁用生成主键的触发器,从序列中获取5000个值,然后在应用程序中使用这些值。然后,您可以在加载完成后重新启用触发器。当然,这意味着没有其他会话可以同时将数据加载到该表中。
答案 2 :(得分:0)
Justin Cave的解决方案很容易实现,但有一个问题。那是我的步骤应该是:
如果用户在步骤2(或3,4) - 他禁用了触发器。另一个用户在不同的上下文中也会在当时向我的表中插入一条记录,这样他就无法获得增加的id;
Marc Gravell的解决方案似乎非常好。但是我很难实现。我的项目正在使用Entity Framework。你的意思是:对于数据库中的每个表,我必须创建另一个具有相同结构的表吗?