Kemungkinan penyebab kesalahan tabel mutasi adalah penyalahgunaan pemicu. Berikut ini adalah contoh khas:
- Anda memasukkan baris di tabel A
- pemicu pada tabel A (untuk setiap baris) mengeksekusi kueri pada tabel A, misalnya untuk menghitung kolom ringkasan
- Oracle melempar ORA-04091: table A bermutasi, trigger / function mungkin tidak melihatnya
Ini adalah perilaku yang diharapkan dan normal, Oracle ingin melindungi Anda dari diri Anda karena Oracle menjamin:
- (i) bahwa setiap pernyataan adalah atomik (yaitu akan gagal atau berhasil sepenuhnya)
- (ii) bahwa setiap pernyataan melihat tampilan data yang konsisten
Kemungkinan besar saat Anda menulis pemicu seperti ini, Anda akan mengharapkan kueri (2) untuk melihat baris yang dimasukkan pada (1). Ini akan bertentangan dengan kedua poin di atas karena pembaruan belum selesai (mungkin ada lebih banyak baris yang akan dimasukkan).
Oracle dapat mengembalikan hasil yang konsisten dengan titik waktu tepat sebelum awal pernyataan tetapi dari sebagian besar contoh yang saya lihat bahwa mencoba menerapkan logika ini, orang melihat pernyataan multi-baris sebagai seri langkah-langkah berturut-turut dan mengharapkan pernyataan [2] untuk melihat perubahan yang dilakukan oleh langkah sebelumnya. Oracle tidak dapat mengembalikan hasil yang diharapkan dan karena itu melempar kesalahan.
Untuk bacaan lebih lanjut: "meja bermutasi" di Ask Tom .
Jika seperti yang saya duga penyebab kesalahan tabel bermutasi adalah pemicu, salah satu cara untuk menghindari kesalahan adalah dengan memindahkan logika dari pelatuk ke dalam prosedur.