Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bisakah saya menonaktifkan pemicu di dalam pemicu di Oracle?

Ini adalah bagaimana saya memahami pertanyaan itu. Lihat apakah itu membantu.

Tabel contoh:

SQL> create table test (id number);

Table created.

SQL> create table test_2 (id number);

Table created.

Pemicu pada test_2 yang mencegah penyisipan:

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.

Apakah itu berhasil?

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'

Ya, berhasil.

Sekarang, pemicu pada test yang seharusnya a) menonaktifkan trg2 pemicu dan b) masukkan nilai ke dalam test_2 . Kode langsung akan menjadi

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.

Mari kita uji:

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. Tidak dapat COMMIT dalam sebuah pemicu. Dimana itu? Dalam alter trigger SQL dinamis - ini adalah DDL dan secara implisit berkomitmen. Bagaimana memperbaikinya? Jadikan (pemicu) transaksi otonom:

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'

Itu kesalahan lain; dikatakan bahwa - jika kita memiliki transaksi otonom - kita harus melakukan atau memutar kembali. Mari berkomitmen (karena mungkin itulah yang ingin Anda lakukan):

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>

Benar; sekarang berfungsi .

Saya sarankan Anda membaca kembali komentar yang diposting di bawah pertanyaan Anda, lihat contoh ini dan pilih apa yang harus dilakukan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membuat pemicu di Oracle Express

  2. Menjalankan pernyataan sql dinamis menjadi SYS_REFCURSOR

  3. ORA-12505, TNS:pendengar saat ini tidak mengetahui SID yang diberikan dalam koneksi des

  4. Bagaimana cara mendapatkan kunci yang dihasilkan dari sisipan batch JDBC di Oracle?

  5. Bagaimana cara mengembalikan baris berdasarkan pengguna database dan isi tabel?