很少的用於批量綁定和觸發器(Oracle 10g中)批量上傳並觸發
1)的問題將行級觸發器中的批量綁定情況下執行?
2)如果是,那麼是否有任何選項僅對批量綁定抑制執行?
3)如果沒有,那麼有沒有辦法在批量綁定中執行行級觸發器?
4)如果行級別觸發器執行批量綁定,性能是否會受到影響?
很少的用於批量綁定和觸發器(Oracle 10g中)批量上傳並觸發
1)的問題將行級觸發器中的批量綁定情況下執行?
2)如果是,那麼是否有任何選項僅對批量綁定抑制執行?
3)如果沒有,那麼有沒有辦法在批量綁定中執行行級觸發器?
4)如果行級別觸發器執行批量綁定,性能是否會受到影響?
執行批量綁定插入操作時,觸發器仍處於啓用狀態並觸發。沒有什麼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;
觸發器在SQL引擎中執行。批量綁定影響調用語言(pl/sql或任何OCI語言)通過減少調用/語句的數量調用SQL引擎的方式,但不應繞過任何觸發器。 (假設您已經使用觸發器向數據庫添加了驗證,日誌記錄或其他約束,但第三方應用程序僅通過使用批量操作就可以繞過它 - 這將成爲數據損壞和安全問題的祕訣)。
您的語句級別觸發器應該觸發一次。
您可以在做任何事情之前先檢查內存中的會話變量來「禁用」觸發器,並在批量操作之前明確地設置它。
行級觸發器仍然會以每行爲基礎觸發,這可能會產生更多影響。
我知道只有一種方法可以避免啓用行級別或語句級別的觸發器;在直接路徑模式下使用SQL * Loader。 – 2010-09-07 14:49:01
我的意思是批量綁定。 – 2010-09-06 15:03:07
我已經更新了我的答案。 – 2010-09-06 15:17:01