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

Giao dịch khôi phục khi kích hoạt ERROR

Một số vấn đề với chức năng kích hoạt của bạn:

  • Sử dụng IF EXISTS (...) THEN thay vì đếm tất cả các lần xuất hiện. Nhanh hơn, đơn giản hơn. Xem:

  • Hàm kích hoạt AFTER INSERT OR UPDATE chỉ có thể trả về NULL . RETURN NEW chỉ phù hợp với các trình kích hoạt được gọi là BEFORE . Hướng dẫn sử dụng :

  • Trích dẫn đơn lẻ không cân bằng.

  • Như @Pavel đã giải thích , bạn không thể kiểm soát các giao dịch từ bên trong một hàm plpgsql. Bất kỳ ngoại lệ nào không được xử lý buộc toàn bộ giao dịch của bạn được tự động quay trở lại. Vì vậy, chỉ cần xóa EXCEPTION khối.

Trình kích hoạt giả định của bạn đã được viết lại:

CREATE OR REPLACE FUNCTION check_room()
  RETURNS TRIGGER AS
$func$
BEGIN
   IF EXISTS (
         SELECT FROM "Sesion"    -- are you sure it's not "Session"?
         WHERE  "Room_Name" = NEW."Room_Name"
         AND    "Date" = NEW."Date") THEN
     RAISE EXCEPTION 'The room is rented at that date';
   END IF;
   RETURN NULL;
END
$func$  LANGUAGE plpgsql;

Đ BEFORE kích hoạt có ý nghĩa hơn.

Nhưng một UNIQUE INDEX ON ("Room_Name", "Date") sẽ làm như vậy, hiệu quả hơn. Sau đó, bất kỳ hàng nào vi phạm sẽ tạo ra một ngoại lệ khóa trùng lặp và khôi phục giao dịch (trừ khi bị bắt và xử lý). Trong Postgres hiện đại, bạn có thể bỏ qua hoặc chuyển hướng INSERT như vậy thử với INSERT ... ON CONFLICT ... . Xem:

Cách sử dụng nâng cao:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. IServiceCollection không chứa định nghĩa hoặc phần mở rộng cho AddNpgsql

  2. Ký tự đại diện tiền tố postgresql cho toàn văn

  3. .NET Core ghi nhật ký vào PostgreSQL DB bằng NLog

  4. Rails 4 custom 404 gây ra lỗi kết nối postgresql trên Heroku

  5. Hiệu suất chậm quét tuần tự Postgresql trên 500 triệu hàng