Beberapa masalah dengan fungsi pemicu Anda:
-
Gunakan
IF EXISTS (...) THENbukannya menghitung semua kejadian. Lebih cepat, lebih sederhana. Lihat: -
Fungsi pemicu
AFTERINSERT OR UPDATEhanya dapat mengembalikanNULL.RETURN NEWhanya relevan untuk pemicu yang disebutBEFORE. Manual : -
Kutipan tunggal tidak seimbang.
-
Seperti @Pavel menjelaskan , Anda tidak dapat mengontrol transaksi dari dalam fungsi plpgsql. Pengecualian yang tidak tertangani memaksa seluruh transaksi Anda dibatalkan secara otomatis. Jadi, hapus saja
EXCEPTIONblokir.
Pemicu hipotetis Anda ditulis ulang:
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;
A BEFORE pemicu lebih masuk akal.
Tapi a UNIQUE INDEX ON ("Room_Name", "Date") akan melakukan hal yang sama, lebih efisien. Kemudian, setiap baris yang melanggar memunculkan pengecualian kunci duplikat dan mengembalikan transaksi (kecuali tertangkap dan ditangani). Di Postgres modern, Anda dapat melewatkan atau mengalihkan INSERT seperti itu upaya dengan INSERT ... ON CONFLICT ... . Lihat:
Penggunaan lanjutan: