Et par problemer med din triggerfunktion:
-
Brug
IF EXISTS (...) THENi stedet for at tælle alle forekomster. Hurtigere, enklere. Se: -
En triggerfunktion
AFTERINSERT OR UPDATEkan bare returnereNULL.RETURN NEWer kun relevant for triggere kaldetBEFORE. Manualen : -
Ubalanceret enkelt citat.
-
Som @Pavel forklarede , kan du ikke kontrollere transaktioner fra en plpgsql-funktion. Enhver ubehandlet undtagelse tvinger hele din transaktion til at blive rullet tilbage automatisk. Så fjern bare
EXCEPTIONblokere.
Din hypotetiske trigger omskrevet:
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;
En BEFORE trigger giver mere mening.
Men a UNIQUE INDEX ON ("Room_Name", "Date") ville gøre det samme, mere effektivt. Derefter rejser enhver række i strid en dubletnøgleundtagelse og ruller transaktionen tilbage (medmindre den fanges og håndteres). I moderne Postgres kan du alternativt springe over eller omdirigere sådan INSERT forsøg med INSERT ... ON CONFLICT ... . Se:
Avanceret brug: