PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PSQLException dan masalah kunci saat pemicu ditambahkan di atas meja

Masalah yang menarik. Ini adalah tebakan terbaik saya. Saya tidak mengujinya.

Secara umum, tebakan terpelajar postgres tentang pernyataan efek apa yang akan terjadi pada data tidak meluas ke logika pemicu. Saat menjalankan pernyataan kedua, postgres melihat batasan kunci asing, dan mengetahui bahwa ia harus memeriksa apakah nilai yang diberikan (dimasukkan) valid, yaitu, jika itu mewakili kunci yang valid dalam tabel asing. Ada kemungkinan, betapapun buruknya, pemicu dapat memengaruhi validitas kunci asing yang diusulkan (misalnya, jika pemicu menghapus catatan).

(kasus 1) Jika tidak ada pemicu, maka dapat melihat data (baik pra-komit dan bertahap untuk komit) dan memutuskan apakah nilai yang diusulkan dijamin valid. (kasus 2) Jika tidak ada kendala FK, maka pemicu tidak dapat mempengaruhi validitas penyisipan, sehingga diperbolehkan. (kasus 3) Jika Anda menghilangkan detail_id=null , tidak ada perubahan dalam pembaruan sehingga pemicu tidak menyala, sehingga keberadaannya tidak relevan.

Saya mencoba menghindari kendala dan pemicu FK bila memungkinkan. Lebih baik, menurut pendapat saya, membiarkan basis data secara tidak sengaja berisi sebagian data yang salah daripada menggantungnya sepenuhnya, seperti yang Anda lihat di sini. Saya akan menghapus semua kendala dan pemicu FK, dan memaksa semua operasi pembaruan dan penyisipan untuk beroperasi melalui fungsi tersimpan, yang melakukan validasi di dalam kunci mulai/komit, dan menangani upaya penyisipan/pembaruan yang salah/tidak valid dengan tepat dan segera, daripada memaksa postgres untuk tunggu perintah 1 untuk melakukan sebelum memutuskan apakah perintah 2 diperbolehkan.

Sunting: lihat pertanyaan ini

Sunting 2 Hal terdekat yang dapat saya temukan untuk dokumentasi resmi seputar waktu pemicu relatif terhadap pemeriksaan kendala adalah ini dari dokumen pemicu

Ini agak tidak jelas, jika pemicu yang terjadi sebelum pemeriksaan kendala berlaku untuk pemeriksaan kendala transaksi lainnya. Apa pun masalahnya, masalah ini adalah bug atau tidak terdokumentasi dengan baik.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa cara terbaik untuk memuat sejumlah besar data ke dalam PostgreSQL?

  2. Rake tugas untuk memotong semua tabel di Rails 3

  3. Cara memasang volume postgresql menggunakan Aws EBS di Kubernete

  4. dplyr left_join kurang dari, lebih besar dari kondisi

  5. Bisakah saya menggunakan Parallel.For dengan Perintah sql?