इस तरह मैंने प्रश्न को समझा। देखें कि क्या यह मदद करता है।
नमूना तालिकाएँ:
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>
सही; अब यह काम करता है ।
मेरा सुझाव है कि आप अपने प्रश्न के नीचे पोस्ट की गई टिप्पणियों को दोबारा पढ़ें, यह उदाहरण देखें और चुनें कि क्या करना है।