Beberapa komentar tentang DDL yang Anda posting.
- Tidak ada
AUTOINCREMENT
kata kunci di Oracle. Anda harus membuat urutan (umumnya satu urutan per tabel) dan menggunakanNEXTVAL
dari urutan baik diINSERT
pernyataan itu sendiri atau dalam pemicu untuk mengisi kunci utama sintetis. - Tidak ada yang membuat
VENUE_NO
kolom 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
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 padaEVENT_DETAILS
berpotensi mengunci baris diVENUE
tabel untuk menghindari kondisi balapan ini tetapi Anda membuat serial sisipan dan pembaruan padaEVENT_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.