Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

SQL:kích hoạt để ngăn dữ liệu không hợp lệ được chèn vào bảng

Một câu lệnh chèn có thể chèn nhiều hàng. Ví dụ:

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;

Những lần chèn này diễn ra theo thứ tự tùy ý, vì vậy bạn không thể thực sự chấp nhận một hàng và không chấp nhận hàng kia. Thay vào đó, bạn phải từ chối toàn bộ câu lệnh chèn. Tất nhiên, điều này cũng đúng với các bản cập nhật, nếu điều đó có thể được thực hiện.

Theo đó, bạn sẽ viết một kích hoạt câu lệnh sau khi bạn xem xét tình huống mới trong bảng.

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;

Nếu bảng lớn và bạn chỉ muốn xem các hàng được chèn / cập nhật để trình kích hoạt này chạy nhanh, thay vào đó bạn phải viết một trình kích hoạt kết hợp ở nơi bạn nhớ các ID đặt chỗ trong một mảng ở cấp hàng và chỉ xem các hàng này ở cấp câu lệnh.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để kiểm tra các lần xóa trong một bảng nhất định với Oracle?

  2. Cách tìm tên ràng buộc trong Oracle

  3. Cách tạo gói API bảng trong Oracle SQL Developer?

  4. Xác định lỗi với Oracle VPD / RLS

  5. Cố gắng không cần hai giải pháp riêng biệt cho chương trình x86 và x64