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

Saya memiliki pemicu otonom tetapi hanya mengeksekusi satu kali dalam sesi yang sama

Anda menggunakan transaksi otonom untuk mengatasi fakta bahwa pemicu tidak dapat menanyakan tabelnya sendiri. Anda telah mengalami kesalahan tabel mutasi yang terkenal dan Anda telah menemukan bahwa mendeklarasikan pemicu sebagai transaksi otonom membuat kesalahan hilang.

Tidak beruntung untuk Anda, ini tidak menyelesaikan masalah sama sekali:

  • Pertama, semua logika transaksi hilang. Anda tidak dapat mengembalikan perubahan pada suscription_fact tabel, mereka berkomitmen , sedangkan transaksi utama Anda tidak dan dapat dibatalkan. Jadi, Anda juga kehilangan integritas data Anda.
  • Pemicu tidak dapat melihat baris baru karena baris baru belum di-commit! Karena pemicu berjalan dalam transaksi independen, pemicu tidak dapat melihat perubahan tanpa komitmen yang dibuat oleh transaksi utama:Anda akan mendapatkan hasil yang sepenuhnya salah.

Inilah sebabnya mengapa Anda tidak boleh melakukan logika bisnis apa pun dalam transaksi otonom. (ada aplikasi yang sah tetapi hampir seluruhnya terbatas pada logging/debugging).

Dalam kasus Anda, Anda harus:

  1. Perbarui logika Anda sehingga tidak perlu mengkueri tabel Anda (memperbarui suscription_fact hanya jika baris baru lebih baru daripada nilai lama yang disimpan di id_date_unsuscription ).
  2. Lupakan penggunaan logika bisnis di pemicu dan gunakan prosedur yang memperbarui semua tabel dengan benar atau gunakan tampilan karena di sini kita memiliki kasus data yang berlebihan.
  3. Gunakan solusi yang benar-benar berfungsi (oleh Tom Kyte) .

Saya akan sangat menyarankan menggunakan (2) di sini. Jangan gunakan pemicu untuk mengkode logika bisnis. Mereka sulit untuk ditulis tanpa bug dan lebih sulit lagi untuk dipertahankan. Menggunakan prosedur menjamin bahwa semua kode yang relevan dikelompokkan di satu tempat (paket atau prosedur), mudah dibaca dan diikuti dan tanpa konsekuensi yang tidak terduga.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menemukan dependensi di dalam paket Oracle?

  2. Contoh Kumpulkan Massal Oracle Menggunakan Objek Tipe Baris Kursor

  3. kiri luar bergabung dengan nilai nol

  4. TNSPING OK tapi sqlplus memberikan ORA-12154?

  5. Bagaimana cara menghitung jumlah kolom dalam tabel menggunakan SQL?