Několik problémů s funkcí spouštění:
-
Použijte
IF EXISTS (...) THENmísto počítání všech výskytů. Rychlejší, jednodušší. Viz: -
Spouštěcí funkce
AFTERINSERT OR UPDATEstačí vrátitNULL.RETURN NEWje 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
EXCEPTIONblokovat.
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í: