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

Batalkan operasi penyisipan/perbarui di pemicu menggunakan PL/SQL

Jangan pergi ke sana.

ORA-04091: table XXXX is mutating umumnya merupakan indikator yang baik bahwa apa pun yang Anda coba lakukan terlalu rumit untuk dilakukan dengan andal dengan pemicu.

Tentu, Anda dapat menggunakan variabel array paket dan beberapa pemicu ( aduh!) untuk mengatasi kesalahan ini, tetapi kode Anda kemungkinan besar akan:

  • tidak dapat dipertahankan karena kerumitannya dan sifat pemicu yang tidak dapat diprediksi
  • tidak merespons dengan baik lingkungan multi-pengguna

Inilah sebabnya mengapa Anda harus memikirkan kembali pendekatan Anda ketika Anda menemukan kesalahan ini. Saya menyarankan Anda untuk membangun satu set prosedur yang dikelompokkan dengan baik dalam sebuah paket untuk menangani konsistensi antar-baris. Cabut semua hak istimewa untuk melakukan DML tabel secara langsung dan gunakan hanya prosedur tersebut untuk memodifikasinya.

Misalnya prosedur pembaruan Anda akan menjadi atom proses yang akan:

  1. mendapatkan kunci untuk mencegah pembaruan serentak pada grup baris yang sama (misalnya mengunci catatan kamar di aplikasi reservasi hotel).
  2. periksa apakah baris yang akan disisipkan memvalidasi semua logika bisnis
  3. buat semua DML yang relevan
  4. mengembalikan semua perubahannya (dan hanya perubahannya -- bukan seluruh transaksi) jika terjadi kesalahan (mudah dengan PL/SQL, cukup naikkan kesalahan).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara memilih nilai dalam kolom

  2. Riwayat audit beberapa tabel dalam database

  3. Apakah PS/SQL Oracle memerlukan urutan entri tertentu di bagian `deklarasikan` dari sebuah blok

  4. Lewati objek tipe tabel sebagai parameter input ke Prosedur Tersimpan di Oracle dari C #

  5. Temukan sumber data untuk tabel tertentu - ORACLE