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

Membuat Pemicu

Apa yang Anda miliki di sini adalah batasan tabel lintas baris - yaitu Anda tidak bisa hanya meletakkan satu CONSTRAINT Oracle pada kolom, karena ini hanya dapat melihat data dalam satu baris dalam satu waktu.

Oracle hanya mendukung dua jenis batasan lintas baris - keunikan (misalnya kunci utama dan batasan unik) dan integritas referensial (kunci asing).

Dalam kasus Anda, Anda harus membuat kode sendiri kendala - dan dengan itu muncul tanggung jawab untuk memastikan bahwa kendala tidak dilanggar dengan adanya beberapa sesi, yang masing-masing tidak dapat melihat data yang dimasukkan/diperbarui oleh sesi bersamaan lainnya (setidaknya, sampai mereka berkomitmen).

Pendekatan sederhana adalah menambahkan pemicu yang mengeluarkan kueri untuk menghitung berapa banyak catatan yang bertentangan dengan catatan baru; tetapi ini tidak akan berfungsi karena pemicu tidak dapat melihat baris yang telah disisipkan/diperbarui oleh sesi lain tetapi belum dilakukan; jadi pemicu terkadang mengizinkan anggota untuk menyewa 6 video, selama (misalnya) mereka mendapatkan dua kasir untuk memasukkan data di terminal terpisah.

Satu arah untuk mengatasi masalah ini adalah dengan memasukkan beberapa elemen serialisasi - mis. pemicu pertama-tama akan meminta kunci pada catatan anggota (misalnya dengan SELECT FOR UPDATE) sebelum diizinkan untuk memeriksa persewaan; dengan begitu, jika sesi ke-2 mencoba menyisipkan rental, sesi tersebut akan menunggu hingga sesi pertama melakukan commit atau rollback.

Cara lain mengatasi masalah ini adalah dengan menggunakan Tampilan Terwujud agregasi, yang akan didasarkan pada kueri yang dirancang untuk menemukan baris apa pun yang gagal dalam pengujian; harapannya adalah bahwa MV akan kosong, dan Anda menempatkan batasan tabel pada MV sedemikian rupa sehingga jika suatu baris muncul di MV, batasan tersebut akan dilanggar. Efeknya adalah setiap pernyataan yang mencoba menyisipkan baris yang melanggar batasan akan menyebabkan pelanggaran batasan saat MV di-refresh.

Menulis kueri untuk ini berdasarkan desain Anda diserahkan sebagai latihan untuk pembaca :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL- Tandai catatan berdasarkan tanggal catatan vs riwayat

  2. Kesalahan Baru di boot musim semi 2.3.0.RELEASE :UnsatisfiedDependencyException untuk Oracle 12.2.0.1 jdbcdriver tetapi tidak dengan jdbcdriver mysql

  3. Pengecualian io:Kesalahan Oracle ORA-12650 setelah memutakhirkan Oracle ke 12g

  4. Pembulatan ke 2 tempat desimal dalam SQL

  5. Mengurai nama tabel dan kolom dari SQL/HQL Java