Un paio di problemi con la tua funzione di attivazione:
-
Usa
IF EXISTS (...) THEN
invece di contare tutte le occorrenze. Più veloce, più semplice. Vedi: -
Una funzione di attivazione
AFTER
INSERT OR UPDATE
può semplicemente restituireNULL
.RETURN NEW
è rilevante solo per i trigger chiamatiBEFORE
. Il manuale : -
Virgoletta singola sbilanciata.
-
Come @Pavel ha spiegato , non puoi controllare le transazioni da una funzione plpgsql. Qualsiasi eccezione non gestita forza il rollback automatico dell'intera transazione. Quindi, rimuovi semplicemente
EXCEPTION
blocco.
Il tuo ipotetico trigger riscritto:
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;
Un BEFORE
il grilletto ha più senso.
Ma a UNIQUE INDEX ON ("Room_Name", "Date")
farebbe lo stesso, in modo più efficiente. Quindi, qualsiasi riga in violazione genera un'eccezione di chiave duplicata ed esegue il rollback della transazione (a meno che non venga rilevata e gestita). Nel Postgres moderno puoi in alternativa saltare o deviare tale INSERT
tentativi con INSERT ... ON CONFLICT ...
. Vedi:
Utilizzo avanzato: