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

SQL:pemicu untuk mencegah data yang tidak valid dimasukkan ke dalam tabel

Pernyataan insert dapat menyisipkan beberapa baris. Mis.:

insert into booking(booking_start, booking_end, booking_room, guest_no)
select date '2019-11-01', date '2019-11-10', 4, 10 from dual
union all
select date '2019-11-08', date '2019-11-15', 4, 88 from dual;

Sisipan ini muncul dalam urutan arbitrer, jadi Anda tidak dapat benar-benar menerima satu baris dan bukan baris lainnya. Sebaliknya Anda harus menolak seluruh pernyataan insert. Hal yang sama tentu saja berlaku untuk pembaruan, jika hal itu dapat dilakukan.

Oleh karena itu, Anda akan menulis pemicu pernyataan setelah di mana Anda melihat situasi baru di tabel.

CREATE OR REPLACE TRIGGER trg_reject_invalid_bookings
AFTER INSERT OR UPDATE ON booking
DECLARE
  v_count INTEGER;
BEGIN
  SELECT count(*)
  INTO v_count
  FROM booking b1
  WHERE EXISTS
  (
    SELECT *
    FROM booking b2
    WHERE b2.booking_id <> b1.booking_id
    AND b2.booking_room = b1.booking_room
    AND b2.booking_start < b1.booking_end
    AND b2.booking_end > b1.booking_start
  )
  AND rownum = 1; -- it suffices to find one overlapping pair

  IF v_count > 0 THEN
    raise_application_error(-20000, 'Invalid booking');
  END IF;
END trg_reject_invalid_bookings;

Jika tabelnya besar dan Anda ingin melihat baris yang disisipkan/diperbarui hanya agar pemicu ini berjalan cepat, Anda harus menulis pemicu gabungan di mana Anda mengingat ID pemesanan dalam larik pada tingkat baris dan hanya melihat di baris ini pada tingkat pernyataan.



  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 :stempel waktu di mana klausa

  2. Kuis MCQ Online PL/SQL

  3. String dipisahkan koma ke daftar

  4. Bagaimana cara menghapus duplikat dari daftar yang dipisahkan ruang oleh Oracle regexp_replace?

  5. Bergabunglah dengan Forum Tanya Jawab untuk Pengembang