Đây là cách tôi hiểu câu hỏi. Xem nó có hữu ích không.
Các bảng mẫu:
SQL> create table test (id number);
Table created.
SQL> create table test_2 (id number);
Table created.
Trình kích hoạt trên test_2
ngăn chặn việc chèn:
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.
Nó có hoạt động không?
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'
Có, nó hoạt động.
Bây giờ, một trình kích hoạt trên test
được cho là a) vô hiệu hóa trg2
kích hoạt và b) chèn giá trị vào test_2
. Một mã đơn giản sau đó sẽ là
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.
Hãy kiểm tra nó:
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'
Aha. Không thể COMMIT
trong một trình kích hoạt. No ở đâu? Trong alter trigger
của SQL động - nó là một DDL và nó hoàn toàn cam kết. Làm thế nào để "sửa chữa" nó? Làm cho nó (một trình kích hoạt) trở thành một giao dịch tự trị:
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'
Đó là một lỗi khác; nó nói rằng - nếu chúng ta có một giao dịch tự trị - chúng ta phải cam kết hoặc quay trở lại. Hãy cam kết (vì đó có thể là điều bạn muốn làm):
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>
Đúng; bây giờ nó hoạt động .
Tôi khuyên bạn nên đọc lại các bình luận được đăng bên dưới câu hỏi của bạn, xem ví dụ này và chọn những gì cần làm.