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

क्या मैं ऑरैकल में ट्रिगर के अंदर ट्रिगर अक्षम कर सकता हूं?

इस तरह मैंने प्रश्न को समझा। देखें कि क्या यह मदद करता है।

नमूना तालिकाएँ:

SQL> create table test (id number);

Table created.

SQL> create table test_2 (id number);

Table created.

test_2 . पर एक ट्रिगर जो इन्सर्ट को रोकता है:

SQL> create or replace trigger trg2
  2    before insert or update on test_2
  3    for each row
  4  begin
  5    raise_application_error(-20000, 'Not allowed');
  6  end;
  7  /

Trigger created.

क्या यह काम करता है?

SQL> insert into test_2 (id) values (1);
insert into test_2 (id) values (1)
            *
ERROR at line 1:
ORA-20000: Not allowed
ORA-06512: at "SCOTT.TRG2", line 2
ORA-04088: error during execution of trigger 'SCOTT.TRG2'

हाँ, यह काम करता है।

अब, test . पर एक ट्रिगर जो माना जाता है a) अक्षम trg2 ट्रिगर और बी) test_2 . में मान डालें . तब एक सीधा कोड होगा

SQL> create or replace trigger trg1
  2    before insert on test
  3    for each row
  4  begin
  5    execute immediate 'alter trigger trg2 disable';
  6    insert into test_2 (id) values (:new.id);
  7  end;
  8  /

Trigger created.

आइए इसका परीक्षण करें:

SQL> insert into test (id) values (1);
insert into test (id) values (1)
            *
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SCOTT.TRG1", line 2
ORA-04088: error during execution of trigger 'SCOTT.TRG1'

आह। COMMITनहीं कर सकते एक ट्रिगर में। कहाँ है? डायनेमिक SQL के alter trigger . में - यह एक डीडीएल है और यह परोक्ष रूप से प्रतिबद्ध है। इसे कैसे जोड़ेंगे? इसे (एक ट्रिगर) एक स्वायत्त लेनदेन बनाएं:

SQL> create or replace trigger trg1
  2    before insert on test
  3    for each row
  4  declare
  5    pragma autonomous_transaction;
  6  begin
  7    execute immediate 'alter trigger trg2 disable';
  8    insert into test_2 (id) values (:new.id);
  9  end;
 10  /

Trigger created.

SQL> insert into test (id) values (1);
insert into test (id) values (1)
            *
ERROR at line 1:
ORA-06519: active autonomous transaction detected and rolled back
ORA-06512: at "SCOTT.TRG1", line 6
ORA-04088: error during execution of trigger 'SCOTT.TRG1'

यह एक और त्रुटि है; यह कहता है कि - यदि हमारे पास एक स्वायत्त लेनदेन है - हमें या तो प्रतिबद्ध होना होगा या वापस रोल करना होगा। आइए प्रतिबद्ध हैं (क्योंकि शायद यही आप करना चाहते हैं):

SQL> create or replace trigger trg1
  2    before insert on test
  3    for each row
  4  declare
  5    pragma autonomous_transaction;
  6  begin
  7    execute immediate 'alter trigger trg2 disable';
  8    insert into test_2 (id) values (:new.id);
  9    commit;
 10  end;
 11  /

Trigger created.

SQL> insert into test (id) values (100);

1 row created.

SQL> select * From test;

        ID
----------
       100

SQL> select * from test_2;

        ID
----------
       100

SQL>

सही; अब यह काम करता है

मेरा सुझाव है कि आप अपने प्रश्न के नीचे पोस्ट की गई टिप्पणियों को दोबारा पढ़ें, यह उदाहरण देखें और चुनें कि क्या करना है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle pl/sql . में तालिका बनाएं या बदलें

  2. ओरेकल क्वेरी का उपयोग करके एक्सएमएल डेटा निकालें

  3. dbms_output बफर कैसे बढ़ाएं?

  4. जावा का उपयोग करके Oracle डेटाबेस में IN और OUT पैरामीटर के संग्रहीत फ़ंक्शन को कैसे कॉल करें?

  5. ओरेकल में विश्लेषणात्मक कार्यों का उपयोग कैसे करें (कीवर्ड द्वारा विभाजन पर)