代码之家  ›  专栏  ›  技术社区  ›  Pravin Satav

批量上传和触发

  •  2
  • Pravin Satav  · 技术社区  · 14 年前

    批量绑定和触发的几个问题(Oracle10g)

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Tony Andrews    14 年前

    在执行大容量绑定插入时,仍启用和激发触发器。没有什么内在的东西可以阻止它,但是当然,你可以把你自己的逻辑放在触发器和代码中,这样做的批量插入如下…

    在包装规范中:

    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
  •  1
  •   JulesLt    14 年前

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

    (假设您已使用触发器向数据库添加验证、日志记录或其他约束,但第三方应用程序只需使用批量操作即可绕过它—这将导致数据损坏和安全问题)。

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

    您可以在执行任何其他操作之前让触发器检查内存中的会话变量,并在大容量操作之前显式设置该变量,从而“禁用”触发器。

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