Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tôi có thể vô hiệu hóa một trình kích hoạt bên trong một trình kích hoạt trong oracle không?

Đâ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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tra cứu LDAP bằng ODP.NET, Managed Driver Beta (Oracle.ManagedDataAccess.dll) không thành công trong ứng dụng C #

  2. làm thế nào để giải quyết Bị trừ một từ cuộc gọi đã đọc trong oracle 11g jdbc 7/14 jdk 1.7?

  3. UTL_FILE.WRITE_ERROR khi gọi utl_file.put trong một vòng lặp

  4. [01000] [unixODBC] [Trình quản lý trình điều khiển] Không thể mở lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so':không tìm thấy tệp

  5. SQL Cách chọn mục ngày gần đây nhất