Ett par problem med din triggerfunktion:
-
Använd
IF EXISTS (...) THEN
istället för att räkna alla händelser. Snabbare, enklare. Se: -
En triggerfunktion
AFTER
INSERT OR UPDATE
kan bara returneraNULL
.RETURN NEW
är endast relevant för utlösare som kallasBEFORE
. Handboken : -
Obalanserad enkel offert.
-
Som @Pavel förklarade , kan du inte kontrollera transaktioner från en plpgsql-funktion. Alla obehandlade undantag tvingar hela din transaktion att återställas automatiskt. Så ta bara bort
EXCEPTION
blockera.
Din hypotetiska trigger omskriven:
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 är mer vettigt.
Men a UNIQUE INDEX ON ("Room_Name", "Date")
skulle göra detsamma, mer effektivt. Sedan höjer varje rad som bryter mot ett dubblettnyckelundantag och återställer transaktionen (såvida den inte fångas och hanteras). I moderna Postgres kan du alternativt hoppa över eller avleda sådan INSERT
försök med INSERT ... ON CONFLICT ...
. Se:
Avancerad användning: