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: