Několik problémů s funkcí spouštění:
-
Použijte
IF EXISTS (...) THEN
místo počítání všech výskytů. Rychlejší, jednodušší. Viz: -
Spouštěcí funkce
AFTER
INSERT OR UPDATE
stačí vrátitNULL
.RETURN NEW
je relevantní pouze pro spouštěče zvanéBEFORE
. Příručka : -
Nevyvážená jednoduchá citace.
-
Jak @Pavel vysvětlil , nemůžete řídit transakce z funkce plpgsql. Jakákoli neošetřená výjimka vynutí automatické vrácení celé transakce. Stačí tedy odstranit
EXCEPTION
blokovat.
Váš hypotetický spouštěč přepsán:
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
spoušť dává větší smysl.
Ale a UNIQUE INDEX ON ("Room_Name", "Date")
by udělal totéž, efektivněji. Potom jakýkoli řádek v porušení vyvolá výjimku duplicitního klíče a vrátí transakci (pokud není zachycen a zpracován). V moderním Postgresu můžete alternativně přeskočit nebo odklonit takové INSERT
pokusy s INSERT ... ON CONFLICT ...
. Viz:
Pokročilé použití: