sql >> Database >  >> RDS >> Oracle

SQL:trigger om te voorkomen dat ongeldige gegevens in een tabel worden ingevoegd

Een insert-statement kan meerdere rijen invoegen. Bijv.:

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;

Deze invoegingen komen in willekeurige volgorde voor, dus u kunt niet echt de ene rij accepteren en de andere niet. In plaats daarvan moet u de hele insert-instructie afwijzen. Hetzelfde geldt natuurlijk voor updates, als dat kan.

Dienovereenkomstig zou je een trigger na de verklaring schrijven waarin je naar de nieuwe situatie in de tabel kijkt.

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;

Als de tabel groot is en u alleen naar ingevoegde/bijgewerkte rijen wilt kijken om deze trigger snel te laten werken, moet u in plaats daarvan een samengestelde trigger schrijven waarbij u boekings-ID's in een array op rijniveau onthoudt en alleen naar deze rijen op instructieniveau.



  1. Oracle Connections en VS2012

  2. Laravel Eloquent vs query builder - Waarom welsprekend gebruiken om de prestaties te verminderen?

  3. mysql aantal records in cursor zonder te herhalen?

  4. Reset automatische ophogingsvolgorde pl-sql