थोड़ा अलग तरीका यह है कि ट्रिगर्स को सक्षम रखा जाए लेकिन when
जोड़कर उनके प्रभाव को कम किया जाए (यदि पूरी तरह से हटाया नहीं गया है) खंड कुछ इस तरह:
create or replace trigger ...
...
for each row
when (sys_context('userenv', 'client_info') is null
or sys_context('userenv', 'client_info') != 'BATCH')
declare
...
begin
...
end;
/
फिर अपनी प्रक्रिया में पर कॉल जोड़ें प्रारंभ आपके 'अक्षम ट्रिगर' चरण के रूप में:
dbms_application_info.set_client_info('BATCH');
और अंत में इसे फिर से साफ़ करें, बस अगर सत्र को जीवित छोड़ दिया जाता है और पुन:उपयोग किया जाता है (ताकि आप इसे अपवाद हैंडलर में भी करना चाहें):
dbms_application_info.set_client_info(null);
आप मॉड्यूल, या क्रिया, या संयोजन का भी उपयोग कर सकते हैं। जबकि वह सेटिंग चालू है, तब भी ट्रिगर का मूल्यांकन किया जाएगा, लेकिन आग नहीं लगेगी, इसलिए अंदर होने वाली कोई भी चीज़ छोड़ दी जाएगी - ट्रिगर बॉडी नहीं चलती है, क्योंकि दस्तावेज़ डाल दो।
यह मूर्खतापूर्ण नहीं है क्योंकि वास्तव में अन्य उपयोगकर्ताओं/एप्लिकेशन को समान कॉल करने से कोई रोक नहीं रहा है, लेकिन यदि आप अधिक वर्णनात्मक स्ट्रिंग और/या सेटिंग्स का संयोजन चुनते हैं, तो इसे जानबूझकर करना होगा - और मुझे लगता है कि आप अधिकतर हैं हादसों से चिंतित हैं बुरे अभिनेता नहीं।
एक व्यर्थ ट्रिगर के साथ त्वरित गति परीक्षण जो चीजों को थोड़ा धीमा कर देता है।
create table t42 (id number);
-- no trigger
insert into t42 (id) select level from dual connect by level <= 10000;
10,000 rows inserted.
Elapsed: 00:00:00.050
create or replace trigger tr42 before insert on t42 for each row
declare
dt date;
begin
select sysdate into dt from dual;
end;
/
-- plain trigger
insert into t42 (id) select level from dual connect by level <= 10000;
10,000 rows inserted.
Elapsed: 00:00:00.466
create or replace trigger tr42 before insert on t42 for each row
when (sys_context('userenv', 'client_info') is null
or sys_context('userenv', 'client_info') != 'BATCH')
declare
dt date;
begin
select sysdate into dt from dual;
end;
/
-- userenv trigger, not set
insert into t42 (id) select level from dual connect by level <= 10000;
10,000 rows inserted.
Elapsed: 00:00:00.460
- userenv trigger, set to BATCH
exec dbms_application_info.set_client_info('BATCH');
insert into t42 (id) select level from dual connect by level <= 10000;
10,000 rows inserted.
Elapsed: 00:00:00.040
exec dbms_application_info.set_client_info(null);
रिमोट कॉल करने से थोड़ी भिन्नता है, लेकिन मैं कुछ बार दौड़ा और यह स्पष्ट है कि एक सादे ट्रिगर के साथ दौड़ना बैच सेट के बिना बाधित ट्रिगर के साथ चलने के समान है, और दोनों ट्रिगर के बिना या बिना चलने की तुलना में बहुत धीमे हैं बैच सेट के साथ विवश ट्रिगर। मेरे परीक्षण में परिमाण अंतर का क्रम है।