Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQL:wyzwalacz zapobiegający wstawianiu nieprawidłowych danych do tabeli

Instrukcja INSERT może wstawić wiele wierszy. Np.:

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;

Te wstawki występują w dowolnej kolejności, więc tak naprawdę nie można zaakceptować jednego wiersza, a drugiego nie. Zamiast tego musisz odrzucić całą instrukcję INSERT. To samo dotyczy oczywiście aktualizacji, jeśli można je wprowadzić.

W związku z tym napisałbyś wyzwalacz po oświadczeniu, w którym patrzysz na nową sytuację w tabeli.

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;

Jeśli tabela jest duża i chcesz przeglądać wstawione/zaktualizowane wiersze tylko po to, aby ten wyzwalacz działał szybko, musisz zamiast tego napisać wyzwalacz złożony, w którym zapamiętujesz identyfikatory rezerwacji w tablicy na poziomie wiersza i patrzysz tylko na te wiersze na poziomie wyciągu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy można używać GROUP BY ze zmiennymi wiązania?

  2. Oracle - Jak wymusić reguły dotyczące relacji w zależności od rekordów atrybutów (prosty przykład)

  3. Zapytanie w celu znalezienia pracowników, którzy skorzystali z więcej niż przysługującego im urlopu w odniesieniu do ich ról zawodowych

  4. Jak dodać kolumnę nie zerową i ograniczenie sprawdzania w jednym wierszu w Oracle 11g?

  5. Oracle XMLTable — pobieranie kolumny z węzła nadrzędnego