批量绑定和触发器(Oracle 10g)的问题很少
1)在批量绑定的情况下,行级触发器会执行吗? 2)如果是,那么,是否有任何选项可以仅限批量绑定来执行执行? 3)如果没有,那么有没有办法在批量绑定中执行行级触发? 4)如果行级别触发器执行批量绑定,性能是否会受到阻碍?
答案 0 :(得分:3)
执行批量绑定插入时,仍会启用并触发触发器。你无法阻止它,但当然你可以将自己的逻辑放在触发器中,并且执行批量插入的代码如下所示......
在包装规范中:
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;
答案 1 :(得分:1)
触发器在SQL引擎中执行。批量绑定通过减少调用/语句的数量来影响调用语言(pl / sql或任何OCI语言)调用SQL引擎的方式,但不应绕过任何触发器。
(想象一下,您已经使用触发器向数据库添加了验证,日志记录或其他约束,但第三方应用程序只是通过使用批量操作来绕过它 - 这将是数据损坏和安全问题的处方)
您的语句级触发器应该触发一次。
您可以通过在执行任何其他操作之前检查内存中的会话变量并在批量操作之前明确设置它来“禁用”您的触发器。
行级别触发器仍然会按行进行触发,这可能会产生更大的影响。