2010-09-06 69 views
2

很少的用于批量绑定和触发器(Oracle 10g中)批量上传并触发

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

回答

3

执行批量绑定插入操作时,触发器仍处于启用状态并触发。没有什么intinsic可以做,以制止,当然,你可以把自己的逻辑触发,并且不会将批量插入类似如下的代码...

在包装规格:

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; 
+0

我的意思是批量绑定。 – 2010-09-06 15:03:07

+0

我已经更新了我的答案。 – 2010-09-06 15:17:01

1

触发器在SQL引擎中执行。批量绑定影响调用语言(pl/sql或任何OCI语言)通过减少调用/语句的数量调用SQL引擎的方式,但不应绕过任何触发器。 (假设您已经使用触发器向数据库添加了验证,日志记录或其他约束,但第三方应用程序仅通过使用批量操作就可以绕过它 - 这将成为数据损坏和安全问题的秘诀)。

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

您可以在做任何事情之前先检查内存中的会话变量来“禁用”触发器,并在批量操作之前明确地设置它。

行级触发器仍然会以每行为基础触发,这可能会产生更多影响。

+0

我知道只有一种方法可以避免启用行级别或语句级别的触发器;在直接路径模式下使用SQL * Loader。 – 2010-09-07 14:49:01