【问题标题】:bulk upload and trigger批量上传和触发
【发布时间】:2010-09-06 14:42:05
【问题描述】:

批量绑定和触发器的几个问题(Oracle 10g)

1) 在批量绑定的情况下会执行行级触发器吗?
2)如果是,那么是否有任何选项可以抑制仅针对批量绑定的执行?
3)如果没有,有没有办法在批量绑定中执行行级触发器?
4) 如果为批量绑定执行行级触发器,性能是否会受到影响?

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案1】:

    在执行批量绑定插入时,触发器仍会启用并触发。您无法阻止这种情况发生,但当然您可以将自己的逻辑放入触发器和执行批量插入的代码中,如下所示...

    在包装规范中:

    create or replace package my_packags is
    
        in_bulk_mode boolean default false;
    
        ... -- rest of package spec
    end;
    

    在触发器中:

    begin
        if NOT my_package.in_bulk_mode then
            -- do the trigger stuff
        end if;
    end;
    

    在调用代码中:

    my_package.in_bulk_mode := true;
    -- do the bulk insert
    my_package.in_bulk_mode := false;
    

    【讨论】:

      【解决方案2】:

      触发器在 SQL 引擎中执行。批量绑定通过减少调用/语句的数量来影响调用语言(pl/sql 或任何 OCI 语言)调用 SQL 引擎的方式,但不应绕过任何触发器。

      (假设您使用触发器向数据库添加验证、日志记录或其他约束,但第三方应用程序会通过使用批量操作简单地绕过它 - 这将导致数据损坏和安全问题) .

      您的语句级触发器应该触发一次。

      您可以“禁用”您的触发器,方法是让它在执行任何其他操作之前检查内存中的会话变量,并在批量操作之前显式设置它。

      行级触发器仍会按每行触发,这可能会产生更大的影响。

      【讨论】:

      • 我知道只有一种方法可以避免启用行级或语句级触发器;在直接路径模式下使用 SQL*Loader。
      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      相关资源
      最近更新 更多