Et par problemer med din triggerfunktion:
-
Brug
IF EXISTS (...) THEN
i stedet for at tælle alle forekomster. Hurtigere, enklere. Se: -
En triggerfunktion
AFTER
INSERT OR UPDATE
kan bare returnereNULL
.RETURN NEW
er 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
EXCEPTION
blokere.
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: