Beberapa komentar tentang DDL yang Anda posting.
- Tidak ada
AUTOINCREMENTkata kunci di Oracle. Anda harus membuat urutan (umumnya satu urutan per tabel) dan menggunakanNEXTVALdari urutan baik diINSERTpernyataan itu sendiri atau dalam pemicu untuk mengisi kunci utama sintetis. - Tidak ada yang membuat
VENUE_NOkolom diEVENT_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
VENUEtabel 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_PLAYERSdari 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 padaEVENT_DETAILSberpotensi mengunci baris diVENUEtabel untuk menghindari kondisi balapan ini tetapi Anda membuat serial sisipan dan pembaruan padaEVENT_DETAILStabel 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.