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

Apakah ini mungkin di Oracle/Sql?

Beberapa komentar tentang DDL yang Anda posting.

  • Tidak ada AUTOINCREMENT kata kunci di Oracle. Anda harus membuat urutan (umumnya satu urutan per tabel) dan menggunakan NEXTVAL dari urutan baik di INSERT pernyataan itu sendiri atau dalam pemicu untuk mengisi kunci utama sintetis.
  • Tidak ada yang membuat VENUE_NO kolom di EVENT_DETAILS . Saya berasumsi DDL Anda yang sebenarnya mendefinisikan kolom itu.

Anda tidak dapat menerapkan ini melalui CHECK sederhana paksaan. Anda dapat membuat pemicu

CREATE OR REPLACE TRIGGER validate_capacity
  BEFORE INSERT OR UPDATE ON event_details
  FOR EACH ROW
DECLARE
  l_venue_capacity venue.capacity%type;
BEGIN
  SELECT capacity
    INTO l_venue_capacity
    FROM venue
   WHERE venue_no = :new.venue_no;

  IF( l_venue_capacity < :new.no_players )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Sorry, the venue has insufficient capacity' );
  END IF;
END;

Namun, perlu diketahui bahwa

  • Anda juga harus memiliki pemicu di VENUE tabel yang memeriksa untuk melihat apakah perubahan kapasitas tempat menyebabkan acara tertentu menjadi tidak valid. Secara umum, itu akan membutuhkan semacam tanggal di tabel detail acara karena, mungkin, kapasitas tempat dapat berubah dari waktu ke waktu dan Anda benar-benar hanya ingin validasi untuk memeriksa acara mendatang di tempat itu.
  • Solusi berbasis pemicu tidak akan selalu berfungsi di lingkungan multi-pengguna. Bayangkan tempat 1 memiliki kapasitas 30. Sekarang, sesi A memperbarui kapasitas itu menjadi 15. Namun sebelum sesi A dijalankan, sesi B menyisipkan acara dengan NO_PLAYERS dari 20. Pemicu sesi tidak akan melihat masalah sehingga kedua perubahan akan diizinkan. Tetapi begitu kedua sesi dilakukan, akan ada acara yang dipesan dengan 20 pemain di tempat yang hanya mendukung 15 pemain. Pemicu pada EVENT_DETAILS berpotensi mengunci baris di VENUE tabel untuk menghindari kondisi balapan ini tetapi Anda membuat serial sisipan dan pembaruan pada EVENT_DETAILS tabel yang bisa menjadi masalah kinerja terutama jika aplikasi Anda pernah menunggu input manusia sebelum melakukan transaksi.

Sebagai alternatif pemicu, Anda dapat membuat ON COMMIT tampilan terwujud yang menggabungkan dua tabel bersama-sama dan menempatkan CHECK kendala pada pandangan yang terwujud yang memberlakukan persyaratan bahwa jumlah pemain tidak dapat melebihi kapasitas tempat. Itu akan bekerja di lingkungan multi-pengguna tetapi membutuhkan log tampilan yang terwujud di kedua tabel dasar dan itu memindahkan pemeriksaan ke titik di mana sesi dilakukan yang bisa sedikit rumit. Sebagian besar aplikasi tidak mempertimbangkan kemungkinan bahwa COMMIT pernyataan bisa gagal sehingga menangani pengecualian itu bisa rumit. Dan dari sudut pandang antarmuka pengguna, mungkin agak sulit untuk menjelaskan kepada pengguna apa masalahnya karena pengecualian mungkin terkait dengan perubahan yang dibuat jauh lebih awal dalam transaksi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah penggabungan

  2. Masalah Oracle Create View

  3. Pernyataan SQL untuk bergabung dan memberikan hasil dalam beberapa kolom

  4. Pengidentifikasi terlalu panjang di Oracle

  5. susunan sql oracle