Beberapa masalah dengan fungsi pemicu Anda:
-
Gunakan
IF EXISTS (...) THEN
bukannya menghitung semua kejadian. Lebih cepat, lebih sederhana. Lihat: -
Fungsi pemicu
AFTER
INSERT OR UPDATE
hanya dapat mengembalikanNULL
.RETURN NEW
hanya 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
EXCEPTION
blokir.
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: