Een paar problemen met je triggerfunctie:
-
Gebruik
IF EXISTS (...) THEN
in plaats van alle gebeurtenissen te tellen. Sneller, eenvoudiger. Zie: -
Een triggerfunctie
AFTER
INSERT OR UPDATE
kan gewoonNULL
retourneren .RETURN NEW
is 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
EXCEPTION
blok.
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: