Een paar problemen met je triggerfunctie:
-
Gebruik
IF EXISTS (...) THENin plaats van alle gebeurtenissen te tellen. Sneller, eenvoudiger. Zie: -
Een triggerfunctie
AFTERINSERT OR UPDATEkan gewoonNULLretourneren .RETURN NEWis alleen relevant voor triggers genaamdBEFORE. De handleiding : -
Onevenwichtige enkele quote.
-
Zoals @Pavel uitgelegd , kunt u transacties niet beheren vanuit een plpgsql-functie. Elke onverwerkte uitzondering dwingt uw hele transactie automatisch terug te draaien. Dus verwijder gewoon de
EXCEPTIONblok.
Je hypothetische trigger herschreven:
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;
Een BEFORE trigger is logischer.
Maar a UNIQUE INDEX ON ("Room_Name", "Date") hetzelfde zou doen, efficiënter. Vervolgens genereert elke regel in overtreding een dubbele sleuteluitzondering en wordt de transactie teruggedraaid (tenzij gevangen en afgehandeld). In het moderne Postgres kunt u dergelijke INSERT . ook overslaan of omleiden pogingen met INSERT ... ON CONFLICT ... . Zie:
Geavanceerd gebruik: