【问题标题】:OracleBulkCopy does not support TriggersOracleBulkCopy 不支持触​​发器
【发布时间】:2013-06-10 22:04:42
【问题描述】:

我的软件需要一次向 Oracle 数据库中插入大约 5000 条记录,所以我使用了OracleBulkCopy来执行此操作。我的表使用触发器来自动增加主键。但是OracleBulkCopythrow "ORA-26086: direct path does not support triggers" 异常。

那么,我怎样才能同时使用OracleBulkCopy 和自动递增主键?

【问题讨论】:

    标签: .net oracle triggers odp.net


    【解决方案1】:

    从 ODP.Net 开发人员指南中可以看到OracleBulkCopy class does a direct-path load。如错误所示,您无法将直接路径加载到启用触发器的表中。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • @hieund 哪一点不清楚...? 2个表,您现有的带有触发器等的常规表,以及第二个没有的表;批量插入到第二个表中,然后使用 insert... 移动数据
      • 是的,我的问题是,如果我有 100 个表,我必须创建其他 100 个具有相同结构的表才能对每个表使用批量插入。所以我的数据库有200个表,太多了,很难维护。如果有一个表可以代表其他 100 个表,那将非常有用。
      【解决方案3】:

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

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

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

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

      【讨论】:

      • 好久不见了。但我认为我们不应该禁用触发器。只需检查触发器的输入 ID 是否为空或零 (0),然后使用该序列。否则,只需使用输入 id。
      猜你喜欢
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2022-10-18
      • 2012-07-18
      • 2020-07-31
      • 2021-01-20
      相关资源
      最近更新 更多