2011-02-10 150 views
2

試圖探索替代使用插入觸發器的解決方案。像基於API的方法和利用不同方法的優點和缺點。擺脫插入觸發器

+0

如果你想我們展示一些代碼,請通過展示你有什麼迄今啓動。 – 2011-02-10 08:54:00

+0

也許觸發器需要進行性能調整。 – HLGEM 2011-02-16 14:30:32

回答

3

在API接近你會創建一個過程來進行這兩種操作 - 這樣的:

package body emp_api is 

    procedure insert_emp (...) is 
    begin 
     insert into emp (...) values (...); 
     -- Insert that was previously in trigger 
     insert into other_table (...) values (...); 
    end; 
end; 

然後你應用程序,給他們EXECUTE的API包,但沒有INSERT訪問使用API/UPDATE/DELETE訪問表。

+0

當然,您需要進行測量以確保這種方法實際上更快。 – HLGEM 2011-02-16 14:30:15

0

如果你想保證在插入tableA的時候有一條記錄插入tableB,那麼保持觸發器。如果批量加載到tableA中,並且可以保證在此期間將唯一的進程加載到該表中,則可以禁用該功能。

只要您刪除觸發器,就沒有關於插入到tableB的任何保證。你唯一的希望是,任何和所有可能插入到tableA中的程序(你是否真的知道所有這些?)都堅持把二級插入到tableB中。這是「通過公司策略實現的數據完整性」,而不是通過Oracle執行的數據完整性。

這種方法取決於你有多少關心tableB中數據的狀態我想。

我不會去表apis(TAPIs)的路由,它現在強制任何/所有操作通過處理邏輯的一些pl/sql api。根據我的經驗,這些幾乎總是很慢且很麻煩。

0

在DDL中您可以使用ALTER TRIGGER或ALTER TABLE禁用觸發器。

ALTER TRIGGER triggername DISABLE; -- disable a single trigger 

ALTER TABLE tablename DISABLE ALL TRIGGERS; -- disable all triggers on a table 

要在運行時做到這一點,你就必須使用動態SQL,並在程序運行時必須擁有該表或其他有必要的特權模式。

EXECUTE IMMEDIATE 'ALTER TRIGGER tablename DISABLE ALL TRIGGERS'; 

有關啓用/禁用觸發器的詳細信息,請參閱http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/general004.htm