Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ट्रिगर अक्षम करें और ट्रिगर को फिर से सक्षम करें लेकिन इस बीच तालिका परिवर्तन से बचें

थोड़ा अलग तरीका यह है कि ट्रिगर्स को सक्षम रखा जाए लेकिन 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);

रिमोट कॉल करने से थोड़ी भिन्नता है, लेकिन मैं कुछ बार दौड़ा और यह स्पष्ट है कि एक सादे ट्रिगर के साथ दौड़ना बैच सेट के बिना बाधित ट्रिगर के साथ चलने के समान है, और दोनों ट्रिगर के बिना या बिना चलने की तुलना में बहुत धीमे हैं बैच सेट के साथ विवश ट्रिगर। मेरे परीक्षण में परिमाण अंतर का क्रम है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ब्लॉब पर अलग चुनें

  2. pl/sql संग्रहीत प्रोग्राम टेक्स्ट के बारे में प्रश्न

  3. Oracle 11 इंडेक्स केवल डेटा के भाग के लिए

  4. Oracle से JDBC- अनुरूप डेटाबेस को पाई जितना आसान क्यों नहीं क्वेरी कर रहा है?

  5. Oracle IN कंडीशन के अंदर एक स्ट्रिंग का उपयोग करता है