2010-09-06 73 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